diff --git a/www/.gitignore b/www/.gitignore
new file mode 100644
index 00000000000..f59532259d2
--- /dev/null
+++ b/www/.gitignore
@@ -0,0 +1,35 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+yarn.lock
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# vercel
+.vercel
\ No newline at end of file
diff --git a/www/@types/environment.d.ts b/www/@types/environment.d.ts
new file mode 100644
index 00000000000..1a22007f9fc
--- /dev/null
+++ b/www/@types/environment.d.ts
@@ -0,0 +1,11 @@
+declare global {
+ namespace NodeJS {
+ interface ProcessEnv {
+ GA_PROPERTY_ID: string
+ }
+ }
+}
+
+// If this file has no import/export statements (i.e. is a script)
+// convert it into a module by adding an empty export statement.
+export {}
diff --git a/www/@types/remark-html.d.ts b/www/@types/remark-html.d.ts
new file mode 100644
index 00000000000..e1b76b54f7e
--- /dev/null
+++ b/www/@types/remark-html.d.ts
@@ -0,0 +1 @@
+declare module 'remark-html'
diff --git a/www/@types/typings.d.ts b/www/@types/typings.d.ts
new file mode 100644
index 00000000000..6568666452a
--- /dev/null
+++ b/www/@types/typings.d.ts
@@ -0,0 +1,4 @@
+declare module '*.json' {
+ const value: any
+ export default value
+}
diff --git a/www/README.md b/www/README.md
new file mode 100644
index 00000000000..010dd00a97e
--- /dev/null
+++ b/www/README.md
@@ -0,0 +1,31 @@
+# Supabase Docs
+
+## Overview
+
+This is a single repository for two different websites. Our documents were created with docusaurus and are stored in the web folder. Our beta website can be found in the www folder. This is a standard Next.js website.
+
+Install the [Vercel CLI](https://vercel.com/cli).
+
+You will need to run the marketing website and docs website separately. To learn how to run both websites, see the [Development Guide](../DEVELOPERS.md) for more information.
+
+```sh
+# step 1
+cd supabase
+
+# step 2
+cd www
+
+# step 3
+npm install
+npm run dev
+
+# visit website
+http://localhost:3000
+```
+
+In production, this setup is deployed as two different vercel websites (`docs` and `www`)
+
+## Known issues
+
+- Referencing resources in nested folders may not work for `web` (eg `/web/static/folder/nestedfolder/asset`) may not work.
+- Possibly need to prepend all images/assets in docs site with baseUrl.
diff --git a/www/_blog/2020-05-01-supabase-alpha-april-2020.mdx b/www/_blog/2020-05-01-supabase-alpha-april-2020.mdx
new file mode 100644
index 00000000000..1410cf9d5fa
--- /dev/null
+++ b/www/_blog/2020-05-01-supabase-alpha-april-2020.mdx
@@ -0,0 +1,63 @@
+---
+title: Supabase Alpha April 2020
+description: Two months of building
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+tags:
+ - supabase
+date: '06-01-2020'
+---
+
+Now in [Supabase](https://app.supabase.io):
+
+- Set up Postgres in less than 2 minutes
+- Auto-generated APIs! (they are a bit flaky, go easy)
+- Query your database directly from the dashboard
+- Analyze your queries and make them faster :rocket:
+
+
+
+## Important Notes
+
+1/ Supabase is NOT production ready. Have a play around and let us know what you think. We don't track ANYTHING (although we do store your github name and email). We'd like to keep it that way, so we rely on your direct feedback to steer our product roadmap.
+
+2/ We are free to use while we're in alpha thanks to the generosity of Digital Ocean's startup program. But the funds aren't unlimited - please shut down the database when you're done :pray:.
+
+3/ The database takes about 2 minutes to build. It's worth it, we promise. If you've ever wanted use Postgres, we're the easiest in the market.
+
+## Coming soon
+
+At Supabase, we're building some amazing tools that make Postgres as easy to use as Firebase. Some of the things we're working on:
+
+#### Simple interface
+
+Why are database interfaces so hard to use? The Supabase team has built products for 70-year-olds, so we're confident we can make something easier for developers:
+
+
+#### Connectors
+
+Send realtime database changes to other systems, like queues or webhooks (Slack notifications!):
+
+
+#### And more
+
+- ⚡ Realtime listeners! Subscribe to your database just like you would with Firebase.
+- 🤖 Instant RESTful APIs that update when you update your schema. Supabase introspects your schema and updates your API and documentation.
+- 📓 Auto-documentation for your APIs and Postgres schema. What's better than documentation? Documentation that you don't have to manually keep up to date.
+
+## Follow us
+
+Start using Supabase today: [app.supabase.io](https://app.supabase.io)
+
+Make sure to star us on github! [github.com/supabase/supabase](https://github.com/supabase/supabase)
diff --git a/www/_blog/2020-06-01-supabase-alpha-may-2020.mdx b/www/_blog/2020-06-01-supabase-alpha-may-2020.mdx
new file mode 100644
index 00000000000..bb008b72215
--- /dev/null
+++ b/www/_blog/2020-06-01-supabase-alpha-may-2020.mdx
@@ -0,0 +1,62 @@
+---
+title: Supabase Alpha May 2020
+description: Three months of building
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+tags:
+ - supabase
+date: '06-01-2020'
+---
+
+It has been a monster month at [Supabase](/) and we're back with a video update. It's a longer video this month because we have a couple of housekeeping items.
+
+
+
+
+
+## Housekeeping
+
+We got into Y Combinator :tada:. The cohort has just started and it's fully remote so it will be a unique experience, even by normal YC standards.
+
+Normally we wouldn't mention this until our official YC launch in September but the cat's out of the bag since @vira28 [posted about us on Hacker News](https://news.ycombinator.com/item?id=23319901).
+
+We've seen a huge response from the tech community. We're still 'very alpha' so the attention may have been better in September but everyone has been patient with the bugs and instability. It just goes to show: ship early and often because nobody knows when you might get picked up.
+
+## Updates
+
+OK now for the important part - as promised, we will continue to release our updates here in the DEV community first. Skip to 1m18s in the video if you just want to see what we've been up to.
+
+### Fresh UI
+
+We've revamped the UI to fit in some more features that we're building.
+
+
+
+### Table View
+
+This one is still very unstable, but we wanted to ship it anyway. It's a little hidden away so you'll have to hunt for it :). Give us a couple of months and we promise this will be as good as (better than?) Airtable.
+
+
+
+#### And more
+
+- ⚡ Realtime listeners! Subscribe to your database just like you would with Firebase.
+- 🤖 Instant RESTful APIs that update when you update your schema. Supabase introspects your schema and updates your API and documentation.
+- 📓 Auto-documentation for your APIs and Postgres schema. What's better than documentation? Documentation that you don't have to manually keep up to date.
+
+## Follow us
+
+Start using Supabase today: [app.supabase.io](https://app.supabase.io)
+
+Make sure to star us on github! [github.com/supabase/supabase](https://github.com/supabase/supabase)
diff --git a/www/_blog/2020-06-15-supabase-steve-chavez.mdx b/www/_blog/2020-06-15-supabase-steve-chavez.mdx
new file mode 100644
index 00000000000..99188683c3f
--- /dev/null
+++ b/www/_blog/2020-06-15-supabase-steve-chavez.mdx
@@ -0,0 +1,21 @@
+---
+title: Steve Chavez has joined Supabase
+description: Steve joins Supabase to help build Auth.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+tags:
+ - supabase
+ - hiring
+date: '06-15-2020'
+---
+
+This month we welcome [Steve Chavez](https://github.com/steve-chavez) to the team. Steve is a maintainer of PostgREST, one of the core tools which makes Supabase possible.
+
+
+
+Steve and I have been in contact since he [added one of my old blog posts](https://github.com/PostgREST/postgrest-docs/commit/3dde972d31519d3afc319015bce1dc0f73adeb8e#commitcomment-35312841) to the PostgREST docs. He has a rich history in open source and we're excited to have him in our team.
+
+Steve is helping us build one of our most demanded features - our Auth system. We will support him to build some exciting features which he has planned for PostgREST, including enhanced PostGIS support.
diff --git a/www/_blog/2020-07-01-supabase-alpha-june-2020.mdx b/www/_blog/2020-07-01-supabase-alpha-june-2020.mdx
new file mode 100644
index 00000000000..3020f6e07ef
--- /dev/null
+++ b/www/_blog/2020-07-01-supabase-alpha-june-2020.mdx
@@ -0,0 +1,101 @@
+---
+title: Supabase Alpha June 2020
+description: Four months of building
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+tags:
+ - supabase
+date: '07-01-2020'
+---
+
+We're now 4 months into building [Supabase](/), which means another major update. Here's a few things we think you'll love in this release.
+
+
+
+### 4 minute demo
+
+Watch a full demo:
+
+
+
+### View relational data
+
+We're sometimes asked how we will make Postgres as simple as Firebase, since Postgres is a relational database. This month we're making our first steps to prove that relational databases can be even easier to use than document stores. We're releasing an excel-like editing interface which can drill down into your relational data.
+
+
+
+### Manage JSON data
+
+Postgres is an amazing database, giving the flexibility of a document store with the power of a RDBMS. If you use `JSON` data in Postgres, then we want to make that easy too. Supabase detects when your column is `JSON` or `JSONB`, and provides an easy way to edit and view your data. More improvements coming soon for this feature!
+
+
+
+### Choose your region
+
+If you noticed a bit of latency on Supabase, it's because your projects were previously set up in Singapore. It was always our intention that you'd be able to choose your database region, and this month we've delivered it. In the next releases we'll even allow you to go multi-region, instantly replicating your database close to your customers.
+
+
+
+### Backups
+
+A guiding principle at Supabase is zero lock-in. So this month we are exposing your daily database backups on the dashboard, giving you a simple way to migrate off Supabase. We have a lot more to build in this space (`WAL-G!`), so watch this space.
+
+
+
+### Kaizen
+
+We have a number of small improvements:
+
+- Improved SQL editor - with better syntax highlighting
+- Improved API docs - with more code snippets
+- UX improvements - with a simplified and consistent UX
+
+### Hiring
+
+- This month we [welcome Steve Chavez to the team](/blog/2020/06/15/supabase-steve-chavez). Steve is a maintainer of PostgREST, one of the core tools which makes Supabase possible.
+- We're hiring a part-time designer or UX expert. See more [here](https://news.ycombinator.com/item?id=23708351).
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2020-07-09-postgresql-templates.mdx b/www/_blog/2020-07-09-postgresql-templates.mdx
new file mode 100644
index 00000000000..5c9b89db869
--- /dev/null
+++ b/www/_blog/2020-07-09-postgresql-templates.mdx
@@ -0,0 +1,89 @@
+---
+title: What are PostgreSQL Templates?
+description: What are PostgreSQL templates and what are they used for?
+author: angelico_de_los_reyes
+author_title: Supabase
+author_url: https://github.com/dragarcia
+author_image_url: https://avatars0.githubusercontent.com/u/26374889?s=400&u=f5e35e9b47a50fa2b4d8c4bb96babd921071bcf1&v=4
+authorURL: https://github.com/dragarcia
+tags:
+ - postgres
+date: '07-09-2020'
+---
+
+Whenever you create a new database in Postgres, you are actually [basing it off an already present database](https://www.postgresql.org/docs/current/manage-ag-templatedbs.html) in your cluster.
+
+
+
+This database, `template1`, and another, called `template0`, are standard system databases that exist in every newly created database cluster. Don't believe me? Why not quickly [spin up a database](/docs/postgres/server/about) and see it for yourself with this query:
+
+```sql
+SELECT * FROM pg_database;
+```
+
+In this post, we'll explore these template databases and see how we can make full use of their potential. We'll even look into creating a template database of our own.
+
+## template1
+
+By default, running:
+
+```sql
+CREATE DATABASE new_db_name;
+```
+
+simply copies everything from the database `template1`. We can modify this template database in any way: add a table, insert some data, create new extensions, or install procedural languages. Any of these actions would be propagated to subsequently created databases.
+
+This, however, is **not** advisable. Removing any one of these modifications would need you to manually uninstall or drop these changes from `template1`. You do have the option to drop and recreate the entire `template1` database altogether. This unfortunately comes at the risk of committing a mistake along the way, effectively breaking `CREATE DATABASE`. It would be better to leave `template1` alone and create a template database of your own.
+
+## Custom Template Databases
+
+To set an existing database as a template database:
+
+```sql
+ALTER DATABASE template_db_name WITH is_template TRUE;
+```
+
+Doing this allows any user or role with the `CREATEDB` privilege to utilize it as a template. If not, only superusers or owners of the database would be allowed to do so.
+
+To create a new database with this template:
+
+```sql
+CREATE DATABASE new_db_name TEMPLATE template_db_name;
+```
+
+### Advantages
+
+- With this, you can now have customized templates without the need to worry about polluting `template1`.
+- You can safely drop the entire custom template database without the risk of breaking `CREATE DATABASE`.
+- If you wish, you can create multiple template databases for various use cases.
+
+### Limitations
+
+- To properly create a database from a custom template database, there should be no other connections present. `CREATE DATABASE` immediately fails if any connections exist at the start of the query.
+- As such, if you are looking to replicate a database while maintaining your connections (eg. a production database), it would be more ideal to use the Postgres utility [pg_dump](https://www.postgresql.org/docs/12/app-pgdump.html).
+
+## template0
+
+`template0` contains the same data as `template1`. We could think of this template database as a fallback if anything irreversible happens to `template1`. As such, this template database should never be modified in any way as soon as the database cluster has been initialized. To create a database with `template0` as the template database:
+
+```sql
+CREATE DATABASE new_db_name TEMPLATE template0;
+```
+
+### Applications
+
+- If anything goes wrong with `template1`, It can be dropped and recreated with `template0` as the template database.
+- We can also create a clean database that does not contain any modifications present in `template1`. This would be useful when restoring from pg_dump. Any conflicts brought about by modifications not present in the dump are eliminated.
+- `template0` can be used to specify new encodings. As pointed out in this [article](https://hashrocket.com/blog/posts/exploring-the-default-postgres-template-databases#:~:text=we%20can't%20edit%20the%20locale%20or%20encoding%20of%20a%20database%20copied%20from%20template1), creating a new database with `template1` and new encodings would result in an error.
+
+```sql
+-- Will succeed
+CREATE DATABASE new_db_name TEMPLATE template0 ENCODING 'SQL_ASCII';
+
+-- Will return an error
+CREATE DATABASE new_db_name ENCODING 'SQL_ASCII';
+```
+
+## Conclusion
+
+To quickly sum things up, we found out that new databases are, by default, created from a template database called `template1`. `template1` can be modified in any way we please and the changes would be present in any database created afterward. We can also create custom template databases and base new databases from them instead. If things go awry, `template0` is always there to help.
diff --git a/www/_blog/2020-07-10-alpha-launch-postmortem.mdx b/www/_blog/2020-07-10-alpha-launch-postmortem.mdx
new file mode 100644
index 00000000000..357b923b3a7
--- /dev/null
+++ b/www/_blog/2020-07-10-alpha-launch-postmortem.mdx
@@ -0,0 +1,104 @@
+---
+title: Alpha Launch Postmortem
+description: Everything that went wrong with Supabase's launch
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+tags:
+ - supabase
+date: '07-10-2020'
+---
+
+On May 27 Supabase hit the [top of Hacker News](https://news.ycombinator.com/item?id=23319901) and stayed on the front page for more than 24 hours.
+
+
+
+Since then, Supabase has been featured on the [Stack Overflow podcast](https://stackoverflow.blog/2020/06/05/podcast-241-new-tools-for-new-times/), hit the [trending page](https://twitter.com/supabase/status/1268062559023685633) on GitHub, and scaled to over 1000 databases.
+
+Here is everything that went wrong along the way.
+
+## Quick stats - launch week
+
+Before we get into the details, here are some high-level numbers for the week following the launch.
+
+We had 30,000 new website visitors to [supabase.io](/):
+
+
+
+
+
+We had over 1400 signups in 7 days:
+
+
+GitHub stars rocketed for our two main repos, [supabase](https://github.com/supabase/supabase) and [realtime](https://github.com/supabase/realtime).
+
+
+## The good
+
+Here are the things that survived well.
+
+### Middleware: docker-compose up
+
+This was the most surprising survivor. Our middleware was served from a single Ubuntu server with 4 CPUs and 8GB of RAM. This server was running our middleware using `docker-compose up`:
+
+
+
+In case you're wondering why any sane company would use that in production, it's because we weren't planning to launch - the HackerNews post was created by an early GitHub follower, while we were alpha testing, and it was too scary to migrate the middleware while it was servicing the thundering herd. All Supabase projects use the same middleware stack (sans docker-compose), so I guess this counts as as a successful load test.
+
+We have since migrated our middleware to multiple ECS clusters, globally load-balanced using AWS's [Global Accelerator](https://aws.amazon.com/global-accelerator/).
+
+### Frontend: Netlify, Vercel, Auth0
+
+We serve our marketing site ([supabase.io](/)) from Netlify. It's a static-build [Docusaurus (v2)](https://v2.docusaurus.io/) site, so it had no problems (apart from one developer in Russia who couldn't access the site - it looks like some of Netlify's IP addresses are blocked there).
+
+We serve our app ([app.supabase.io](http://app.supabase.io)) using Vercel, and the login system uses Auth0. These were both rock-solid. Before the launch we noticed that Vercel was extremely slow on their free plan, and once we upgraded to their Pro Plan for multi-region deploys it solved performance issues. It looks like they are changing their plans again so buyer beware.
+
+## The Bad
+
+### Digital Ocean cloud limits
+
+In May we were using Digital Ocean to serve all of our customer databases. We hit the first server limit (400 servers) in the space of a few hours. They bumped our limit up to 1000 and we hit that again a few hours later.
+
+Digital Ocean were very responsive when we asked for increases, each time responding in 30 minutes or less.
+
+### Cloudflare cloud limits
+
+Each Supabase project gets a unique URL for their API and database. This is set up using Cloudflare's API. This was a seamless process until we hit the 1000-subdomain limit, at 4am in the morning. My cofounder was awake, managed to identify the problem early, and reached out to the support to increase the limit.
+
+Cloudflare support advised him to upgrade the account to increase the limit, but the upgrade could only be done by the owner (me). Unfortunately my phone was on silent, so for 3 hours our systems were down. Ideally any one of our team could have upgraded our account, but I imagine that Cloudflare have their reasons for this restriction.
+
+## The Ugly - migrating 1800 servers
+
+Let me start by saying that Digital Ocean have been great for getting up and running. The experience was simple to start with, but ended painfully.
+
+### Digital Ocean production errors
+
+The first sign of problems were the frequent production errors. This is a screenshot of emails from Digital ocean for the month of June.
+
+
+
+Each of these emails represents one or more servers that has a critical issue:
+
+> We have identified an issue on the physical machine hosting one or more of your Droplets. In the event that we are not able to perform a live migration of a Droplet, we will perform an offline migration during which the Droplet will be powered off and migrated offline during the window.
+
+Luckily we are in alpha, and our community has been extremely patient.
+
+### Credit limits
+
+Most of our frustration was due to their internal policy around credits program. We were generously granted $10,000 Digital Ocean credits in February through Stripe Atlas, and so they became our primary cloud provider.
+
+Digital Ocean have another (more generous) credits package for YC companies. Unfortunately when we applied for this we were told we weren't eligible because it was a "Partner switch" from Stripe to YC. This was frustrating because a "Partner switch" is completely arbitrary to us as a customer.
+
+Also we had conveniently just run out of credits. We don’t expect cloud providers to fund our inefficiencies, but we needed time to optimize our infrastructure after our surprise launch. We had assumed that the more generous credits package was guaranteed - an assumption which cost us several thousand dollars. After swift deliberation, we decided to migrate away from Digital Ocean.
+
+## Going Forward: AWS t3a
+
+In the past 3 weeks we have migrated 1800 servers over to AWS.
+
+We are on the AWS "Activate" program, which grants us $100,000 credits. Since Firebase has a very generous free-tier, and we want to be able to offer Supabase developers a similar experience, this is ultimately a huge benefit to our community.
+
+The AWS team were helpful, suggesting their new `t3a` instances. We're already seeing improvements, with database startup times almost halved from ~90s to ~50s. From our research, this is the fastest Postgres setup in the market.
+
+We will release a detailed write-up on these instances in the next few weeks. Sign up to our newsletter if you want to be notified when we release the post.
diff --git a/www/_blog/2020-07-17-postgresql-physical-logical-backups.mdx b/www/_blog/2020-07-17-postgresql-physical-logical-backups.mdx
new file mode 100644
index 00000000000..fd1e42c2191
--- /dev/null
+++ b/www/_blog/2020-07-17-postgresql-physical-logical-backups.mdx
@@ -0,0 +1,76 @@
+---
+title: Physical vs Logical Backups in PostgreSQL
+description: What are physical and logical backups in Postgres?
+author: angelico_de_los_reyes
+author_title: Supabase
+author_url: https://github.com/dragarcia
+author_image_url: https://avatars0.githubusercontent.com/u/26374889?s=400&u=f5e35e9b47a50fa2b4d8c4bb96babd921071bcf1&v=4
+authorURL: https://github.com/dragarcia
+tags:
+ - postgres
+date: '07-07-2020'
+---
+
+PostgreSQL backups can be categorized into two types: _logical_ and _physical_. This post briefly covers each type and discusses the situations where you would use either one.
+
+We'll cover some of the many tools you can use for Postgres backups in future posts.
+
+
+
+## Logical Backups
+
+This form of backup is typically achieved by [translating all the data into a set of SQL commands and writing it into a single file](https://www.postgresql.org/docs/current/backup-dump.html). This can then be fed to any database cluster to recreate everything. In your CLI, performing logical backups can be as easy as:
+
+```shell
+pg_dump db_name > file_name.sql
+```
+
+for a single database, and:
+
+```shell
+pg_dumpall > file_name.sql
+```
+
+for an entire database cluster. Both the [pg_dump](https://www.postgresql.org/docs/current/app-pgdump.html) and [pg_dumpall](https://www.postgresql.org/docs/current/app-pg-dumpall.html) utilities have their respective additional options for you to choose from and set up your desired logical backup setting. Recovering from them is comparably as simple:
+
+```shell
+psql -d db_name -f file_name.sql
+```
+
+### What is it good for?
+
+#### Simpler and quicker way of performing backups
+
+As shown above, a single command is enough to perform a logical backup and another to recover from it. As a novice with databases, this would be an ideal and non-intimidating ensure that your database is backed up at all times.
+
+#### Migration between different major versions of Postgres
+
+If you are planning to migrate to a different major version of Postgres (for example, from Postgres 11 to Postgres 12), logical backups via `pg_dumpall` would surely be your [tool of choice](https://www.postgresql.org/docs/current/upgrading.html). This is mainly because internal data storage formats may differ between major versions. This is the basis of physical backups, eliminating it as an option when upgrading. We'll go deeper into migrations and how to perform them in another post.
+
+#### Backing up a single specific database
+
+With `pg_dump`, you can constantly back up a single, targeted database.
+
+## Physical Backups
+
+Physical backups pertain to the actual set of files or file systems where your database data is stored. One option for physical backups involves [taking a snapshot](https://www.postgresql.org/docs/current/backup-file.html) of your data files by making a copy of them.
+
+### What is it good for?
+
+#### More ideal for larger databases
+
+As your database grows to the size of a few gigabytes, backing it up through physical backups is more ideal than through logical backups. As explained [here](https://devcenter.heroku.com/articles/heroku-postgres-data-safety-and-continuous-protection#the-performance-impact-of-logical-backups), over time, performing logical backups in large databases could lead to degraded performance for other queries. Given the long run time as well to successfully perform a logical backup on a large database, errors have a higher chance of occurring, making the eventual backup unusable.
+
+#### Achieving Point in Time Recovery
+
+Postgres also generates [Write Ahead Log](https://www.postgresql.org/docs/current/wal-intro.html) (WAL) files, which can be used together with a backed-up file system to [recover a database up to any chosen point in time](https://www.postgresql.org/docs/current/continuous-archiving.html). When disaster strikes, this is one of the best options for recreating your database up to the point right before the unfortunate happens. This greatly minimizes [Recovery Point Objective (RPO)](https://www.ibm.com/services/business-continuity/rpo) along the way. Even better, tools such as [WAL-G](https://github.com/wal-g/wal-g) are readily available to simplify the steps involved in setting this up.
+
+## Conclusion
+
+All in all, logical and physical backups are generated differently from one another. Neither has an advantage over the other. Depending on your needs, each brings unique uses to the table:
+
+| Logical | Physical |
+| :---------------------------------------------------------------- | :----------------------------------------------------------- |
+| Simpler way of getting started with backups. | Better way of handling backups for larger database clusters. |
+| Using it to migrate between different major versions of Postgres. | Using it for Point in Time Recovery. |
+| Having the option to back up a single database. | |
diff --git a/www/_blog/2020-08-02-continuous-postgresql-backup-walg.mdx b/www/_blog/2020-08-02-continuous-postgresql-backup-walg.mdx
new file mode 100644
index 00000000000..78be2e20eaa
--- /dev/null
+++ b/www/_blog/2020-08-02-continuous-postgresql-backup-walg.mdx
@@ -0,0 +1,187 @@
+---
+title: Continuous PostgreSQL Backups using WAL-G
+description: Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G.
+author: angelico_de_los_reyes
+author_title: Supabase
+author_url: https://github.com/dragarcia
+author_image_url: https://avatars0.githubusercontent.com/u/26374889?s=400&u=f5e35e9b47a50fa2b4d8c4bb96babd921071bcf1&v=4
+authorURL: https://github.com/dragarcia
+tags:
+ - postgres
+date: '08-02-2020'
+---
+
+Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G.
+
+
+
+## Introduction
+
+[WAL-G](https://github.com/wal-g/wal-g) is an [open-source continuous archiving tool](https://www.citusdata.com/blog/2017/08/18/introducing-wal-g-faster-restores-for-postgres/) used to easily set up and recover from [physical backups](/blog/2020/07/17/postgresql-physical-logical-backups) in Postgres. It mainly handles the storage and retrieval of physical backups and WAL archives to and from a chosen cloud storage provider. In this post, we will walk you through on how to effortlessly set up WAL-G for your database as well as guide you on what to do if and when disaster strikes.
+
+## Prerequisites
+
+For this tutorial, we will be using two instances running Postgres databases on [Ubuntu 18.04](https://releases.ubuntu.com/18.04/). One instance will act as your main database, the other is your recovery database. If you’re using another operating system some file paths may vary.
+
+### Installations
+
+Make sure the below packages are installed in your instances. Alternatively, you can spin up the [latest version](https://github.com/supabase/postgres/releases/tag/v0.13.0) of [Supabase Postgres](https://github.com/supabase/postgres) which would already have everything configured and installed, along with other [goodies](https://github.com/supabase/postgres#features). It is readily available in either the [AWS](https://aws.amazon.com/marketplace/pp/B08915TCJ2?qid=1595854723755&sr=0-1&ref_=srh_res_product_title) or [Digital Ocean](https://marketplace.digitalocean.com/apps/supabase-postgres) marketplaces and only takes [a few minutes](/docs/postgres/postgres-intro) to get running.
+
+#### Postgres 12
+
+A quick installation guide can be found [here](https://www.postgresql.org/download/linux/ubuntu/).
+
+#### envdir
+
+[envdir](http://manpages.ubuntu.com/manpages/bionic/man8/envdir.8.html) allows us to run other programs with a modified environment based on the files in the provided directory. This can be installed through the [daemontools](https://cr.yp.to/daemontools.html) package:
+
+```shell
+$ sudo apt-get install -y daemontools
+```
+
+#### WAL-G
+
+```shell
+$ wget https://github.com/wal-g/wal-g/releases/download/v0.2.15/wal-g.linux-amd64.tar.gz
+$ tar -zxvf wal-g.linux-amd64.tar.gz
+$ mv wal-g /usr/local/bin/
+```
+
+### AWS credentials and resources
+
+When storing backups, WAL-G has numerous [cloud storage provider options](https://github.com/wal-g/wal-g#configuration) for us to choose from. For this tutorial, we will be using AWS. Have the following prepared:
+
+- AWS Access & Secret keys.
+- An S3 bucket.
+
+## Setting it up
+
+### 1. Configure environment variables
+
+The directory `/etc/wal-g.d/env` is created and contains files that stores environment variables. It would later be used in WAL-G commands via envdir.
+
+```shell
+$ umask u=rwx,g=rx,o=
+$ mkdir -p /etc/wal-g.d/env
+$ echo 'secret-key-content' > /etc/wal-g.d/env/AWS_SECRET_ACCESS_KEY
+$ echo 'access-key' > /etc/wal-g.d/env/AWS_ACCESS_KEY_ID
+$ echo 's3://backup-bucket/project-directory' > /etc/wal-g.d/env/WALG_S3_PREFIX
+$ echo 'db password' > /etc/wal-g.d/env/PGPASSWORD
+$ chown -R root:postgres /etc/wal-g.d
+```
+
+### 2. Enable WAL archiving
+
+Here, we enable [WAL archiving](https://www.postgresql.org/docs/12/continuous-archiving.html) and instruct Postgres to store the archives in the specified S3 bucket via WAL-G.
+
+```shell
+$ echo "archive_mode = yes" >> /etc/postgresql/12/main/postgresql.conf
+$ echo "archive_command = 'envdir /etc/wal-g.d/env /usr/local/bin/wal-g wal-push %p'" >> /etc/postgresql/12/main/postgresql.conf
+$ echo "archive_timeout = 60" >> /etc/postgresql/12/main/postgresql.conf
+```
+
+### 3. Restart the database
+
+The database is restarted to let the changes in the configuration to take effect.
+
+```shell
+$ sudo /etc/init.d/postgresql restart
+```
+
+### 4. Create your first physical backup
+
+```shell
+$ sudo -su postgres envdir /etc/wal-g.d/env /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main
+```
+
+At this point, if you were to check the S3 path that you provided, the following two newly created and populated directories would be observed:
+
+
+
+From then on, subsequent physical backups would be found in the directory `basebackups_005` and any WAL archives would be sent to the directory `wal_005`.
+
+### 5. [Optional] Schedule regular physical backups
+
+A CRON job can then be set to schedule physical backups to be performed everyday:
+
+```shell
+$ echo "0 0 * * * postgres /usr/bin/envdir /etc/wal-g.d/env /usr/local/bin/wal-g backup-push /var/lib/postgresql/12/main" > /etc/cron.d/pg_backup
+```
+
+Here, the instance has been instructed to back up the database at the start of each day at midnight. By physically backing up your instance regularly, overall recovery time could be faster. Restoring from a physical backup from yesterday would lead to fewer WAL archive files to be replayed as compared to restoring from one from a month ago.
+
+---
+
+## Disaster strikes
+
+Something goes wrong with the database or instance. We will now use what available physical backups we have in the S3 bucket to recover and restore all of our data on to a new instance.
+
+### 1. Configure environment variables
+
+The configuration should be the **same** as the original instance. For recovery and restoration, we would not need the variable `PGPASSWORD`.
+
+```shell
+$ umask u=rwx,g=rx,o=
+$ mkdir -p /etc/wal-g.d/env
+$ echo 'secret-key-content' > /etc/wal-g.d/env/AWS_SECRET_ACCESS_KEY
+$ echo 'access-key' > /etc/wal-g.d/env/AWS_ACCESS_KEY_ID
+$ echo 's3://backup-bucket/project-directory' > /etc/wal-g.d/env/WALG_S3_PREFIX
+$ chown -R root:postgres /etc/wal-g.d
+```
+
+### 2. Stop the database
+
+```shell
+$ sudo /etc/init.d/postgresql stop
+```
+
+### 3. Switch to the user `postgres`
+
+```shell
+$ sudo -su postgres
+```
+
+### 4. Prepare the database for recovery
+
+#### Set restore_command
+
+Through [restore_command](https://www.postgresql.org/docs/12/continuous-archiving.html#:~:text=must%20specify%20is%20the%20restore_command,%20which%20tells%20PostgreSQL%20how%20to%20retrieve%20archived%20WAL%20file%20segments), we instruct Postgres to pull all WAL archives from our S3 bucket to use during recovery.
+
+```shell
+$ echo "restore_command = '/usr/bin/envdir /etc/wal-g.d/env /usr/local/bin/wal-g wal-fetch \"%f\" \"%p\" >> /tmp/wal.log 2>&1'" >> /etc/postgresql/12/main/postgresql.conf
+```
+
+#### [Optional] Achieve Point in Time Recovery (PITR)
+
+If we want to restore the database only up to a certain point in time (eg. right before the disaster), we can do so by setting both [recovery_target_time]() and [recovery_target_action](). Do note that the timezone would need to match that of the original instance. This is usually at the UTC (+00) timezone.
+
+```shell
+$ echo "recovery_target_time = '2020-07-27 01:23:00.000000+00'" >> /etc/postgresql/12/main/postgresql.conf
+$ echo "recovery_target_action = 'promote'" >> /etc/postgresql/12/main/postgresql.conf
+```
+
+### 5. Restore from physical backup
+
+The current data directory is deleted and is replaced with the latest version of the physical backup from the S3 bucket.
+
+```shell
+$ rm -rf /var/lib/postgresql/12/main
+$ envdir /etc/wal-g.d/env /usr/local/bin/wal-g backup-fetch /var/lib/postgresql/12/main LATEST
+```
+
+### 6. Create a `recovery.signal` file
+
+This file [instructs]() Postgres that the database should undergo recovery mode upon start.
+
+```shell
+$ touch /var/lib/postgresql/12/main/recovery.signal
+```
+
+### 7. Log out of `postgres` and start the database
+
+```shell
+$ exit
+$ sudo /etc/init.d/postgresql start
+```
+
+Once Postgres finishes starting up and completes recovery mode, all data or data up to the specified point in time would have been successfully restored on to the new instance. Disaster averted.
diff --git a/www/_blog/2020-08-02-supabase-alpha-july-2020.mdx b/www/_blog/2020-08-02-supabase-alpha-july-2020.mdx
new file mode 100644
index 00000000000..7bf68e11254
--- /dev/null
+++ b/www/_blog/2020-08-02-supabase-alpha-july-2020.mdx
@@ -0,0 +1,81 @@
+---
+title: Supabase Alpha July 2020
+description: Five months of building
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+tags:
+ - supabase
+date: '08-02-2020'
+---
+
+After 5 months of building, we're releasing one of our most anticipated features: Supabase Auth.
+
+
+
+### Quick Demo
+
+Watch a full demo:
+
+
+
+### Auth
+
+This month, we're ecstatic to announce a feature we think you'll love: Supabase Auth. It's too big to fit into a monthly update so look out for a full update in the next few days.
+
+We want to make it easy to get started adding Auth to your app, so we've released a [simple example and a video tutorial](https://dev.to/supabase/create-a-slack-clone-with-next-js-and-supabase-3lhd) which shows you how to implement a basic auth system using PostgreSQL's Row Level Security.
+
+### Table Editor
+
+We've made some massive improvements to our Table Editor that we're excited to share.
+
+#### Relationship drill down
+
+Last month we made it easy to drill into your table relationships. This month, we make it possible to drill multiple levels deep.
+
+
+
+
+
+#### Add, delete, and download rows
+
+We're making it easier to manipulate your data. Next month, you'll be able to add and remove columns directly from the Table view.
+
+
+
+
+
+### New Postgres Extensions
+
+If you launch a new Supabase project, you'll have access to several new Postgres extensions:
+
+- [pgsql-http](https://github.com/pramsey/pgsql-http): HTTP client for PostgreSQL, retrieve a web page from inside the database.
+- [pgjwt](https://github.com/michelp/pgjwt): PostgreSQL implementation of JSON Web Tokens
+- [plpgsql_check](https://github.com/okbob/plpgsql_check): a linter tool for language PL/pgSQL
+- [pljava](https://github.com/tada/pljava): write Java in your stored procedures, triggers, and functions
+
+### Kaizen
+
+We have a number of small improvements:
+
+- Added Auth documentation to the auto-generated docs in each project
+- Added a new `or` filter [to the client library](/docs/library/get#or)
+- Table View now remembers which tabs you had open.
+- We have [released](https://github.com/supabase/postgres-meta/releases) a lot of new functionality to [postgres-meta](https://github.com/supabase/postgres-meta), a server for for managing Postgres internals via a REST interface.
+- Performance: the "flash of black" which was appearing on page transition is now gone
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2020-08-05-supabase-auth.mdx b/www/_blog/2020-08-05-supabase-auth.mdx
new file mode 100644
index 00000000000..c38e1cab120
--- /dev/null
+++ b/www/_blog/2020-08-05-supabase-auth.mdx
@@ -0,0 +1,93 @@
+---
+title: Supabase Auth
+description: Authenticate and authorize your users with Supabase Auth
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+image: /docs/img/supabase-auth-cover.png
+tags:
+ - supabase
+date: '08-05-2020'
+---
+
+Supabase is an open source Firebase alternative. We are building the features of Firebase using scalable, open source products.
+
+Two months ago a developer discovered Supabase and (unexpectedly) [launched us on Hacker News](https://news.ycombinator.com/item?id=23319901). Although we had completed only 3 months of development the community support was both incredible and humbling.
+
+
+
+
+
+Developers were obviously excited about the prospect of an open source Firebase alternative, but the comments were dominated by one emphatic feature request: Auth.
+
+> " _Just FYI, making a good auth solution in Supabase will instantly make me a customer._ "@pdimitar
+
+> " _For me the MVP, before I could use it for my commercial projects, would be: DB+auth. At that point, I could switch - and probably would._ "@julianeon
+
+> " _This looks great, however at first peek it doesn't mention anything about auth. Do you have any plans for that? For me this is the topic I most want to just delegate to the service._ "@2mol
+
+So we got to work, and today we're ecstatic to launch Supabase Auth. Let's dig into some of the features of the Auth system.
+
+## Supabase Auth
+
+Supabase Auth provides all the backend services you need to authenticate and authorize your users.
+
+### User management
+
+Supabase makes it simple to onboard your users with our new `supabase.auth.signUp()` and `supabase.auth.signIn()` [functions](/docs/guides/auth).
+
+
+
+
+
+### Row Level Security
+
+Authentication only gets you so far. When you need granular authorization rules, nothing beats PostgreSQL's [Row Level Security](https://www.postgresql.org/docs/current/ddl-rowsecurity.html). Supabase makes it simple to turn RLS on and off.
+
+
+
+
+
+### Policies
+
+[Policies](https://www.postgresql.org/docs/current/sql-createpolicy.html) are PostgreSQL's rule engine. They are incredibly powerful and flexible, allowing you to write complex SQL rules which fit your unique business needs.
+
+
+
+
+
+With policies, your database becomes the rules engine. Instead of repetitively filtering your queries, like this ...
+
+```js
+const loggedInUserId = 'd0714948'
+let user = await supabase.from('users').select('user_id, name').eq('user_id', loggedInUserId)\n
+// Returns { id: 'd0714948', name: 'Jane'
+```
+
+... you can simply define a rule on your database table, `auth.uid() = user_id`, and your request will return the rows which pass the rule, even when you remove the filter from your middleware:
+
+```js
+let user = await supabase.from('users').select('user_id, name')\n
+// Still returns { id: 'd0714948', name: 'Jane' }
+```
+
+### Open source
+
+Building an open source Firebase alternative is difficult task, made possible by an amazing suite of OSS tools that have forged the way for Supabase. We spent many weeks building Auth POC's with existing OSS tools. Notable mentions go to RedHat's [KeyCloak](https://www.keycloak.org/), and Ory's [Kratos](https://github.com/ory/kratos).
+
+Ultimately we landed on a system which utilises three amazing open source products:
+
+- Authorization: [PostgreSQL](https://www.postgresql.org/) and [PostgREST](http://postgrest.org/en/v7.0.0/auth.html).
+- Authentication: Netlify's [GoTrue](https://github.com/netlify/gotrue) server, which we forked and will continue to contribute to.
+
+### Next steps
+
+Supabase has a culture of shipping early and often. Our Auth release is another example of this, and we still have a lot of work to do. Next month we have more Auth features planned, including custom email templates and 3rd-party OAuth providers. We also plan to simplify the Policy interface, enabling non-technical users to get started with one of PostgreSQL's best features.
+
+### Get started
+
+Supabase Auth is ready for you to start using today, free of charge: [app.supabase.io](https://app.supabase.io)
+
+To see the full power of our auth system, watch [this demo](https://youtu.be/2oqIZW5S-lQ) where I deploy a secure, real-time slack clone to Vercel in less than 3 minutes.
diff --git a/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx b/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx
new file mode 100644
index 00000000000..ae862f956fb
--- /dev/null
+++ b/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx
@@ -0,0 +1,90 @@
+---
+title: Supabase Alpha August 2020
+description: Six months of building
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+tags:
+ - supabase
+date: '09-03-2020'
+---
+
+We're 6 months into building our hosted database platform and we've made some major improvements to our auth system and table view.
+
+
+
+### Quick Demo
+
+Watch a full demo:
+
+
+
+### Easily create tables
+
+Set up tables and columns directly from the table view.
+
+
+
+
+
+### Invite your team
+
+You can now invite team members to your organisation.
+
+
+
+
+
+### Auth: Email Confirmations
+
+You can now enable Email Confirmations for new users. This can be toggled on or off and the template for this email can be edited via the dashboard.
+
+
+
+
+
+### TypeScript support
+
+The biggest communty contribution to date, [@thorwebdev](https://twitter.com/thorwebdev) added TypeScript support to Supabase. He even [live streamed the process](https://twitter.com/thorwebdev/status/1292722189788016641).
+
+
+
+### Kaizen
+
+We have a number of small improvements:
+
+- supabase-js now has [UMD support](https://github.com/supabase/supabase/pull/156)
+- We significantly [improved our docs](/docs). Try out the new search!
+- All of our awesome sponsors are now listed [on our OSS page](/docs/oss).
+
+### From the community
+
+The release of Auth last month accelerated our community growth, based on [Orbit Levels.](https://github.com/orbit-love/orbit-model)
+
+
+
+- We received our first enterprise sponsor. Thanks to [@briannekimmel](https://twitter.com/briannekimmel) from [@WorkLifeVC](https://twitter.com/WorkLifeVC) for becoming an [Enterprise Sponsor](https://github.com/sponsors/supabase).
+- [@amorriscode](https://github.com/amorriscode) added Redwood support! [[Pull Request](https://github.com/redwoodjs/redwood/pull/1033)]
+- [@swyx](https://twitter.com/swyx) trying out Supabase with Color Search Engine with Supabase [[Live Stream](https://twitter.com/swyx/status/1300538001508896768)]
+- Python Support: [@lqmanh](https://github.com/lqmanh) has agreed to lead the python support. He's already deployed [postgrest-py](https://github.com/supabase/postgrest-py) which is the first step towards a functioning supabase-py client lib.
+- [@phamhieu](https://github.com/phamhieu) built a [Live Map Tracker](https://github.com/phamhieu/supabase-realtime-map-v2) App using Supabase + Leafletjs
+
+### Coming next
+
+Our focus now is to move from Alpha to Beta. This involves stabilising our Auth API, improving dashboard performance, and benchmarking all of our systems. This could take more than one month, as we have a number of company-related activities to wrap up ([we just finished YC](https://techcrunch.com/2020/08/25/here-are-the-94-companies-from-y-combinators-summer-2020-demo-day-2/)!).
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2020-09-11-supabase-hacktoberfest-2020.mdx b/www/_blog/2020-09-11-supabase-hacktoberfest-2020.mdx
new file mode 100644
index 00000000000..134608f899f
--- /dev/null
+++ b/www/_blog/2020-09-11-supabase-hacktoberfest-2020.mdx
@@ -0,0 +1,74 @@
+---
+title: Supabase Hacktoberfest 2020
+description: Join us for a celebration of open source software and learn how to contribute to Supabase.
+author: thor_schaeff
+author_title: Supabase community contributor
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+image: hacktoberfest.png
+tags:
+ - supabase
+ - hacktoberfest
+date: '09-11-2020'
+---
+
+October is looming, and for open source communities and contributors this means one thing: [Hacktoberfest](https://hacktoberfest.digitalocean.com/).
+
+
+
+## What is Hacktoberfest?
+
+Hacktoberfest is a time to contribute to open source, improve your skills, and build greater technology in the process. Last year during Hacktoberfest 483,127 pull requests were opened and 61,871 people completed the challenge.
+
+To do our part, Supabase has planned a couple of events and activities throughout Hacktober, and we'd love for you to join us!
+
+## How do I get started?
+
+It's simple, just start contributing to **any** open source project. If you've never contributed to open source, don't worry! Here are some resources to get you started:
+
+- [How to write your first pull request](https://pages.news.digitalocean.com/n/Y0VKC0qX000hY0236IE0qDn)
+- [How to create a good commit message](https://pages.news.digitalocean.com/n/wIYDXKVE600000nr20h3r0C)
+- [Beginner resources for first-timers](https://pages.news.digitalocean.com/n/kE2b60X00B003IVhYn0cK0D)
+- [Hacktoberfest’s quality standards](https://hacktoberfest.digitalocean.com/details/#quality)
+
+## Supabase events
+
+Tune in to our online events.
+
+### GitHub Open Source Friday live stream
+
+- What: [@kiwicopple](https://github.com/kiwicopple) chats with the GitHub team about open source.
+- When: Fri, Sep 25, 11:00 AM (Thu, Sep 24, 8:00 PM PT)
+- Where: [GitHub Twitch channel](https://www.twitch.tv/github)
+
+### Supabase Hacktoberfest Online Meetup
+
+- What: Join us to learn more about Supabase and how to contribute during Hacktoberfest.
+- When: Fri, Oct 2, 9:00 AM SG time (Thu, Oct 1, 6:00 PM PT)
+- Where: [YouTube](https://youtu.be/3_xRLTjvEiE) | [Please RSVP here](https://organize.mlh.io/participants/events/4291-hacktoberfest-supabase-meetup)
+
+## Contribute to Supabase and win a Hacktoberfest T-Shirt
+
+We've created a [GitHub project board](https://github.com/orgs/supabase/projects/5) to keep track of what's happening and can enjoy collaborating and hacking together 🥳
+
+You can contribute to one of the existing `hacktoberfest` issue, or you can grab one of the ideas from the notes in the project board and [open a new issue](https://github.com/supabase/supabase/issues/choose) for it. Make sure to tag the newly created issue with the `hacktoberfest` label. This will be important for you to have a chance at getting the limited edition Hacktoberfest T-Shirt. See the [participation rules](https://hacktoberfest.digitalocean.com/details/#rules) for more details.
+
+### I'm a Developer
+
+Awesome, we've got a selection of small and larger [engineering tasks](https://github.com/orgs/supabase/projects/5#column-10773067). From creating examples for Blitz.js and Redwood.js to Postgres templates for various use cases.
+
+### I'm a Designer
+
+Nice, we would love [your help](https://github.com/orgs/supabase/projects/5#column-10773073) with UX improvements, illustrations, loading pages, or [lottie animations](https://lottiefiles.com/).
+
+### I'm a Writer
+
+Yay, we'd love your help with [improving and adding docs](https://github.com/orgs/supabase/projects/5#column-10773075)!
+
+## Happy hacking
+
+We'd love to see you at one of our events and have you contribute to Supabase throughout Hacktoberfest! See you on the interweb 🙂
+
+## Questions / ideas / feedback?
+
+We'd love to hear it, just [tweet at us](https://twitter.com/supabase), or [open an issue](https://github.com/supabase/supabase/issues/choose).
diff --git a/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx b/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx
new file mode 100644
index 00000000000..c55f044613e
--- /dev/null
+++ b/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx
@@ -0,0 +1,98 @@
+---
+title: Supabase Alpha September 2020
+description: Seven months of building.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+image: supabase-september-2020.png
+tags:
+ - supabase
+date: '10-03-2020'
+---
+
+We're now 7 months into building Supabase. This update is a big one!
+
+
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+### Third-party logins
+
+We've released OAuth logins! You can now enable third-party logins on your app for Bitbucket, GitHub, GitLab, or Google.
+
+
+
+### Clone tables
+
+You can duplicate your tables, just like you would inside a spreadsheet.
+
+
+
+
+
+### Enable and disable extensions
+
+Extensions are easier to use. You can enable Postgres extensions with the click of a button.
+
+
+
+
+
+### Save your favorite queries
+
+The SQL editor now stores your query history in your browser. You can also save your favorite queries to run later!
+
+
+
+
+
+### GitHub Discussions
+
+Supabase was given access to [GitHub Discussions](https://github.com/supabase/supabase/discussions)! This is the place for you to ask questions or show off what you've built with Supabase.
+
+
+
+### Kaizen
+
+- Our dashboard now uses [Next.js automatic static optimization](https://nextjs.org/docs/advanced-features/automatic-static-optimization) - so it should be noticeably more responsive.
+- We created an Isomorphic [`gotrue-js`](https://github.com/supabase/gotrue-js/) TypeScript library for interacting with Netlify's [GoTrue server](https://github.com/netlify/gotrue). This will soon be bundled into `supabase-js`
+- We migrated our [`postgrest-js`](https://github.com/supabase/postgrest-js/) library to TypeScript, and it will soon be bundled into `supabase-js`
+
+### From the community
+
+- @kiwicopple [appeared on GitHub's Twitch channel](https://www.twitch.tv/github/video/751281550) for Open Source Friday with @MishManners
+- @kiwicopple [discussed pricing for Open Source](https://www.youtube.com/watch?v=PLhI6cccBQA) with GitLab CEO Sid Sijbrandij
+- @Thorwebdev [presented Supabase Auth at the SingaporeJS](https://www.youtube.com/watch?v=LUMxJ4w-MUU) meetup
+- [realtime-py](https://github.com/lionellloh/realtime-py) is underway thanks to [@lionellloh](https://github.com/lionellloh) & [@j0](https://github.com/j0)
+- [postgrest-dart](https://github.com/supabase/postgrest-dart) was shipped by [@phamhieu](https://github.com/phamhieu)
+- [postgrest-csharp](https://github.com/supabase/postgrest-csharp) is being implemented by [@acupofjose](https://github.com/acupofjose)
+
+### Hacktoberfest
+
+There's been [plenty of drama](https://hacktoberfest.digitalocean.com/hacktoberfest-update) during Hacktoberfest, but Supabase is committed to helping new contributors get started with open source. We've already seen a lot of issues closed by new members to our community and first-time contributors. If you're looking for ways to get involved, read our Hacktoberfest [blog post](/blog/2020/09/11/supabase-hacktoberfest-2020), check our [live stream](https://www.youtube.com/watch?v=3_xRLTjvEiE&t=60s), and then dive into our [project board](https://github.com/orgs/supabase/projects/5).
+
+
+
+### Coming next
+
+Our focus now is to move from Alpha to Beta and we'll be improving stability, reliability, and performance. We've created a [Benchmarks](https://github.com/supabase/benchmarks/) repository, where we'll be measuring the performance of all the open source tools we use.
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2020-10-30-improved-dx.mdx b/www/_blog/2020-10-30-improved-dx.mdx
new file mode 100644
index 00000000000..11e80d9fd31
--- /dev/null
+++ b/www/_blog/2020-10-30-improved-dx.mdx
@@ -0,0 +1,119 @@
+---
+title: Supabase.js 1.0
+description: We're releasing a new version of our Supabase client with some awesome new improvements.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+image: supabase-js-1-0.png
+tags:
+ - supabase
+date: '10-30-2020'
+---
+
+Today we're releasing [supabase-js](https://github.com/supabase/supabase-js) version 1.0, and it comes with some major Developer Experience improvements.
+
+
+
+### New Docs
+
+Before digging into the improvements, we're excited to point out our new [developer docs](/docs/reference/javascript/supabase-client). While they're still a work in progress, here are some things we think you'll like:
+
+- The [Reference Docs](/docs/reference/javascript/supabase-client) are auto-generated from our TypeScript definitions and then enriched with examples. This forces us to document our code and makes it easier to keep everything in sync.
+- We added placeholders for the other languages that the community is developing. They have already started with Python, C#, Dart, Rust, and Swift. Expect to see the docs filling up soon!
+- We've added sections for all of the open source tools we use, including [Postgres](/docs/postgres/server/about), [PostgREST](/docs/postgrest/server/about), [GoTrue](/docs/gotrue/server/about), and [Realtime](/docs/realtime/server/about). We'll be filling these with lots of valuable information including self-hosting, benchmarks, and simple guides.
+
+### Errors are returned, not thrown
+
+We attribute this improvement to community feedback. This has significantly improved the developer experience.
+
+Previously we would throw errors:
+
+```js
+try {
+ const { body } = supabase.from('todos').select('*')
+} catch (error) {
+ console.log(error)
+}
+```
+
+And now we simply return them:
+
+```js
+const { data, error } = supabase.from('todos').select('*')
+if (error) console.log(error)\n
+// else, carry on ..
+```
+
+After testing this for a while we're very happy with this pattern. Errors are handled next to the offending function. Of course you can always rethrow the error if that's your preference.
+
+### We created `gotrue-js`
+
+Our goal for `supabase-js` is to tie together many sub-libraries. Each sub-library is a standalone implementation for a single external system. This is one of the ways we support existing open source tools.
+
+To maintain this philosophy, we created [`gotrue-js`](https://github.com/supabase/gotrue-js), a library for Netlify's GoTrue auth server. This libary includes a number of new additions, including third-party logins.
+
+Previously:
+
+```js
+const {
+ body: { user },
+} = await supabase.auth.signup('someone@email.com', 'password')
+```
+
+Now:
+
+```js
+const { user, error } = await supabase.auth.signUp({
+ email: 'someone@email.com',
+ password: 'password',
+})
+```
+
+### Enhancements and fixes
+
+- Native TypeScript. All of our libraries are now natively built with TypeScript: [`supabase-js`](https://github.com/supabase/supabase-js), [`postgrest-js`](https://github.com/supabase/postgrest-js), [`gotrue-js`](https://github.com/supabase/gotrue-js), and [`realtime-js`](https://github.com/supabase/realtime-js).
+- Better realtime scalability: we only generate one socket connection per Supabase client. Previously we would create a connection for every subscription.
+- We've added support for OAuth providers.
+- 60% of minor bugs outstanding for `supabase-js` have been [solved](https://github.com/supabase/supabase-js/pull/50).
+- You can use `select()` instead of `select(*)`
+
+### Breaking changes
+
+We've bumped the major version because there are a number of breaking changes. We've detailed these in the [release notes](https://github.com/supabase/supabase-js/releases/tag/v1.0.1), but here are a few to be aware of:
+
+- `signup()` is now `signUp()` and `email` / `password` is passed as an object
+- `logout()` is now `signOut()`
+- `login()` is now `signIn()`
+- `ova()` and `ovr()` are now just `ov()`
+- `body` is now `data`
+
+Previously:
+
+```js
+const { body } = supabase.from('todos').select('*')
+```
+
+Now:
+
+```js
+const { data } = supabase.from('todos').select()
+```
+
+### Upgrading
+
+We have documented all of the changes in the [release notes](https://github.com/supabase/supabase-js/releases/tag/v1.0.1).
+
+To summarise the steps:
+
+1. Install the new version: `npm install @supabase/supabase-js@latest`
+2. Update all your `body` constants to `data`
+3. Update all your `supabase.auth` functions with the new [Auth interface](/docs/reference/javascript/auth-signup)
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx b/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx
new file mode 100644
index 00000000000..7539b23302e
--- /dev/null
+++ b/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx
@@ -0,0 +1,86 @@
+---
+title: Supabase Alpha October 2020
+description: Eight months of building.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+image: supabase-october-2020.png
+tags:
+ - supabase
+date: '11-02-2020'
+---
+
+We're now 8 months into building Supabase. We're focused on performance, stability, and reliability but that hasn't prevented us from shipping some great features.
+
+
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+### Supabase.js 1.0
+
+In the lead-up to our Beta launch, we've [released](/blog/2020/10/30/improved-dx) `supabase-js` version 1.0 and it comes with some major Developer Experience improvements. We received a lot of feedback from the community and we've incorporated it into our client libraries for our 1.0 release.
+
+Check out the [blog post](/blog/2020/10/30/improved-dx) to learn more.
+
+### More powerful SQL Editor
+
+Although it was only intended to be a temporary feature, the SQL Editor has become one of the most useful features of Supabase. This month we decided to make give it some attention, adding Tabs and making it full-screen. This is the first of many updates, we've got some exciting things planned for the SQL Editor.
+
+
+
+### Key commands for Power Users
+
+For the heavy table editor users, we've gone ahead and added a bunch of key commands and keyboard shortcuts so you can zip around and manipulate your tables faster than ever.
+
+
+
+### Magic Links
+
+One of the most requested Auth features was the ability to send magic links that your users can use to log in. You can use this with new or existing users, and alongside passwords or stand alone.
+
+
+
+### Kaizen
+
+- We have new and improved [docs](/docs/reference/javascript/supabase-client).
+- We converted [realtime-js](https://github.com/supabase/realtime-js/) to TypeScript.
+- Dashboard Performance: we heavily optimised our dashboard routes.
+- With the help of the community, we [closed a lot of issues](https://github.com/orgs/supabase/projects/5) during Hacktoberfest.
+- We have started [benchmarking](https://github.com/supabase/benchmarks) all the open source tools we use. We'll publish the results this month.
+
+### Community
+
+We had a crazy month during Hacktoberfest. In case you missed it, here are some of the highlights:
+
+- [@kiwicopple](https://twitter.com/kiwicopple) chatted to Jeff on the [Software Engineering Daily podcast](https://softwareengineeringdaily.com/2020/10/15/supabase-open-source-firebase-with-paul-copplestone/).
+- [Tezos](https://twitter.com/TezosBakingBad/status/1318212875035512835) started using our PostgREST libraries for their blockchain API: [https://pro.tzkt.io/](https://pro.tzkt.io/)
+- Supabase hosted a [Hacktoberfest meetup](https://www.youtube.com/watch?v=3_xRLTjvEiE).
+- [@kiwicopple](https://twitter.com/kiwicopple) appeared on the [Open Sauced channel](https://www.youtube.com/watch?v=PHmiWXDx9-w) with [@bdougieYO](https://twitter.com/bdougieYO)
+- [@thorwebdev](https://twitter.com/thorwebdev) shows the [Engineers.sg](http://engineers.sg) group how to [build a realtime Slack clone](https://engineers.sg/video/building-a-slack-clone-with-authentication-and-realtime-data-syncing-using-supabase-io-singaporejs--4119) with Supabase
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or [follow us on Twitter](https://twitter.com/supabase).
+
+### Coming next
+
+Our focus is still moving from Alpha to Beta and we'll be improving stability, reliability, and performance. Our Supabase.js 1.0 launch was part of that, and we've created a [Benchmarks](https://github.com/supabase/benchmarks/) repository where we'll be measuring the performance of all the open source tools we use.
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2020-11-18-postgresql-views.mdx b/www/_blog/2020-11-18-postgresql-views.mdx
new file mode 100644
index 00000000000..af57c6e40bb
--- /dev/null
+++ b/www/_blog/2020-11-18-postgresql-views.mdx
@@ -0,0 +1,184 @@
+---
+title: Postgres Views
+description: Creating and using a view in PostgreSQL.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/dragarcia
+author_image_url: https://avatars0.githubusercontent.com/u/26374889?s=400&u=f5e35e9b47a50fa2b4d8c4bb96babd921071bcf1&v=4
+authorURL: https://github.com/dragarcia
+image: postgres-views.png
+tags:
+ - postgres
+date: '11-18-2020'
+---
+
+A quick summary of Postgres views, materialized views, and why you should use them.
+
+
+
+### What is a View?
+
+A [view](https://www.postgresql.org/docs/12/sql-createview.html) is a convenient shortcut to a query. Creating a view does not involve new tables or data. When run, an underlying query is executed, returning its results to the user.
+
+#### Basic Example
+
+Say we have the following tables from a database of a university:
+
+**students**
+
+| id | name | type |
+| --- | ---- | ------------- |
+| 1 | Arun | undergraduate |
+| 2 | Zack | graduate |
+| 3 | Joy | graduate |
+
+**courses**
+
+| id | title | code |
+| --- | ------------------------ | ------- |
+| 1 | Introduction to Postgres | PG101 |
+| 2 | Authentication Theories | AUTH205 |
+| 3 | Fundamentals of Supabase | SUP412 |
+
+**grades**
+
+| id | student_id | course_id | result |
+| --- | ---------- | --------- | ------ |
+| 1 | 1 | 1 | B+ |
+| 2 | 1 | 3 | A+ |
+| 3 | 2 | 2 | A |
+| 4 | 3 | 1 | A- |
+| 5 | 3 | 2 | A |
+| 6 | 3 | 3 | B- |
+
+Creating a view consisting of all the three tables will look like this:
+
+```sql
+create view transcripts as
+ select
+ students.name,
+ students.type,
+ courses.title,
+ courses.code,
+ grades.result
+ from grades
+ left join students on grades.student_id = students.id
+ left join courses on grades.course_id = courses.id;
+```
+
+Once done, we can now access the underlying query with:
+
+```sql
+select * from transcripts;
+```
+
+For additional parameters or options, refer [here](https://www.postgresql.org/docs/12/sql-createview.html#:~:text=parameters).
+
+### Why should we use Views?
+
+Views provide the several benefits:
+
+- Simplicity
+- Consistency
+- Logical Organization
+- Security
+
+#### Simplicity
+
+As a query becomes complex it becomes a hassle to call it. Especially when we run it at regularly. In the example above, instead of repeatedly running:
+
+```sql
+select
+ students.name,
+ students.type,
+ courses.title,
+ courses.code,
+ grades.result
+from grades
+left join students on grades.student_id = students.id
+left join courses on grades.course_id = courses.id;
+```
+
+We can run this instead:
+
+```sql
+select * from transcripts;
+```
+
+Additionally, a view behaves like a typical table. We can safely use it in table `JOIN`s or even create new views using existing views.
+
+#### Consistency
+
+Views ensure that the likelihood of mistakes decreases when repeatedly executing a query. In our example above, we may decide that we want to exclude the course _Introduction to Postgres_. The query would become:
+
+```sql
+select
+ students.name,
+ students.type,
+ courses.title,
+ courses.code,
+ grades.result
+from grades
+ left join students on grades.student_id = students.id
+ left join courses on grades.course_id = courses.id
+where courses.code != 'PG101';
+```
+
+Without a view, we would need to go into every dependent query to add the new rule. This would increase in the likelihood of errors and inconsistencies, as well as introducing a lot of effort for a developer. With views, we can alter just the underlying query in the view **transcripts**. The change will be applied to all applications using this view.
+
+#### Logical Organization
+
+With views, we can give our query a name. This is extremely useful for teams working with the same database. Instead of guessing what a query is supposed to do, a well-named view can easily explain it. For example, by looking at the name of the view **transcripts**, we can infer that the underlying query might involve the **students**, **courses**, and **grades** tables.
+
+#### Security
+
+Views can restrict the amount and type of data presented to a user. Instead of allowing a user direct access to a set of tables, we provide them a view instead. We can prevent them from reading sensitive columns by excluding them from the underlying query.
+
+### What is a Materialized View?
+
+A [materialized view](https://www.postgresql.org/docs/12/rules-materializedviews.html) is a form of view but with the added feature of physically storing the results. In subsequent reads of a materialized view, the time taken to return its results would be much faster than a conventional view. This is because the data is readily available for a materialized view while the conventional view executes the underlying query each time it is called.
+
+#### Basic Example
+
+Using our example above, a materialized view can be created like this:
+
+```sql
+create materialized view transcripts as
+ select
+ students.name,
+ students.type,
+ courses.title,
+ courses.code,
+ grades.result
+ from grades
+ left join students on grades.student_id = students.id
+ left join courses on grades.course_id = courses.id;
+```
+
+Reading from the materialized view is the same as a conventional view:
+
+```sql
+select * from transcripts;
+```
+
+For additional parameters or options, refer [here](https://www.postgresql.org/docs/12/sql-creatematerializedview.html#:~:text=parameters).
+
+#### Refreshing
+
+Unfortunately, there is a trade-off - data in materialized views are not always up to date. We need to refresh it regularly to prevent the data from becoming too stale. To do so:
+
+```sql
+refresh materialized view transcripts;
+```
+
+It's up to you how regularly refresh your materialized views, and it's probably different for each view depending on its use-case.
+
+### Materialized views vs Conventional views
+
+Materialized views are useful when execution times for queries or views become unbearable or exceed the service level agreements of a business. These could likely occur in views or queries involving multiple tables and millions of rows. When using such a view, however, there should be tolerance towards data being outdated. Some use-cases for materialized views are internal dashboards and analytics.
+
+Creating a materialized view is not a solution to inefficient queries. You should always seek to optimize a slow running query even if you are implementing a materialized view.
+
+### Conclusion
+
+Postgres views and materialized views are a great way to organize and view results from commonly used queries. Although similar to one another, each has its purpose. Views simplify the process of running queries. Materialized views are usually faster at returning results, with the trade-off of having stale data.
diff --git a/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx b/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx
new file mode 100644
index 00000000000..8dc38f276b5
--- /dev/null
+++ b/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx
@@ -0,0 +1,83 @@
+---
+title: Supabase Alpha November 2020
+description: Nine months of building.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://avatars2.githubusercontent.com/u/10214025?s=400&u=c6775be2ae667e2acae3ccd347fed62bb3f5b3e7&v=4
+authorURL: https://github.com/kiwicopple
+image: supabase-november-2020.png
+tags:
+ - supabase
+date: '12-01-2020'
+---
+
+We've been building for 9 months now, and we're getting even closer to Beta.
+
+
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+### Add users
+
+You can now add users manually from your dashboard.
+
+
+
+### User admin
+
+You can also perform admin functions on existing users - send password reset emails, magic links, and delete users.
+
+
+
+### Even more powerful SQL Editor
+
+Last month we [announced](/blog/2020/11/02/supabase-alpha-october-2020#more-powerful-sql-editor) an improved SQL Editor, and this month we've taken it even further. The SQL Editor is now a full Monaco editor, like you'd find in VS Code. Build your database directly from the browser.
+
+
+
+### Status page
+
+We added a [Status Page](https://status.supabase.com/) which tracks the uptime and latency of the Supabase platform.
+
+
+
+### Kaizen
+
+- We completed a security audit by DigitalXRAID.
+- Email confirmations now enabled by default for signups.
+- Updated [Benchmarking Suite](https://github.com/supabase/benchmarks/) to include more realistic workloads, on various different servers (results published soon).
+- You can now set/edit/remove Foreign Keys via the table editor.
+
+### Community
+
+We had a crazy month during Hacktoberfest. In case you missed it, here are some of the highlights:
+
+- We have an exciting Vercel x Stripe x Supabase [collaboration underway](https://twitter.com/rauchg/status/1331021818681978881).
+- [@elrhomariyounes](https://github.com/elrhomariyounes) started helping [@acupofjose](https://github.com/acupofjose) with the [postgrest-csharp](https://github.com/supabase/postgrest-csharp) extension
+- [@duncanhealy](https://github.com/duncanhealy) is [updating the Redwood example](https://github.com/redwoodjs/redwood/pull/1474) to work with Supabase.js v1.0
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or [follow us on Twitter](https://twitter.com/supabase).
+
+### Coming next
+
+Look out for a big announcement on December 3rd. We'll also be presenting in the [Open Core Summit](https://2020.opencoresummit.com/) on the 16th of December.
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2020-12-02-case-study-monitoro.mdx b/www/_blog/2020-12-02-case-study-monitoro.mdx
new file mode 100644
index 00000000000..4bcadb8563c
--- /dev/null
+++ b/www/_blog/2020-12-02-case-study-monitoro.mdx
@@ -0,0 +1,58 @@
+---
+title: Monitoro Built a Web Crawler Handling Millions of API Requests
+description: See how Monitoro built an automated scraping platform using Supabase.
+author: rory_wilding
+author_title: Supabase
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: /images/blog/supabase-monitoro.png
+tags:
+ - case-study
+ - no-code
+date: '12-02-2020'
+---
+
+Omar Kamali is the founder of [Monitoro](https://www.monitoro.xyz/), a service for scraping countless websites 24/7 to notify customers when these websites change. To create this product, Monitoro's team needed to handle massive data throughput whilst ensuring the product was reliable and resilient to satisfy a rapidly growing user base.
+
+Learn how Monitoro was able to build fast, ensure reliability, and keep scaling by building with Supabase and Svelte.
+
+
+
+### From Zero to One Million
+
+In one month, Monitoro scaled from nothing to nearly one million API requests per day.
+
+
+
+### Customer discovery to development
+
+Monitoro spent time on customer discovery and building out a version 1. After getting some initial feedback and spending time learning from their customers, they realised to build out the functionality they wanted, Monitoro would need real-time functionality.
+
+From experience, the team understood from day one that using a technology such as Firebase would have been unthinkable. Monitoro also wanted to avoid vendor lock-in as well as leverage PostgreSQL's large ecosystem of tools in other parts of their processes. They didn't want to spend time setting up MongoDB, and whilst Hasura seemed like a possibility, it was over-engineered for Monitoro's use case.
+
+### Supabase turbo-charges Monitoro
+
+Omar saw Supabase mentioned on Hacker News and realised immediately it had the potential to solve Monitoro's problems. Using Supabase would help them launch version 2 of Monitoro with the real-time functionality their users would value, without sacrificing moving fast.
+
+Within a couple of days, the team had a version ready they could deploy. Monitoro's team developed and deployed a custom web service to handle the massive throughput required then used Supabase as their backend to power the web application their users interact with. This means Monitoro's users can view the extracted data and integrate the data with other tools without code.
+
+Fast forward to today, and Monitoro's user base has been ramping up, as they use Monitoro to monitor changes to websites all over the world. Despite how fast their user base has grown, the Monitoro team have peace of mind as they scale because they used Supabase, knowing it will just work without worrying about DevOps.
+
+
+
+### Prototype fast, and keep going
+
+Thanks to Supabase, Monitoro could deliver the features required needed faster than they anticipated. This meant the team could spend more time focusing on speaking to customers and marketing. As a result, their user base has grown massively in a short space of time. There was no need to worry about how to create a database which had real-time functionality which could be set up quickly and scale. Monitoro could focus on launching fast.
+
+Learn more about Monitoro:
+
+
diff --git a/www/_blog/2020-12-02-case-study-tayfa.mdx b/www/_blog/2020-12-02-case-study-tayfa.mdx
new file mode 100644
index 00000000000..39d12470baa
--- /dev/null
+++ b/www/_blog/2020-12-02-case-study-tayfa.mdx
@@ -0,0 +1,52 @@
+---
+title: TAYFA Built a No-Code Website Builder in Seven Days
+description: See how Tayfa went from idea to paying customer in less than 30 days.
+author: rory_wilding
+author_title: Supabase
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: /images/blog/supabase-tayfa.png
+tags:
+ - case-study
+ - no-code
+date: '12-02-2020'
+---
+
+[**TAYFA**](https://usetayfa.com) is the fastest no-code approach to create and iterate on bespoke frontends. Learn how its solo founder, [Sarup Banskota](https://twitter.com/sarupbanskota?lang=en), was able to launch quickly with [Supabase](/), Next.js, and Vercel.
+
+
+
+### Meet the founder
+
+Sarup's background is in open-source, web frontends, and devtools. In the summer of 2020, he was rapidly building MVPs as he explored different problem spaces. Sarup found that reusing his frontend work across projects, wasn't as simple as he'd have liked.
+
+
+
+- Zero to MVP: **7 Days**
+- Idea to 1st Payment: **30 Days**
+- Creating Scalable Backend APIs: **30 mins**
+
+### The Maker Journey
+
+When Sarup found an interested customer, TAYFA was still a fuzzy idea in his head. As a workflow tool, the best way to demonstrate the concept was to build an MVP. His customer needed the product yesterday — there was no time to waste.
+
+He started out with a first iteration using Next.js and Vercel for the frontend — technologies he loved, and Firebase because he was familiar with it. However, he soon realised that for his enterprise customers, self-hosting capabilities would be a deal-breaker. Moreover, he'd require sensible RESTful APIs for developing the subsequent iterations of TAYFA.
+
+One option was to do it the "old-school" way: Postgres on a custom server, or MongoDB. But that would mean losing momentum by getting bogged down setting up a backend.
+
+### Supabase helped shortcut development time
+
+Luckily, Sarup discovered Supabase through the Vercel community. Open-source and built on top of Postgres, it was perfect for his future self-hosting needs and also offered him an API out of the box. The current version of TAYFA is the third iteration, and also takes advantage of Supabase Auth, an out of the box auth layer.
+
+
+
+> _"If my product helps customers move fast, then I need to move fast._
+>
+> _Luckily with Supabase, I haven't had to worry about the health of my backend systems, and can focus on what I enjoy most: shipping frontend."_
+>
+> Sarup Banskota, founder of TAYFA
+
+### Prototype fast, and keep going
+
+Thanks to Supabase, Sarup can focus on what he does best and get his final product in front of his customer. There was no need to worry about choosing and setting up back-ends, Sarup could focus on launching fast.
diff --git a/www/_blog/2020-12-02-case-study-xendit.mdx b/www/_blog/2020-12-02-case-study-xendit.mdx
new file mode 100644
index 00000000000..d95679850a3
--- /dev/null
+++ b/www/_blog/2020-12-02-case-study-xendit.mdx
@@ -0,0 +1,41 @@
+---
+title: Xendit Built a Counter-Fraud Watchlist for the Fintech Industry
+description: See how Xendit use Supabase to build a full-text search engine.
+author: rory_wilding
+author_title: Supabase
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: supabase-xendit.png
+thumb: supabase-xendit-thumb.jpg
+tags:
+ - case-study
+ - fintech
+date: '12-02-2020'
+---
+
+[Xendit](https://www.xendit.co/) is one of South East Asia's largest payment processors. They use Supabase to run automated checks against international sanctions lists.
+
+
+
+### About Xendit
+
+Xendit is a leading payment gateway for Indonesia and Southeast Asia. They enable businesses to accept payments in Indonesia with a single integration for credit and debit cards, e-wallets, and bank transfer.
+
+### Counter-fraud
+
+As a payment processor, Xendit are responsible for verifying that all transactions are legal. Any transactions which are suspicions must be verified against a strict set of criteria, and the parties involved need to be checked against international sanctions lists. This is a critical anti-money-laundering operation and needs to be performed in realtime to prevent any delays on legitimate payments.
+
+### Why they chose Supabase
+
+Xendit needed something fast. Something that was cheaper than using the global players like Worldcheck or Refinitiv. Xendit already uses Postgres for a lot of their critical infrastructure, and so Xendit team are familiar with the technology and comfortable in it's ability to scale.
+
+### What they built
+
+Xendit parses international sanctions lists from the UN and the Indonesian government and loads them into Supabase. Since Supabase provides a full Postgres server, they can then use the [Trigram](https://www.postgresql.org/docs/current/pgtrgm.html) extension to perform full-text search on the lists, with a relevance score on every search.
+
+Supabase was perfect for their use case, as they needed something built fast. The full solution was built and in production in less than one week.
+
+> The full solution was built and in production in less than one week.
+
+Xendit created a database function for searching, which they are able to call directly using their Python clients. They have plans to iterate on the current implementation using more advanced techniques, like machine learning, but for now the Supabase system has been in Production for 9 months without a problem.
diff --git a/www/_blog/2020-12-02-supabase-striveschool.mdx b/www/_blog/2020-12-02-supabase-striveschool.mdx
new file mode 100644
index 00000000000..dc01b94ecf8
--- /dev/null
+++ b/www/_blog/2020-12-02-supabase-striveschool.mdx
@@ -0,0 +1,58 @@
+---
+title: Supabase Partners With Strive School To Help Teach Open Source
+description: Supabase Partners With Strive School To Help Teach Open Source To The Next Generation Of Developers
+author: rory_wilding
+author_title: Supabase
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: supabase-strive-school.png
+thumb: supabase-strive-school.png
+tags:
+ - supabase
+ - striveschool
+date: '12-02-2020'
+---
+
+
+
+### Supabase and Strive School - YC Summer 20 batchmates
+
+We are proud to announce we are teaming up with fellow YC Summer 20 Alumni [Strive School](https://strive.school/), to help teach the next generation of software developers about open source software development.
+
+
+
+Strive School is on a mission to train the next generation of Computer Engineers, starting from Europe.
+
+They've designed a new type of program which they brand a "Master-camp" - combining the depth of a masters degree with the pacing of a coding Bootcamp, they train engineers over a time span of eight months, and their students pay only once they get hired.
+
+Tobia and Diego, the founders, launched Strive School to help individuals gain the skills employers need and expect from a solid early career developer, which are often not taught during traditional computer science degrees and almost impossible to learn fully by yourself.
+
+Their business model means the better students, who want it the most, have a shot at making it - regardless of their socio-economic background.
+
+
+
+### Working together to help students learn open source
+
+Strive School has an initial focus on full-stack Web Engineering and AI Engineering. They deeply care about open-source and help their students understand the importance of open-source software in the modern workforce. Almost all technology companies use open-source software, so Strive School sees it as essential that their students leave the course with an understanding of open source development.
+
+At Supabase, we live and breathe open source. Our focus is on building the open-source Firebase alternative. Wherever possible, we integrate and support the best-in-class existing open-source tools and communities. If those tools don't exist, we build and open-source them ourselves.
+
+We are huge Postgres fans and believe that Supabase will make learning and implementing relational databases a better experience for code school students.
+
+We will be working closely with Strive School in the coming months to produce exclusive content for their code school students. We are also happy to announce we will be taking on a Strive school graduate as an intern at Supabase. This isn't a role we were actively hiring for, but we have been so impressed with the standard of their graduates that we didn't want to miss out of the chance to work with talent from Strive School.
+
+
+
+### Launching the Supabase Student Developer Pack with Strive School
+
+As part of this process, we have put together a Student Developer Pack. Strive School are the perfect partner to launch our Student Developer Pack with as we both feel passionate about the importance of open-source software to empower developers. We are looking forward to working closely together in the coming months to help their students embrace the world of open-source.
+
+The Supabase Student Development pack includes:
+
+- Credits for students to use Supabase free for 2-years
+- Access to our Slack Community channel, full of high profile developer advocates and open-source contributors
+- Founder office hours with students
+- Access to limited edition Supabase Swag
+
+If you running a code school or university and want to learn more about the Supabase Student Developer Pack, then reach out to rory@supabase.io
diff --git a/www/_blog/2020-12-13-supabase-dashboard-performance.mdx b/www/_blog/2020-12-13-supabase-dashboard-performance.mdx
new file mode 100644
index 00000000000..9d34977702d
--- /dev/null
+++ b/www/_blog/2020-12-13-supabase-dashboard-performance.mdx
@@ -0,0 +1,134 @@
+---
+title: Making the Supabase Dashboard Supa-fast
+description: Improving the performance of the Supabase dashboard
+author: inian
+author_title: Supabase
+author_url: https://github.com/inian
+author_image_url: https://github.com/inian.png
+authorURL: https://github.com/inian
+tags:
+ - supabase
+date: '12-13-2020'
+---
+
+
+
+The Supabase dashboard has become more feature-rich in the last month. We have a powerful SQL editor backed by [Monaco](https://microsoft.github.io/monaco-editor/). We built an Airtable-like view of your database, making editing a breeze.
+
+> Features, performance, DX - choose three
+
+Performance can quickly regress when adding new features, especially in a Single Page Application. Here are the steps we took to guarantee a good baseline performance within our application, without compromising on the developer experience (DX).
+
+## Establishing a baseline and setting targets
+
+> You can't fix what you can't measure
+
+There was some low-hanging fruit to improve performance, but we had one important thing to do before that - establish a baseline.
+
+Our dashboard is JavaScript heavy, so we started by setting up analytics to track our bundle sizes. [Next-bundle-analyzer](https://www.npmjs.com/package/@next/bundle-analyzer) (or [webpack-bundle-analyzer](https://www.npmjs.com/package/webpack-bundle-analyzer)) provides an interactive treemap of your generated JavaScript bundles. This is our treemap when we started. It gave us a clear indication what changes we needed to achieve the most impact.
+
+
+
+There are some great tools when it comes to Real User Monitoring (RUM). We chose the newly-launched [Sentry performance monitoring](https://sentry.io/for/performance/) product since we already use Sentry for error tracking and we wanted to minimize new tools in our stack. It also supports reporting [Core Web Vitals](https://web.dev/vitals/), the performance metrics created by Google to track initial loading performance, responsiveness and visual stability. Core Web Vitals come with recommended target values, giving us clear goals to hit.
+
+
+
+## Improving our JavaScript bundle size
+
+> How to not load the entire npm registry into our user's browsers
+
+### Choosing smaller modules
+
+We used [Bundlephobia](https://bundlephobia.com/) on our largest modules. This is a great website to have in your JS-performance arsenal. It gives the size of npm modules across different versions and recommends alternate modules with similar functionality which are smaller.
+
+`Moment.js` is notorious for its large bundle size and we don't need complex date processing for our dashboard. It was straightforward to switch to [day-js](https://day.js.org/) which is largely API-compatible with `Moment.js`. This change reduced our gzipped bundle size by 68 KB.
+
+We migrated from `Joi` to `ajv` for our schema validation which was 32% smaller. `ajv` was already bundled as a transitive dependency of other modules, making it a no-brainer.
+
+
+
+We reverted our [crypto-js](https://github.com/brix/crypto-js) module from version 4.0 to 3.3.0. Version 4.0 [injects more than 400kb code](https://github.com/brix/crypto-js/issues/276) when used in a browser context. The newer version replaces `Math.random` with node's implementation, injecting the entire node crypto module into the browser context. We use `crypto-js` for decrypting user's API keys and so we're not reliant on the randomness of the PRNG. We might move to a dedicated module like [aes-js](https://www.npmjs.com/package/aes-js) in the future since it has a much smaller surface area than `crypto-js` (in terms of security and performance).
+
+### Using partial imports
+
+By selectively importing functions from modules like `lodash`, we cut the gzipped size by another 40kb across all our bundles.
+
+```js
+// before
+import _ from 'lodash'\n
+// maunally cherry picking modules
+import find from 'lodash/find'
+import debounce from 'lodash/debounce'\n
+// using babel-plugin-lodash
+import { find, debounce } from 'lodash'
+```
+
+In the above example, we added [babel-plugin-lodash](https://github.com/lodash/babel-plugin-lodash) to our babel configuration which cherry picks the exact `lodash` functions we import. This makes it easier to import from `lodash` without cluttering the code with selective import statements.
+
+### Moving complex logic to the server
+
+Thanks to some skilled haxors (well, weak passwords mainly) we had crypto miners running on some of our customer's databases. To prevent this, we enforce password strength with the [zxcvbn](https://github.com/dropbox/zxcvbn) module. Though it improved our overall security, the module is [pretty big](https://bundlephobia.com/result?p=zxcvbn@4.4.2), weighing in at 388kb gzipped. To get around this, we moved the password-strength checking logic to an API. Now, the frontend queries a server with a user-supplied password and the server computes its strength. This eliminates the module from the frontend.
+
+### Lazy loading code
+
+[xlsx](https://github.com/SheetJS/sheetjs) is another complex and large module, which is used to import spreadsheets into tables. We contemplated moving this logic to the backend, but we found another solution: lazy loading it.
+
+The spreadsheet import is triggered when the user is creating a new table. However the code was previously loaded every time the page was visited - even when a new table was not being created. This made it a good candidate for lazy loading. Using [Next.js dynamic imports](https://nextjs.org/docs/advanced-features/dynamic-import) we are able to load this component (313 kb brotlied) dynamically, whenever the user clicks the "Add content" button.
+
+
+
+
+
+We use the same technique to lazy load some Lottie animations which are relatively large.
+
+### Using native browser APIs
+
+We decided against supporting IE11, opening up more avenues for optimization. Using native browser APIs enabled us to drop even more dependencies. For example, since the [fetch API is available](https://caniuse.com/fetch) in all the browsers we care about, we removed [axios](https://github.com/axios/axios) and built a simple wrapper using the native fetch API.
+
+## Improving Vercel's default caching
+
+> The fastest request is the request not made
+
+We noticed that Vercel was sending a `Cache-Control` header of `public, max-age=0, must-revalidate` , preventing some of our SVG, CSS and font files from being cached in the browser.
+
+We updated our `next.config.js` , adding a long `max-age` to the caching header that Vercel sends. Our assets are versioned properly, so we were able to safely do this.
+
+## Enabling Next.js Automatic Static Optimization
+
+Next.js is able to automatically pre-render a page to HTML, whenever a page meets some pre-conditions. This mode is called [Automatic Static Optimization](https://nextjs.org/docs/advanced-features/automatic-static-optimization). Pre-rendered pages can be cached on a CDN for extremely fast page loads. We removed calls to `getServerSideProps` and `getInitialProps` to take advantage of this mode.
+
+## Developing a performance culture
+
+> Always in sight, always in mind
+
+Our performance optimization journey will never be complete. It requires constant vigilance to maintain a baseline across our users. To instill this within our team, we took a few actions.
+
+We developed a Slack bot which sends our Sentry performance dashboard every week, containing our slowest transactions and our Core Web Vitals summary. This shows which pages need improvement and where our [users are the most miserable](https://docs.sentry.io/product/performance/metrics/#user-misery).
+
+During our transition from Alpha to Beta, performance was one of the important features, along with stability and security. We considered performance implications while choosing libraries and tools. Having a "seat at the table" in these discussions ensures that performance is not considered as an after-thought.
+
+## Results
+
+With these changes, we have a respectable Core Web Vitals score. This is a snapshot from Sentry with RUM data from the last week. We are within the recommended threshold for all the 3 Web Vitals.
+
+
+
+Our Next.js build output also shows that users download < 200 kb of JavaScript between any two page transitions. We're still improving too - even though we provide a lot of functionality in our dashboard, we will continue to reduce our bundle sizes.
+
+## Things that did not work
+
+> You win some, you lose some
+
+We tried a VSCode plugin called [Import cost](https://marketplace.visualstudio.com/items?itemName=wix.vscode-import-cost) which shows the size of JavaScript modules when you import it in your editor. However, the plugin did not work on our codebase since it doesn't support some JavaScript features, like optional chaining.
+
+We also passed on using [lodash-webpack-plugin](https://www.npmjs.com/package/lodash-webpack-plugin) even though it had the potential to reduce our JavaScript sizes, because it could potentially break our code if not used carefully. This plugin would require our frontend team to understand the Webpack configuration, updating it whenever they use a new lodash feature set.
+
+## The road ahead
+
+Our broad goal is to implement best practices for frontend performance, and make it exciting to all of our team. These are some ideas we have on our roadmap -
+
+- Set up [Lighthouse](https://developers.google.com/web/tools/lighthouse) in a GitHub Action to catch performance regression earlier in the development life cycle.
+- Continue reducing our initial JavaScript payload size, to improve our LCP time
+- Explore `cloud-mode` in [Segment](https://segment.com/docs/connections/destinations/) which makes API calls from the server instead of loading third-party library on the browser.
+
+Reach out to us on [Twitter](https://twitter.com/supabase) if you have more ideas to speed up our website ⚡
diff --git a/www/_blog/2021-01-02-supabase-beta-december-2020.mdx b/www/_blog/2021-01-02-supabase-beta-december-2020.mdx
new file mode 100644
index 00000000000..bbfbfb4c277
--- /dev/null
+++ b/www/_blog/2021-01-02-supabase-beta-december-2020.mdx
@@ -0,0 +1,98 @@
+---
+title: Supabase Beta December 2020
+description: Ten months of building.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: supabase-december-2020.png
+thumb: supabase-december-2020.png
+tags:
+ - supabase
+date: '01-02-2021'
+---
+
+After 10 hectic months of building, Supabase is now in Beta.
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+### Supabase is now in Beta
+
+We spent months working on Performance, Security, and Reliability. Read more on our [Beta Page](/beta).
+
+
+
+### Improve your docs inline
+
+Add comments and descriptions to your Tables directly from our auto-generated docs. Descriptions are stored as PostgreSQL comments (https://postgresql.org/docs/current/sql-comment.html), and are exposed over your OpenAPI spec.
+
+
+
+
+
+### Table View now has realtime changes
+
+Any updates that happen to your database are reflected in the Table View immediately.
+
+
+
+
+
+### Table Pagination
+
+Our table view now has pagination - better for working with large data sets.
+
+
+
+
+
+### Supabase raised a Seed Round
+
+We raised $6M from Y Combinator, Mozilla, and Coatue. You can read more on [TechCrunch](https://techcrunch.com/2020/12/15/supabase-raises-6m-for-its-open-source-firebase-alternative).
+
+### Kaizen
+
+- Supabase is now 26% faster in regions which support Graviton (1460 reqs/s up from 1167 reqs/s)
+- We launched a new region in Sao Paulo.
+- Postgres Array Support. You can now edit Native Postgres array items in the grid editor or the side panel.
+- We added better support for your custom Database Types.
+- Fixed some buggy keyboard commands. We're continuously improving key commands in the Table editor.
+
+### Community
+
+- We were featured on the GitHub release radar. [Link](https://github.blog/2020-12-07-release-radar-dec-2020/)
+- [@kiwicopple](https://twitter.com/kiwicopple) appeared on [Open Core Summit](https://2020.opencoresummit.com/)
+- [@aaronksaunders](https://twitter.com/aaronksaunders) created a video series on Supabase + Vue. [Link](https://twitter.com/aaronksaunders/status/1339981480202743811).
+- [@CodeByCorey](https://twitter.com/CodeByCorey) tracks realtime page views using Supabase. [Link](https://twitter.com/CodeByCorey/status/1344650699645325312).
+- [@ffbass](https://github.com/ffabss) started working on gotrue-java. [Link](https://github.com/supabase/gotrue-java).
+- We've grown more than 50% (GitHub star count) since moving into Beta. [Link](https://twitter.com/supabase/status/1345410714836594693)
+
+
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or [follow us on Twitter](https://twitter.com/supabase).
+
+### Coming next
+
+We've go a lot of exciting things planned for Q1 2021. We're already planning out Supabase Storage and a Supabase CLI for better local development. Let us know if there's something you want us to release as a priority!
+
+We also have something exciting planned with Vercel and Stripe ... [stay tuned](https://twitter.com/rauchg/status/1331021818681978881).
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-02-02-supabase-beta-january-2021.mdx b/www/_blog/2021-02-02-supabase-beta-january-2021.mdx
new file mode 100644
index 00000000000..07fd57cde86
--- /dev/null
+++ b/www/_blog/2021-02-02-supabase-beta-january-2021.mdx
@@ -0,0 +1,131 @@
+---
+title: Supabase Beta January 2021
+description: Eleven months of building.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: supabase-january-2021.png
+thumb: supabase-january-2021.png
+tags:
+ - supabase
+date: '02-02-2021'
+---
+
+New year, new features. We've been busy at Supabase during January and our community has been even busier. Here's a few things you'll find interesting.
+
+
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+### Count functionality
+
+Anyone who has worked with Firebase long enough has become frustrated over the [lack](https://stackoverflow.com/questions/49979714/how-to-get-count-of-documents-in-a-collection) of `count` functionality. This isn't a problem with PostgreSQL! Our libraries now have support for PostgREST's [exact](https://postgrest.org/en/v7.0.0/api.html?highlight=count#exact-count), [planned](https://postgrest.org/en/v7.0.0/api.html?highlight=count#planned-count), and [estimated](https://postgrest.org/en/v7.0.0/api.html?highlight=count#estimated-count) counts. A massive thanks to [@dshukertjr](https://github.com/supabase/postgrest-js/issues/94#event-4210564301) for this adding support to our client library.
+
+
+
+### New Auth Providers
+
+We enabled 2 new Auth providers - Facebook and Azure. Thanks to [@Levet](https://github.com/supabase/gotrue/pull/54) for the Azure plugin, and once again to [Netlify's amazing work](https://github.com/netlify/gotrue/issues/107) with GoTrue to implement Facebook.
+
+
+
+### Auth Audit Trail
+
+We have exposed the audit trail directly in the dashboard, as well as the GoTrue logs. Great for security and debugging.
+
+
+
+### Auth UI widget
+
+In case our Auth endpoints aren't easy enough already, we've built a React [Auth Widget](http://ui.supabase.com/?path=/story/auth-auth--default) for you to drop into your app and to get up-and-running in minutes.
+
+
+
+### New `auth.email()` function
+
+We added a helper function for extracting the logged in user's email address.
+
+
+
+### New Regions
+
+Launch your database in London or Sydney!
+
+
+
+### Copy rows as Markdown
+
+You can now copy SQL results as Markdown - super useful for adding to blogs and issues.
+
+
+
+### React server components
+
+If you're excited by React Server components then check out the Supabase + Server Components experimental repo. [https://github.com/supabase/next-server-components](https://github.com/supabase/next-server-components)
+
+
+
+### Learn
+
+We know that Auth can be a bit daunting when you're just starting out, so we have created some intro videos to get you up to speed in no time:
+
+- [Supabase Auth Deep Dive Part 1: JWTs](https://youtu.be/v3Exg5YpJvE)
+- [Supabase Auth Deep Dive Part 2: Restrict Table Access](https://youtu.be/qY_iQ10IUhs)
+- [Supabase Auth Deep Dive Part 3: User Based Access Policies](https://youtu.be/0LvCOlELs5U)
+
+
+
+### Kaizen
+
+- Performance: We migrated all of our subdomains to Route53, implementing custom Let's Encrypt certs for your APIs. As a result, our read benchmarks are measuring up 12% faster.
+- Performance: We upgrade your databases to the new [GP3](https://aws.amazon.com/about-aws/whats-new/2020/12/introducing-new-amazon-ebs-general-purpose-volumes-gp3/) storage for faster and more consistent throughput.
+
+### Community
+
+- @kiwicopple chats to @bdougie on HeavyBit's Jamstack Radio: [Link](https://www.heavybit.com/library/podcasts/jamstack-radio/ep-71-open-source-firebase-alternative-with-paul-copplestone-of-supabase)
+- Watch @leerob from Vercel deploy a full Next.js app with Supabase in just 2 minutes:
+ [Link](https://twitter.com/leeerob/status/1351576575888797696)
+- Redwood now supports Supabase:
+ [Link](https://twitter.com/redwoodjs/status/1347311574415863811)
+- Deploy a full analytics solution using Umami:
+ [Link](https://twitter.com/mkalvas/status/1353880637506260994)
+- Check out this open source Trello Clone:
+ [Link](https://twitter.com/joshnuss/status/1352094804335857664)
+- Get started with Expo + Supabase using this starter template from Kiki:
+ [Link](https://twitter.com/kikiding/status/1352086899242856449)
+- Use Supabase Auth with NestJS:
+ [Link](https://twitter.com/atsuhio/status/1348516650144780288?s=21)
+- The community has made some serious advances on the [Dart](https://github.com/supabase?q=dart&type=&language=), [C#](https://github.com/supabase?q=csharp&type=&language=), [Python](https://github.com/supabase?q=python&type=&language=), and [Kotlin](https://github.com/supabase?q=kotlin&type=&language=) libraries.
+- We were one of the fastest growing open source startups in Q4 last year: [Link](https://twitter.com/RunaCapital/status/1351122231791910916)
+
+
+
+
+ Source: repository.surf/supabase
+
+
+### Coming next
+
+We're ramping up to "Launch week" at the end of Q1, where we will be giving you some very exciting new features (including Storage!).
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-02-09-case-study-roboflow.mdx b/www/_blog/2021-02-09-case-study-roboflow.mdx
new file mode 100644
index 00000000000..49e1814ed41
--- /dev/null
+++ b/www/_blog/2021-02-09-case-study-roboflow.mdx
@@ -0,0 +1,59 @@
+---
+title: Roboflow.com choose Supabase to power Paint.wtf leaderboard
+description: Learn how Roboflow.com used Supabase to build their Paint.wtf leaderboard
+author: rory_wilding
+author_title: Supabase
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: roboflow-og.png
+thumb: roboflow-website.png
+tags:
+ - case-study
+ - AI
+date: '02-09-2021'
+---
+
+Brad Dwyer is the founder of [Roboflow](https://roboflow.com/?ref=supabase), a startup helping developers build computer vision into their applications. Their solution allows developers, with zero computer vision experience, to go from images to a trained computer vision model in minutes.
+
+Learn how Brad and Roboflow used Supabase to launch [Paint.wtf](https://paint.wtf), a product which survived traffic generated from the front page of Hacker News, Reddit, and Product Hunt.
+
+
+
+## From idea to a launch in a weekend
+
+Brad and a friend ([Erik Dunteman](https://twitter.com/erikdoingthings)) wanted to experiment with OpenAI's new [CLIP](https://openai.com/blog/clip/) model through a side project they could build in a weekend. CLIP classifies a wide range of images by flipping image classification into a text similarity task. Current image classifiers are limited because they are trained on a fixed number of categories. In contrast, CLIP learns from the raw text describing the images meaning the classifier isn't limited by labels and supervised learning. The team recognised that CLIP opens up a vast range of use cases that have been difficult previously due to the time required to collect images and train the model.
+
+Roboflow settled on a straightforward concept: they prompt users to draw an image which is then fed into CLIP. The AI then judges how close the drawing is to the given prompt and assigns it a score. Users' performance is tracked on a leaderboard for each prompt and users can see how well they performed against their peers according to the model.
+
+## Leaderboards that Count
+
+Brad and the team needed a leaderboard to make this idea work. While their first intuition was to use Firebase, it lacks the built-in functionality for counting the number of documents in a collection - a critical function for implementing their leaderboard design.
+
+
+
+You might export data to BigQuery, or implement an increment function on collection change, however PostgreSQL has great built in support for counting and Brad felt like this would be the perfect opportunity to test out Supabase and get the functionality he needed for the leaderboards to work reliably and without implementing add-ons.
+
+## One weekend to break the internet
+
+Brad and the team built the product overnight and launched it on Hacker News. Paint.wtf went on to make it to Hacker News and Reddit's first page, and getting traction on Product Hunt. As a result, they had to handle serious user volumes; at its peak, users were submitting over 2 new drawings every second.
+
+Over 100K users submitted drawings in a 24 hour span. At this point, Brad knew he had picked the right setup for his leaderboard as even with this massive spike in usage it continued to perform reliably so his users could get accurate and up to date rankings for their submissions.
+
+
+
+Paint.Wtf has continued to get sustained coverage in the media and has continued to pick up new and unexpected use cases. For example, remote teams are using Paint.wtf as part of their daily ice breaker activities during COVID to keep up team social cohesion.
+
+
+
+
+
+## Ship fast, and carry on scaling
+
+Thanks to Supabase, Roboflow could launch quickly and keep scaling despite the huge user volumes their innovative project generated overnight.
diff --git a/www/_blog/2021-02-27-cracking-postgres-interview.mdx b/www/_blog/2021-02-27-cracking-postgres-interview.mdx
new file mode 100644
index 00000000000..12eb0ecc461
--- /dev/null
+++ b/www/_blog/2021-02-27-cracking-postgres-interview.mdx
@@ -0,0 +1,158 @@
+---
+title: Cracking PostgreSQL Interview Questions
+description: Understand the top PostgreSQL Interview Questions
+author: ant_wilson
+author_title: Supabase
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: elephants.png
+thumb: elephants.png
+tags:
+ - sql
+ - postgres
+date: '02-27-2021'
+---
+
+There are plenty of resources out there for preparing for PostgreSQL interview questions. Most posts are for technical interviews with a focus on PostgreSQL, however many just cover the basics and the advanced resources often conflate transactional SQL with analytical SQL (WINDOW/RANK functions, aggregates etc.).
+
+Here, we're going to focus on PostgreSQL interview questions that are aimed to understand the transactional side of PostgreSQL, and offer some areas that you may want to go a little deeper on in order to really impress your interviewer (and more importantly, become a kick-ass software engineer).
+
+## 1. Modeling
+
+### Know how to model 1-M, M-M, 1-1 relationships. And know how to use foreign keys.
+
+A review of [database normalization](https://ocw.mit.edu/courses/civil-and-environmental-engineering/1-264j-database-internet-and-systems-integration-technologies-fall-2013/lecture-notes-exercises/MIT1_264JF13_lect_10.pdf) is a great place to start when thinking about how to correctly model relationships. However if you don't have the time to read through lecture notes, head over to [DBDesigner](https://app.dbdesigner.net/designer/schema/guest_template) and inspect their example schema. The table StudentCourses is a great example of how to model a Many-to-Many relationship, by using a join table. (side note: you can export these visual schemas to SQL using Ctrl+E). Modelling your data correctly is arguably the most important part of any software project, writing applications becomes a breeze if you can get the data layer right.
+
+### Know how to use pg rich type system: [arrays](https://www.postgresql.org/docs/current/arrays.html), [domains](https://www.postgresql.org/docs/current/domains.html), [JSONB](https://www.postgresql.org/docs/13/datatype-json.html), [timestamptz](https://www.postgresql.org/docs/current/functions-datetime.html), [enums](https://www.postgresql.org/docs/13/datatype-enum.html)
+
+Postgres has tons of useful types beyond the basics, knowing how to use them will show you can leverage the true power of Postgres. JSONB for example can be incredibly useful for storing non-structured data, which you can query using syntax like:
+
+```sql
+-- grades = {'geography': 'A', 'history': 'B', 'postgres': 'A++'}
+SELECT * FROM students WHERE grades->>'geography' = 'A';
+```
+
+### Know about namespacing with SCHEMAs
+
+In Supabase for example we keep system schemas such as `extensions` and `auth` in separate schemas so that we don't pollute the default `public` schema.
+
+## 2. INDEXes
+
+### Know how speed up queries with indexes.
+
+The art of indexing in Postgres could fill an entire book. In some circumstances it can happen that a bad index is worse for performance than no index, so it's worth spending a little time to learn some of the common strategies.
+
+An index can be simple, for example, if your students table is most frequently queried on surname alone, you create an index:
+
+```sql
+CREATE INDEX idx_students_surname
+ON students(surname);
+```
+
+The default index type used here is `btree` (you could have specified this as `USING btree`), but there are other types of indexes, such as `BRIN`, `GiST`, `GIN`, `hash`, and more. Readers wanting to go deeper may also want to explore [Partial](https://www.postgresql.org/docs/current/indexes-partial.html) or [Multicolumn](https://www.postgresql.org/docs/13/indexes-multicolumn.html) Indexes.
+
+### Know how to analyze with EXPLAIN ANALYZE
+
+Running
+
+```sql
+EXPLAIN (ANALYZE) SELECT *
+FROM students
+WHERE surname = 'Krobb';
+```
+
+Before and after adding your index will show you the difference in approach the query planner took to finding your data. Note that using EXPLAIN alone will give us estimated plan costs. When used together with ANALYZE like: `EXPLAIN (ANALYZE)` you will receive both estimated and actual costs.
+
+## 3. VIEWs
+
+### Know how to create different representations of data with [VIEWs](/blog/2020/11/18/postgresql-views).
+
+We might create a VIEW `transcripts` which pulls out data from `students`, `courses`, and `grades`. It's useful for security, and logical abstractions. Check out our longer post on VIEWs here: [/blog/2020/11/18/postgresql-views](/blog/2020/11/18/postgresql-views). Some purists may argue that you should always query VIEWs and never TABLEs.
+
+### Know about Autoupdatable views.
+
+If a VIEW is named as the target relation in an INSERT, UPDATE, or DELETE and only SELECTs from a single base relation, then the underlying subquery is automatically rewritten to update the underlying base relation instead.
+
+### Limitations on VIEWs
+
+One example of a limitation is when a VIEW is not Autoupdatable. This happens when the VIEW does not SELECT from a single base relation. If the user does not specify an INSTEAD OF trigger that upgrades the underlying query, then an error will be thrown, since the executor cannot update a view as such.
+
+## 4. ROLEs
+
+### Know how to secure their database. Permissions at the table, column, row level.
+
+All databases have different user types, your client for example doesn't usually need the ability to create and drop schemas, but your DB admin does. You should play around with [creating roles](https://www.postgresql.org/docs/current/database-roles.html), and [granting](https://www.postgresql.org/docs/current/role-membership.html) various permissions.
+
+### Know about [ROLEs](https://www.postgresql.org/docs/13/sql-createrole.html), application ROLEs, the PUBLIC role, and [GRANTs](https://www.postgresql.org/docs/current/sql-grant.html)
+
+In Postgres, the special “role” name PUBLIC can be used to grant a privilege to every role on the system. For example, if you want to grant insert access to all users on table students:
+
+```sql
+GRANT INSERT ON students TO PUBLIC;
+```
+
+### Know how to do RLS - Policies
+
+We use Row Level Security in Supabase as a way to grant/restrict access on a row level basis. For example if you're writing a Discord clone, perhaps only a given user should be able to write their own messages:
+
+```sql
+CREATE POLICY "Individuals can only write their own messages." ON messages FOR
+ INSERT WITH CHECK (auth.uid() = user_id);
+
+-- auth.uid() is a function provided by Supabase which plucks the uid out
+-- of the JWT sent along with an API request more on this here:
+-- https://www.youtube.com/watch?v=0LvCOlELs5U
+```
+
+## 5. FUNCTIONs
+
+### Know how to do business logic on SQL/[PLPGSQL](https://www.postgresql.org/docs/current/plpgsql-overview.html#PLPGSQL-ADVANTAGES)
+
+PL/pgSQL is a procedural programming language that can be used to write functions inside of your database. It can be useful for making [remote procedure calls](/docs/reference/javascript/rpc) from an API. You can go as deep as you want here, since it's an entire programming language, but understanding the basics will really go a long way, and give you super powers when working with your data.
+
+You can use FUNCTIONs in combination with TRIGGERs to do cool stuff like have auto-updating `updated_at` columns on your data:
+
+```sql
+-- a function that sets the updated_at value to now()
+CREATE FUNCTION set_updated_at()
+RETURNS TRIGGER AS $$
+BEGIN
+ new.updated_at = now();
+ RETURN NEW;
+END;
+$$ LANGUAGE plpgsql;
+
+-- a trigger that fires when students table is updated
+CREATE TRIGGER handle_updated_at
+ BEFORE UPDATE ON students
+ FOR EACH ROW
+ EXECUTE PROCEDURE set_updated_at();
+```
+
+### Thinks in SETs when doing logic
+
+Whilst PL/pgSQL does have [loops](https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-CONTROL-STRUCTURES-LOOPS) and [cursors](https://www.postgresql.org/docs/current/plpgsql-cursors.html), there is usually a faster and more legible pure SQL based solution available using JOIN/UNION etc. So it's important to become well acquainted with thinking in these terms.
+
+### Know how to use [CTEs](https://www.postgresqltutorial.com/postgresql-cte/)
+
+Common table expressions are temporary or intermediate result sets. They can make your queries more readable and even enable recursion. The typical form is:
+
+```sql
+WITH ten_strumpers AS (
+ SELECT id, first_name
+ FROM students
+ WHERE surname = 'Strumper'
+ ORDER BY first_name
+ LIMIT 10
+)
+SELECT id
+FROM ten_strumpers
+WHERE first_name LIKE "S%";
+```
+
+If you can reason about most of the topics in this post then you'll be in a very strong position to impress with your answers to PostgreSQL interview questions. As with all programming topics however, the real learning starts when you put these things into practice. At Supabase we offer a very very fast (the fastest?) way to spin up a PostgreSQL database and start querying it, and our browser based SQL editor is getting more powerful every day.
+
+[Get started on Supabase for free here](https://app.supabase.io)
+
+Thanks Steve Chavez for providing all the good bits of this post :)
diff --git a/www/_blog/2021-03-02-supabase-beta-february-2021.mdx b/www/_blog/2021-03-02-supabase-beta-february-2021.mdx
new file mode 100644
index 00000000000..3114e75a55a
--- /dev/null
+++ b/www/_blog/2021-03-02-supabase-beta-february-2021.mdx
@@ -0,0 +1,111 @@
+---
+title: Supabase Beta February 2021
+description: One year of building.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: /images/blog/release-feb-2021.jpg
+tags:
+ - release-notes
+date: '03-02-2021'
+---
+
+Supabase is an open source Firebase alternative. We've now been building for one year. Here's what we released last month.
+
+
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+### Dashboard Sidebars
+
+We've improved the UX of our Dashboard with sidebars in every section, including the Table view, the Auth section, and the SQL Editor.
+
+
+
+### SQL Autocomplete
+
+Writing SQL just got 10x easier. We added autocomplete to the SQL editor, including table & column suggestions.
+
+
+
+
+
+### Auth Redirects
+
+Redirect your users to specific route within your site on [`signIn()`](/docs/reference/javascript/auth-signin#sign-in-with-redirect) and [`signUp()`](/docs/reference/javascript/auth-signup#sign-up-with-redirect).
+
+
+
+### Replication management
+
+We added a page to the Database section for managing Postgres Replication. It's still basic, but you can use it to manage your realtime API - choosing which tables are enabled, and which events to send.
+
+
+
+### Learning Resources
+
+We've released a new [Resources](/docs/resources) section in our docs, as well as two new Auth modules: [GoTrue Overview](/docs/learn/auth-deep-dive/auth-gotrue) and [Google OAuth](/docs/learn/auth-deep-dive/auth-google-oauth).
+
+
+
+### New Region
+
+Launch your database in South Africa.
+
+
+
+### Kaizen
+
+- We filled up our [Examples](/docs/guides/examples) page with a lot of new content.
+- We released a [Docker Compose](https://github.com/supabase/supabase/blob/master/docker/docker-compose.yml) file for running Supabase locally. This will be used in our upcoming CLI.
+- We have a couple of pending RFCs which you may want to participate in:
+ - [Planning our CLI and Local Development](https://github.com/supabase/cli/pull/2)
+ - [Connection Pooling on Supabase](https://github.com/supabase/postgres/blob/rfc/connection_pooling/rfcs/0001-connection-pooling.md)
+
+### Community
+
+One of the community, [@ftonato](https://github.com/ftonato), has built an amazing [example](https://github.com/supabase/supabase/tree/master/examples/with-stencil) that shows how to use Supabase with [Stencil](https://stenciljs.com/) (a Web Component compiler built by they [Ionic](https://ionicframework.com/) team.)
+
+[Check it out!](https://github.com/supabase/supabase/tree/master/examples/with-stencil)
+
+
+
+- @kiwicopple on the LogRocket Podcast. [Link](https://podrocket.logrocket.com/9)
+- @bdougie Livestream: More Fullstack React w RedwoodJS + Supabase. [Link](https://www.twitch.tv/videos/907698954)
+- @gbibeaul created `useSupabase`: Supabase React Hooks. [GitHub](https://www.npmjs.com/package/use-supabase)
+
+We hit 6000 GitHub stars on [GitHub](https://github.com/supabase/supabase)
+
+
+
+
+ Source: repository.surf/supabase
+
+
+### Coming next
+
+Waiting for Supabase Storage? Here's a sneak peek for the upcoming Launch Week at the end of March.
+
+
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-03-05-postgres-as-a-cron-server.mdx b/www/_blog/2021-03-05-postgres-as-a-cron-server.mdx
new file mode 100644
index 00000000000..03a24fd5a8d
--- /dev/null
+++ b/www/_blog/2021-03-05-postgres-as-a-cron-server.mdx
@@ -0,0 +1,214 @@
+---
+title: Postgres as a CRON Server
+description: Running repetitive tasks with your Postgres database.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: supabase-postgres-cron.png
+thumb: supabase-postgres-cron.png
+tags:
+ - postgres
+date: '03-05-2021'
+---
+
+A Supabase user asked recently if they can trigger a webhook periodically. We haven't yet released Functions yet, so we checked whether it's possible with Postgres.
+
+It is. Here's how.
+
+
+
+### What's cron?
+
+A "cron job" is a script[^1] that runs periodically at fixed times, dates, or intervals. Traditionally you'd set it up on a Linux server. An example might be an hourly script that downloads emails to your computer.
+
+[^1]: Not necessarily a script. The cron is really a scheduler which triggers a job (of some sort, usually a bash script).
+
+These days, cron jobs are set up on a remote servers and in the cloud to run internet-related tasks. Like checking an endpoint every hour, or scraping a website every day.
+
+### Postgres + cron
+
+Postgres has "extensions" which allow you to, well, extend the database with "non-core" features. Extensions essentially turn Postgres into an application server.
+
+The team at [Citus](https://github.com/citusdata) created [`pg_cron`](https://github.com/citusdata/pg_cron) to run periodic jobs within your Postgres database.
+
+#### Enabling the extension
+
+If you're using a cloud-hosted Postgres database, make sure that `pg_cron` is installed first. The easiest way to do this is to run this command:
+
+```sql
+select name, comment, default_version, installed_version
+from pg_available_extensions
+where name = 'pg_cron';
+```
+
+If it returns a result then the extension is supported and you can turn it on by running:
+
+```sql
+create extension if not exists pg_cron;
+```
+
+If you're using Supabase you can also enable it in the Dashboard.
+
+
+
+#### Granting access to the extension
+
+If you're planning to use a `non-superuser` role to schedule jobs, ensure that they are granted access to the `cron` schema and its underlying objects beforehand.
+
+```sql
+grant usage on schema cron to {{DB user}};
+grant all privileges on all tables in schema cron to {{DB user}};
+```
+
+Failure to do so would result in jobs by these roles to not run at all.
+
+### Postgres + webhooks
+
+The Supabase customer wanted to call external endpoints every day. How would we do this? Another extension of course. This time we're going to use [pgsql-http](https://github.com/pramsey/pgsql-http) by [@pramsey](https://github.com/pramsey). Using the same technique, we can enable the extension (if it exists in your cloud provider).
+
+```sql
+create extension if not exists http;
+```
+
+This extension can now be used for [sending](https://github.com/pramsey/pgsql-http#functions) `GET`, `POST`, `PATCH`, and `DELETE` requests.
+
+For example, this function would get all the people in Star Wars (using the [Star Wars API](https://swapi.dev)):
+
+```sql
+select content::json->'results'
+from http_get('https://swapi.dev/api/people');
+```
+
+### Postgres + cron + webhooks
+
+Now the fun stuff. For this example we're going to call [webhook.site](https://webhook.site) every minute with the payload `{ "hello": "world" }`.
+
+Here's the code (with comments `--like this`).
+
+```sql
+select
+ cron.schedule(
+ 'webhook-every-minute', -- name of the cron job
+ '* * * * *', -- every minute
+ $$
+ select status
+ from
+ http_post(
+ 'https://webhook.site/223c8a43-725b-4cbd-b1fe-d0da73353a6b', -- webhook URL, replace the ID(223c8..) with your own
+ '{"hello": "world"}', -- payload
+ 'application/json'
+ )
+ $$
+ );
+```
+
+Now when we see that the payload is sent every minute, exactly on the minute.
+
+
+
+And that's it! We've built a cron webhook. Breaking down the code example above we have 2 key parts:
+
+#### POSTing data
+
+This is the part that sends the data to the website:
+
+```sql
+select status
+from
+ http_post(
+ 'https://webhook.site/223c8a43-725b-4cbd-b1fe-d0da73353a6b', -- webhook URL
+ '{"hello": "world"}', -- payload
+ 'application/json'
+ )
+```
+
+#### Scheduling the job
+
+The HTTP function is wrapped with the CRON scheduler:
+
+```sql
+select
+ cron.schedule(
+ 'cron-name', -- name of the cron job
+ '* * * * *', -- every minute
+ $$
+ -- Put your code between two dollar signs so that you can create full statements.
+ -- Alternatively, you can write you code in a Postgres Function and call it here.
+ $$
+ );
+```
+
+The second parameter uses cron syntax:
+
+```sh
+ ┌───────────── min (0 - 59)
+ │ ┌────────────── hour (0 - 23)
+ │ │ ┌─────────────── day of month (1 - 31)
+ │ │ │ ┌──────────────── month (1 - 12)
+ │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
+ │ │ │ │ │ Saturday, or use names; 7 is also Sunday)
+ * * * * *
+```
+
+If you're unfamiliar with the cron syntax, useful shortcuts can be found on [crontab.guru](https://crontab.guru/)
+
+```sh
+* * * * * # every minute
+*/5 * * * * # every 5th minute
+0 * * * * # every hour
+0 0 * * * # every day
+```
+
+#### Managing your cron jobs
+
+To see a list of all your cron jobs, run:
+
+```sql
+select * from cron.job;
+```
+
+And if you need to see the results of each cron iterations, you can find them in `cron.job_run_details`:
+
+```sql
+select * from cron.job_run_details;
+```
+
+To stop a running cron job, you can run:
+
+```sql
+select cron.unschedule('webhook-every-minute'); -- pass the name of the cron job
+```
+
+### What can I do with this?
+
+There are plenty use-cases for this. For example:
+
+- **Sending welcome emails.** If you use an email provider with an HTTP API, then you batch emails to that service. Write a function that `selects` all your signups yesterday, then sends them to your favorite transactional email service. Schedule it every day to run at midnight.
+- **Aggregating data.** If you're providing analytical data, you might want to aggregate it into time periods for faster querying (which serves a similar purpose as a [Materialized View](/blog/2020/11/18/postgresql-views#materialized-views-vs-conventional-views)).
+- **Deleting old data.** Need to free up space? Run a scheduled job to delete data you no longer need.
+
+See a detailed list in the [`pg_cron` README](https://github.com/citusdata/pg_cron#example-use-cases).
+
+## Addendum
+
+### Postgres background workers
+
+You might have noticed [this](https://github.com/pramsey/pgsql-http#why-this-is-a-bad-idea) notice the warning at the bottom of the `http` readme:
+
+> "What happens if the web page takes a long time to return?" Your SQL call will just wait there until it does. Make sure your web service fails fast.
+
+Luckily pg_cron implements [Background Workers](https://paquier.xyz/postgresql-2/postgres-9-3-feature-highlight-custom-background-workers/):
+
+> Care is taken that these extra processes do not interfere with other postmaster tasks: only one such process is started on each ServerLoop iteration. This means a large number of them could be waiting to be started up and postmaster is still able to quickly service external connection requests.
+
+This means that even if your endpoint takes a long time to return, it's not going to be blocking your core Postgres functions. Either way, you should probably only call endpoints that will return a response quickly, or set the http extension to fail fast (`http.timeout_msec = 300`).
+
+If you're familiar with `C`, you could also help `@pramsey` to implement async functions: https://github.com/pramsey/pgsql-http/issues/105
+
+### Should I use Postgres as a cron server?
+
+There are plenty of ways to run cron jobs these days. You can trigger them from your local machine. You can install them on a VPS. You can schedule Serverless functions. You can use a paid service. You can use GitHub Actions.
+
+Is Postgres the best place to put your cron jobs? `¯\_(ツ)_/¯`. Postgres databases are free on Supabase and since it takes only one minute to [get started](https://app.supabase.io/), why not make your next cron server a Postgres database?
diff --git a/www/_blog/2021-03-08-toad-a-link-shortener-with-simple-apis-for-low-coders.mdx b/www/_blog/2021-03-08-toad-a-link-shortener-with-simple-apis-for-low-coders.mdx
new file mode 100644
index 00000000000..a87778aaeb0
--- /dev/null
+++ b/www/_blog/2021-03-08-toad-a-link-shortener-with-simple-apis-for-low-coders.mdx
@@ -0,0 +1,42 @@
+---
+title: Toad, a link shortener with simple APIs for low-coders
+description: An easy-to-use link shortening tool with simple APIs
+author: rory_wilding
+author_title: Supabase
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: toadli-og.jpg
+thumb: toadli-website.jpg
+tags:
+ - supabase
+ - case-study
+date: '03-08-2021'
+---
+
+Zach Waterfield is an engineer, investor, and founder of Kopa - a short term furnished rental marketplace with operations in over 400 cities in the USA. Zach's latest project, [Toad](https://toadli.co/), is an easy-to-use link shortening tool with simple APIs, aimed to empower low-coders. Toad provides a simple dashboard, analytics, and API designed with low-coders in mind.
+
+Learn why Zach used Supabase as part of his serverless SAAS setup.
+
+### Toad APIs for low Coders
+
+Zach loves link shorteners. However, for low-coders, link shorteners tend to have cumbersome APIs limiting their utility. He wanted to build a link shortening tool with simple APIs that are simple for no-coders to use.
+
+## The power of a serverless Supa-stack
+
+Zach started this project with a low-management overhead in mind. He needed a robust and scalable stack that doesn't need refactoring when his service user volume grows. Zach knew that a back-end as-a-service abstracts away many of the dev-ops tasks, such as provisioning server instances and setting up databases. From experience, he knew that Firebase would be too cumbersome.
+
+Zach decided that combining Supabase, Lambda functions, Next.js, TailwindCSS, and Vercel would be the perfect Supa-stack to achieve his goal of low-management overhead. This setup removes significant dev-ops headaches with no need to think about continuous integration - when he wants to make a change, it is good to go. As a bonus, this setup is virtually free until he reaches significant user volumes.
+
+### Build it once, use it forever
+
+Zach was surprised how rapidly he was able to build and deploy Toadli. He now has a template project that he plans to customise for future SaaS services. Zach has a stack that is scalable, reusable, and low-management. Toad has early paying customers, and traffic volumes are increasing as low-coders become aware of how easy Toad APIs are to use.
+
+
+ Full Serverless is an amazing developer experience. You can get high-quality results fast,
+ especially when Supabase abstracts away all the back-end headaches
+
+
+## Spend more time creating and less time managing back ends
+
+Thanks to Supabase, Zach is able to focus on the creative process and launch services like [Toad](https://toadli.co/) with all the functionality he wants to offer. He has peace of mind that his stack is low-management and will scale as his project continues to gain traction.
diff --git a/www/_blog/2021-03-11-using-supabase-replit.mdx b/www/_blog/2021-03-11-using-supabase-replit.mdx
new file mode 100644
index 00000000000..01ddfb71f7d
--- /dev/null
+++ b/www/_blog/2021-03-11-using-supabase-replit.mdx
@@ -0,0 +1,135 @@
+---
+title: Using Supabase in Replit
+description: Free hosted relational database from within your node.js repl
+author: ant_wilson
+author_title: Supabase
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: replit-og.jpg
+thumb: replit-og.jpg
+tags:
+ - replit
+ - node-js
+ - postgres
+date: '03-11-2021'
+---
+
+[Replit.com](http://replit.com) is an awesome new browser based IDE where you can code alone or collaboratively with friends using their awesome multiplayer features! It's particularly useful for education, and sharing code examples with others.
+
+They support a ton of different languages and execution environments and even recently introduced a simple key value store you can use to persist data.
+
+As a Replit user, if you want to access larger amounts of data direct from your repl, or if you fancy accessing some super-powerful query tools, at some point you may want to start interacting with a relational database. Supabase is a good fit here; just like Replit, you don't need to worry about servers, and hosting, you can just click a few buttons and get a fully featured relational database which you can start communicating with directly from javacript, using supabase-js.
+
+
+
+Here's how to start a Supabase + Node.js repl:
+
+Sign up for [replit.com](http://replit.com) and hit new repl in the top left
+
+
+
+Select node.js, give it a name, and click Create repl
+
+
+
+Import supabase's createClient method and hit run to install the required libs:
+
+```jsx
+const { createClient } = require('@supabase/supabase-js')
+```
+
+Setup a new Supabase project and grab the URL and anon key from Settings > API. Create the client in javascript using:
+
+```jsx
+const supabase = createClient(
+ 'https://ajsstlnzcmdmzbtcgbbd.supabase.co',
+ 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
+)
+```
+
+
+
+Now that supabase is connected you'll want to add some data to your db, you can grab any SQL dataset on the web, or make your own, but the fasted way to test is to open the SQL tab in the Supabase dashboard and click the Countries sample database and click Run.
+
+
+
+From within your repl you can now query your countries table like:
+
+```jsx
+// .then() syntax
+supabase.
+ .from('countries')
+ .select('*')
+ .limit(5)
+ .then(console.log)
+ .catch(console.error)
+
+// or...
+// async/await syntax
+const main = async() => {
+ let { data, error } = supabase
+ .from('countries')
+ .select('*')
+ .limit(5)
+
+ if (error) {
+ console.log(error)
+ return
+ }
+
+ console.log(data)
+}
+main()
+```
+
+Once this is working, if you want to learn more about the [query interface](/docs/reference/javascript/filter) you might want to try some of these challenges:
+
+```jsx
+// 1. List all the countries in Antarctica
+// 2. Fetch the iso3 code of the country with ID 3
+// 3. List the countries with 'Island' in the name
+// 4. Count the number of countries that start with 'Z' or 'Q'
+// 5. Fetch all the Countries where continents is null
+```
+
+There are full solutions provided in the video version of this blog, but some examples you may find useful are:
+
+```jsx
+// or
+const { data, error } = await supabase
+ .from('cities')
+ .select('name, country_id')
+ .or('id.eq.20,id.eq.30')
+
+// is
+const { data, error } = await supabase.from('cities').select('name, country_id').is('name', null)
+
+// in
+const { data, error } = await supabase
+ .from('cities')
+ .select('name, country_id')
+ .in('name', ['Rio de Janeiro', 'San Francisco'])
+
+// neq (not equal to)
+const { data, error } = await supabase
+ .from('cities')
+ .select('name, country_id')
+ .neq('name', 'The shire')
+
+// full docs here: /docs/reference/javascript/filter
+```
+
+We look forward to showing off some more Supabase + Replit examples.
+
+You can find my example repl here: [https://repl.it/@awalias/supabase-test#index.js](https://repl.it/@awalias/supabase-test#index.js)
+
+Supabase has a free tier, head over to [https://app.supabase.io](https://app.supabase.io) to get started.
diff --git a/www/_blog/2021-03-22-In-The-Loop.mdx b/www/_blog/2021-03-22-In-The-Loop.mdx
new file mode 100644
index 00000000000..7312d6ba0d5
--- /dev/null
+++ b/www/_blog/2021-03-22-In-The-Loop.mdx
@@ -0,0 +1,42 @@
+---
+title: Developers stay up to date with intheloop.dev
+description: Learn why Kevin is building intheloop.dev with Supabase
+author: rory_wilding
+image: intheloop-supabase.jpg
+thumb: intheloop-supabase.jpg
+tags:
+ - supabase
+ - postgres
+ - open-source
+date: '03-22-2021'
+---
+
+Kevin Grüneberg is a freelance engineer who has been programming since he was 12 years old. His latest project, intheloop.dev, provides a single gateway for developers to stay up to date.
+
+## At the leading edge of Developer updates
+
+As a developer, Kevin loves to stay up to date with the latest technology. Within his network, he also finds himself the go-to person to help his colleagues stay up to speed by searching through Twitter, staying active in forums, and searching out different tech communities. He knows this insight will help others stay up to date at scale, so created intheloop.dev.
+
+Intheloop.dev is a single point of entry for developers to stay up to date on the topics they care about by aggregating feeds from various sources. It serves as an on-ramp to finding the communities you care about, monitor releases and change logs, critical tweets, and blogs of interest.
+
+Kevin is launching with coverage on three packages - React, Kotlin and Vite. He is also part of the [#buildinpublic](https://twitter.com/search?q=%23buildinpublic&src=typed_query) movement, In The Loop is open-source - you can [check it out on GitHub](https://github.com/kevcodez/intheloop). Kevin also developed open-source [Gotrue](https://github.com/supabase/gotrue-kt) and [PostgREST](https://github.com/supabase/postgrest-kt) Kotlin clients for Supabase.
+
+
+
+## Sometimes Firebase just isn't enough
+
+With over seven years of experience working with relational databases, Kevin knows how powerful Postgres is. Kevin is a Firebase user and knows first hand that he can build fast with Firebase. However, straightforward tasks in Postgres like count functionality, foreign key relations and database normalisation are either insanely difficult or impossible to achieve using Firebase. With Supabase, he gets the benefits of Postgres with the development pace of Firebase. Because he uses Supabase as the backend, it will be easy to add more features in future, like user accounts, when he is ready.
+
+## Supabase gives Developers Postgres Supapowers
+
+Kevin loves building with Supabase because of SQL and other Postgres features like constraints, views, and materialised views. Using all these features quickly and efficiently is amazing for Kevin when he knows Supabase is just as easy to integrate as Firebase.
+
+
+ Supabase building on top of Postgres is a true superpower for developers. Postgres is already
+ insanely powerful, and having much more functionality out of the box means I can build quickly and
+ continue to scale
+
+
+## Launch fast and have confidence in adding more functionality with Supabase
+
+With Supabase, Kevin can focus on his idea's core rather than worrying about his tech stack. Intheloop is just getting started with additional features coming like notifications, following topics, and developers to build a personal digest which is where the real time-saver begins. With Postgres under the hood, Kevin can add functionality to delight his users without worrying about his data model. You can sign up to stay in the loop [here](https://intheloop.dev/).
diff --git a/www/_blog/2021-03-25-angels-of-supabase.mdx b/www/_blog/2021-03-25-angels-of-supabase.mdx
new file mode 100644
index 00000000000..11a1c0e6dd1
--- /dev/null
+++ b/www/_blog/2021-03-25-angels-of-supabase.mdx
@@ -0,0 +1,352 @@
+---
+title: Angels of Supabase
+description: Meet the investors of Supabase.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: angels-of-supabase.png
+thumb: angels-of-supabase.png
+tags:
+ - fundraising
+date: '2021-03-25'
+---
+
+Supabase is an open source Firebase alternative. We're on a mission to build an incredible developer experience around
+the world's best open source tools.
+
+To build an amazing developer experience, we need developers to guide us. So after finishing Y Combinator, we took a
+deliberate approach to fundraising. We loaded our Seed round with developers, technical founders, and developer advocates:
+CTOs who have seen scale, community managers, and hackers. We amassed over 20 angel investors - almost all technical.
+
+The Supabase Team is at full capacity preparing for [Launch Week](/blog/2021/03/25/launch-week) and since we're all short on time we decided -
+why not ask our Angels to write a fundraising post with us?
+
+So here is our unconventional fundraising announcement, written with a few of the Angels of Supabase.
+
+## Mike Krieger (Instagram)
+
+
+
+Cofounder & CTO of Instagram. [@mikeyk](https://twitter.com/mikeyk)
+
+#### How many hours per week do you spend coding?
+
+~30 these days
+
+#### Why did you invest in Supabase?
+
+Supabase is building tools that are foundational to almost any interactive, modern app, and doing so in a way that's
+really aligned with how I think of building tech stacks. For example, choosing Postgres (and deeply understanding
+Postgres' features) as the underlying datastore.
+
+#### Do you write SQL in uppercase or lowercase?
+
+Uppercase but I'm coming around to lowercase!
+
+#### What was the first program you wrote and what was it written with?
+
+A website that I built so I could skip out on writing a school paper instead — HTML and Image ``s for interactivity.
+
+#### What's the worst programming error you've ever made?
+
+On launch day for Instagram, the site was down for a good chunk of time because we hadn't set a favicon.ico _and_
+we had Django set up to email us on all errors. Cue storm of email sends every time someone loaded our homepage…and a very unhappy web server.
+
+#### If you could only use one programming language for the rest of your life, what would it be?
+
+Python — though I am very intrigued by Rust.
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+Stay curious and don't feel like everything you build has to be "the next big thing"; so many times I've worked on a
+fun side project or exploration and ended up learning something I applied to more "serious" work.
+
+## Cassidy Williams (Netlify)
+
+
+
+Principal Developer Experience Engineer at Netlify. Outside of that, makes memes, classes, talks, and content for
+developers. [@cassidoo](https://twitter.com/cassidoo)
+
+#### How many hours per week do you spend coding?
+
+Probably around 20, depending on the week. Sometimes more!
+
+#### Why did you invest in Supabase?
+
+It's a good tech stack and a tool that I think fills a need for a lot of folks.
+
+#### Do you write SQL in uppercase or lowercase?
+
+Uppercase!
+
+#### What was the first program you wrote and what was it written with?
+
+I started making websites as a teenager, and programmed my graphing calculator with good ol' BASIC!
+
+#### When was the first time you used a computer and what did you do with it?
+
+Oh I was a kid, and definitely used it only for CD-ROM games in those dial-up days.
+
+#### Would you rather fight 100 duck-sized horses or 1 horse-sized duck?
+
+100 duck-sized horses, because I'm a weakling and could probably do better with the smaller things as long as
+they aren't too organized.
+
+#### If you could only use one programming language for the rest of your life, what would it be?
+
+Probably JavaScript. It's gotten to that level of power that I could apply it to almost anything.
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+Get a calendar you'll actually use and stick to your to-do lists!
+
+## Thorsten Schaeff (Stripe)
+
+
+
+Helps developers grow the GDP of the Internet as a Developer Advocate at Stripe. [@thorwebdev](https://twitter.com/thorwebdev)
+
+#### How many hours per week do you spend coding?
+
+Really depends on the projects I'm working on. Sometimes I spend a good amount of time making videos.
+
+#### Why did you invest in Supabase?
+
+The team | The Culture | The DX
+
+#### Do you write SQL in uppercase or lowercase?
+
+lowercase - I prefer not to scream at my DB.
+
+#### What was the first program you wrote and what was it written with?
+
+My first proper project was probably at uni, building an app to alert wind surfers of great wind conditions.
+Was built with Python on a Raspberry Pi, jQuery and PhoneGap
+
+#### When was the first time you used a computer and what did you do with it?
+
+When I was 9 years old my dad signed me up for an HTML summer camp. That's how it all started :D
+
+#### Would you rather fight 100 duck-sized horses or 1 horse-sized duck?
+
+I think there's a market for duck-sized horses. Would capture and sell them. Also duck's have some nasty claws,
+wouldn't be a good idea to make them bigger!
+
+#### If you could only use one programming language for the rest of your life, what would it be?
+
+I'd do anything and everything in TypeScript if I could!
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+Get involved with and start contributing to open-source. Start creating content about your open-source contributions,
+and I'm certain that it will pay off!
+
+## Brian Douglas (GitHub)
+
+
+
+Staff Developer Advocate at GitHub. [@bdougieyo](https://twitter.com/bdougieyo)
+
+#### How many hours per week do you spend coding?
+
+~10 hours a week.
+
+#### Why did you invest in Supabase?
+
+Supabase is scratching an itch for me as a developer. I see the value of having a manageable database based on SQL,
+but I don't only have limited time to code during the week and I don't want that to get sucked into the maintenance
+and management of that data. I also was a big Firebase fan, and love the developer ergonomics if offered to me as an early user.
+
+#### Do you write SQL in uppercase or lowercase?
+
+Always uppercase, but don't ask me what the acronym stands for.
+
+#### What was the first program you wrote and what was it written with?
+
+The first function programming was an Android app in Java that was just a picture of a cat. When you pet the cat it purred,
+it was part of an Android tutorial when I thought I wanted to be an Android dev. I later got an iPhone and decided to never
+write Java again when I found Ruby on Rails. I built a Yelp clone for churches, but bailed on that when I took a full time dev role.
+
+#### When was the first time you used a computer and what did you do with it?
+
+My first time using a computer was in second grade and it was to play wolfenstein. We had a computer that we could use in
+the office of the apartment complex I grew up in. One of the older kids installed the game and showed the other kids how
+to run in from powershell. Probably not the best game to introduce to a 7 year old, but here we are.
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+I would tell them to start with creating short form content every day. It easier to make content on things you just
+learned, so do that. It is also easier to get hired when you already have content.
+
+## Justin Gage (Retool)
+
+
+
+Growth at Retool. Writes [a newsletter](https://technically.dev/) that helps people understand software engineering and tech.
+[@itunpredictable](https://twitter.com/itunpredictable)
+
+#### How many hours per week do you spend coding?
+
+It depends – some weeks I’m mostly writing and coordinating, other weeks I’m writing a lot of code. Lets say 20 hours on a good week :)
+
+#### Why did you invest in Supabase?
+
+I had been working on the Firebase integration at Retool for a bit, and kept wondering why it was (a) closed source
+and (b) NoSQL only. Over the span of a week, something like 5 or 6 of my developer friends asked me what I thought
+about Supabase, so I checked it out – after using the product for a side project, investing was an easy decision.
+
+#### Do you write SQL in uppercase or lowercase?
+
+Lowercase, obviously. I wrote thousands of queries when I worked at DigitalOcean, and we didn’t have time to capitalize things.
+
+#### If you could only use one programming language for the rest of your life, what would it be?
+
+SQL (particularly standard Postgres syntax) is the best language on the planet. Fight me.
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+Eh, I can’t really give advice, I haven’t figured anything out myself yet!
+
+## Iheanyi Ekechukwu (PlanetScale)
+
+
+
+Senior Software Engineer at PlanetScale. [@kwuchu](https://twitter.com/kwuchu)
+
+#### How do you pronounce your name?
+
+
+
+
+
+#### How many hours per week do you spend coding?
+
+Pretty much, the majority of my week is spent coding. I'd say realistically, around 30-ish hours a week or so.
+
+#### Why did you invest in Supabase?
+
+The tagline about Supabase being an "open-source Firebase alternative" had me intrigued. As I looked more deeply into
+the product, I was impressed by the well-thought out design and also how easy it is to use the product as well.
+
+#### Do you write SQL in uppercase or lowercase?
+
+Uppercase.
+
+#### When was the first time you used a computer and what did you do with it?
+
+During summers as a child, my dad would take me to work with him at the community college he taught at. I'd be sitting
+in his office while he was in lectures and actually just use his computer to play that 3D Space Pinball game. I think
+I was 5 or 6 years old at the time.
+
+#### If you could only use one programming language for the rest of your life, what would it be?
+
+Honestly, I would probably choose Go. It's a pretty dope language for building out systems.
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+Always be learning. There's so many things to learn as an engineer and the job is constantly about learning new things.
+Never settle, never get comfortable, learn as much as you can consistently.
+
+## Zach Waterfield (On Deck)
+
+
+
+Engineer at OnDeck, Network Leader at Village Global, Founder of Kopa (W19). [@zlwaterfield](https://twitter.com/zlwaterfield)
+
+#### How many hours per week do you spend coding?
+
+Anywhere from 10 to 50 depending on the week
+
+#### Why did you invest in Supabase?
+
+I have many ideas, and spinning up a backend, db, etc., is so daunting, so I started using Firebase, but it was very
+frustrating. When I saw Supabase I instantly knew that was the solution. The ability to use Postgres directly from the
+client with authentication built-in was a game-changer. I think it could become the go-to that early-stage companies
+build on to simplify their MVPs.
+
+#### Do you write SQL in uppercase or lowercase?
+
+UPPERCASE
+
+#### When was the first time you used a computer and what did you do with it?
+
+Weirdly enough, I didn't own a computer until I was in grade 12 and didn't learn to code until I was in University.
+I was the only one in a class of 400+ freshman engineers that had never coded before.
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+Network, network, network. Everything I do and all my successes are based on my network. Whether that be from YC, my
+university peers, OnDeck, Twitter, etc. Focus on building your network, and good opportunities will start to pop up.
+
+## Shawn Wang (Temporal)
+
+
+
+Head of Developer Experience at Temporal. [@swyx](https://twitter.com/swyx)
+
+#### How many hours per week do you spend coding?
+
+10
+
+#### Why did you invest in Supabase?
+
+I was extremely impressed by the founders and love the idea of offering a beautiful, integrated developer experience atop
+of proven, scalable, open source foundations.
+
+#### Do you write SQL in uppercase or lowercase?
+
+Uppercase if formal, lowercase if lazy!
+
+#### What was the first program you wrote and what was it written with?
+
+We had a computer class in middle school and we were assigned to write a pancake stacking program in BASIC. I was really
+obsessed by it and was the only person to submit this assignment complete with a graphical user interface (in BASIC!).
+Sadly I didn't see myself as a programmer until 20 years later.
+
+#### If someone wanted to do what you do, what's a piece of advice you'd give them?
+
+[Learn in Public](https://www.swyx.io/LIP) :)
+
+## By the way
+
+We [raised](https://techcrunch.com/2020/12/15/supabase-raises-6m-for-its-open-source-firebase-alternative/) a $6M seed
+round led by Coatue, Mozilla, and YC.
+
+Next week is [Launch Week](/blog/2021/03/25/launch-week) and we'll be launching one new thing every day for a week.
+
+[Check it out](/blog/2021/03/25/launch-week)!
diff --git a/www/_blog/2021-03-25-launch-week.mdx b/www/_blog/2021-03-25-launch-week.mdx
new file mode 100644
index 00000000000..68b397a2f61
--- /dev/null
+++ b/www/_blog/2021-03-25-launch-week.mdx
@@ -0,0 +1,128 @@
+---
+title: Launch week
+description: Five days of Supabase.
+author: ant_wilson
+author_title: Supabase
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: supabase-launch-week.png
+thumb: supabase-launch-week.png
+tags:
+ - storage
+ - pricing
+ - developers
+date: '2021-03-25'
+---
+
+When we joined Y Combinator last summer, we spent the entire 3-month program building one (major) feature: Auth.
+
+Demo Day gave our team something to rally around. The looming deadline forced us to deliver a lot of complex functionality in a short amount of time.
+
+After we finished YC, we recreated Demo Day conditions internally: we gave ourselves a 3-month timeline to move from Alpha to Beta.
+
+It worked wonders. We made [giant leaps forward](/beta) in the performance, security, and
+stability of the platform.
+
+The day after our Beta announcement (still high on the adrenaline of the launch) we asked ourselves:
+what's the most ambitious thing we can hope to launch 3 months from now?
+
+We decided not to settle for just one major feature. We wanted to fill an entire week with launches and announcements.
+
+Looking at the list of features we planned, and with the relatively small team we have, this felt like a hugely ambitious idea.
+But after another 3 months of building, we're happy to announce that...
+
+Starting on Monday 29th March, we'll be commencing our Launch Week!
+
+## What to expect
+
+We don't want to spoil the surprise, so for now we'll give you a teaser of what to expect. Come back here each day to see what we launch,
+or follow us on twitter to keep up to date: [@supabase](https://twitter.com/supabase) and follow the hashtag [#supalaunchweek](https://twitter.com/hashtag/supalaunchweek).
+
+## Monday: Pricing
+
+- 29 March 2021
+
+We're announcing pricing today. If you don’t care for the details, [here is the pricing](/pricing).
+
+The [blog post here](/blog/2021/03/29/pricing) goes into depth around our decision-making process.
+
+The key takeaway is that we will stick with (what we feel is) a generous free tier. This was critical for many of our users who are still in the “build” phase of their project/business.
+
+Another key takeaway is predictability. We’ve talked to too many devs who have been caught out by Firebase’s usage billing.
+
+Usually this is due to rogue API requests, which have a habit of spiking without any good debugging tools. To circumvent this, our usage pricing is centered on more “predictable” mechanisms (like storage), avoiding usage-billing on items like API requests.
+
+Even on our free tier you’re able to make millions of requests per day (we have developers doing this already!). In the future we will introduce “usage caps” on our top tier, which will allow you to specify maximum spends. Finally, we’re starting with soft-tiers, so nobody will be “unexpectedly” upgraded.
+
+We’re a startup ourselves, so we want to build a sustainable business. Even though we are offering a free tier, we’re confident in our ability to support it long-term with the enterprise features we are building (SSO, multi-cloud).
+
+If you aren’t confident in our business model though, we’re open source. You can [host it yourself](https://github.com/supabase/supabase/tree/master/docker). Even better, everything we build is centered around Postgres, so you can pretty much `pgdump` your database and take it to your favorite Postgres platform.
+
+
+
+## Tuesday: Storage
+
+- 30 March 2021
+
+Checkout the launch post here: [Supabase Storage](/blog/2021/03/30/supabase-storage)
+
+As with anything that we build in Supabase, Storage is fast, secure and scalable. It's integrated well with the rest of the Supabase ecosystem.
+
+**Security** 🔒
+
+The authentication is handled by Kong and the authorization policies are implemented via Row Level Security policies in Postgres. This way we didn't have to implement a new language for implementing authorization policies. Check out our blog post for more details on how this works.
+
+**Performance** ⚡️
+
+Our storage API is a thin layer built with Fastify, a [blazing fast](https://www.fastify.io/benchmarks/) Node.js framework. The security policies are directly evaluated in Postgres. The object explorer in dashboard makes navigation easy even when you have deeply nested folders or millions of objects in your buckets.
+
+**Scalability** 📈
+
+You can use storage for your terabytes of ML training data, e-commerce product gallery, or just your growing collection of JPEGS featuring cat's playing synths in space. You can truly build in a weekend and scale to millions.
+
+
+
+## Wednesday: CLI
+
+- 31 March 2021
+
+Today is Day 3 of [Launch Week](/blog/2021/03/25/launch-week), and as promised - we're releasing our CLI.
+
+Today we launched the Supabase CLI which includes:
+
+- Running Supabase locally
+- Managing database migrations
+- Self hosting with Docker!
+
+Check out the announcement post here: [/blog/2021/03/31/supabase-cli](/blog/2021/03/31/supabase-cli)
+
+
+
+## Thursday: UI (not an April Fool's joke, we promise)
+
+- 1 April 2021
+
+We've spent a lot of time over the last 12 months making sure we have a lightning fast and delightful user dashboard that keeps pace with everything we do on the backend.
+
+We are constantly iterating on our own UI, and having multiple devs working on different areas simultaniously has led to us requiring a standardized UI component library.
+
+And now we're doing what we do best at Supabase and making it open source, so that the community can benefit from the UI work done at Supabase, and vice versa. The open source community is an invaluable asset to the work we do every day, and it's genuinely the main driver which enables our relatively small team to work fast and ship often.
+
+Check out the demo and documentation website directly here: [ui.supabase.com](https://ui.supabase.com/)
+
+
+
+## Friday: One more thing
+
+- 2 April 2021
+
+It's the season finale of Supabase Launchweek! And we have THREE more things to share:
+
+1. [Connection Pooling with PgBouncer](/blog/2021/04/02/supabase-pgbouncer) - now you can connect directly to your Postgres instance without needing to worry that you'll cap out on connections. Perfect for use with Prisma.
+
+2. [Workflow Engine](/blog/2021/04/02/supabase-workflows) - Our WIP states language will eventually enable a drag and drop workflow builder like Zapier inside the dashboard. Built with Elixir for scale!
+
+3. supabase.io is now supabase.com - check out our origin story here: [/blog/2021/04/02/supabase-dot-com](/blog/2021/04/02/supabase-dot-com)
+
+
diff --git a/www/_blog/2021-03-29-pricing.mdx b/www/_blog/2021-03-29-pricing.mdx
new file mode 100644
index 00000000000..a291cdcfa60
--- /dev/null
+++ b/www/_blog/2021-03-29-pricing.mdx
@@ -0,0 +1,84 @@
+---
+title: Supabase Beta Pricing
+description: Supabase launches Beta pricing structure
+author: rory_wilding
+image: pricing-og.jpg
+thumb: launch-week-pricing.jpg
+tags:
+ - supabase
+date: '03-29-2021'
+---
+
+## Pricing is hard
+
+Many developers have been waiting for [pricing](/pricing) before building on Supabase. It has taken this long to announce pricing for one simple reason: pricing is hard. We've spent countless hours discussing and testing different models. We consulted users, OSS veterans, and SaaS Gurus. We explored and ruled out a number of options including: no free tier, pure usage based, pay-per-seat, pay-per-row, and "bolt-on" feature based pricing.
+
+Supabase is a suite of integrated products - should we compare our Postgres databases with Amazon RDS? Do we benchmark our Auth pricing against Auth0 or Okta?
+
+So we decided to do what we always do: ship it, share it, and then listen to our users' feedback.
+
+## TLDR
+
+We are launching [pricing](/pricing) with three tiers:
+
+1. Free - for up to four hobby-level projects
+2. Pro - $25 per project per month, for more serious projects
+3. Usage based - for those who need more resource than what's on the Pro tier
+
+## Goals for our pricing structure
+
+Our goals for pricing are simple:
+
+- Continue offering free Supabase projects for Students, Hobbyists, and Early Adopters
+- Price based on predictable metrics (no shock bills at the end of the month)
+- Enable and grow with our most successful users, providing a pricing model that supports their growth
+
+We came up with a 3-tier model to offer predictability, and then iterated through numerous user interviews to answer the questions: "how much do we charge in each tier, and what features go in each tier?". To answer these questions we considered:
+
+1. How much value does Supabase create compared to alternatives including Firebase, authentication providers like Okta and Auth0, API, and storage providers?
+2. How much time does Supabase save developers?
+3. How can we make Supabase as accessible as possible?
+4. As developers ourselves, how do we feel about our proposed pricing?
+5. The underlying cost of development and maintenance of Supabase.
+
+As a result, we've arrived at a pricing model that brings predictability, is sustainable, and enables us to continue to offer a free tier.
+
+Our model allows anybody to come in and experience the full power of the Supabase stack without first needing to put down a credit card.
+
+## Launching with a free tier
+
+Many of our early users are building or migrating their passion projects to Supabase. Offering a free tier enables this. We also support a large number of students learning SQL for the first time, and fledgling startups which haven't started earning any revenue yet.
+
+Developers need time to build their side projects, and they don't want to pay for a database while they do it. At the same time, hosting Postgres databases is expensive. So we decided to take the same strategy that we always have: ship, share it, and iterate.
+
+No company gets the pricing right first time. It would be arrogant to believe that we will. What we can promise you is this: as we learn and grow we plan to offer more value for less, not the other way around.
+
+Our success depends on the success of developers using Supabase. In short, if our users' projects succeed then Supabase adoption will continue. That is exactly what we want.
+
+We will issue credits for those who signed up during alpha, beta, and those who sign up through to the end of Launch Week[^1]. If you are not on board yet, [you can sign up here.](http://www.supabase.io) Projects on select incubators will also get credits, as founders we know the importance of credits when getting something new off the ground. We will continue to support code schools and their students. If you need Supabase credits to support your project, reach out to us here and we will do our best to help you.
+
+## Making pricing predictable
+
+We know that Firebase pricing can be [problematic](https://medium.com/madhash/how-not-to-get-a-30k-bill-from-firebase-37a6cb3abaca).
+
+That's why we made our pricing as predictable as possible. You can quickly understand which pricing tier you fit into, without having to forecast how many API requests you're going to make this quarter.
+
+What does this mean for you as a developer?
+
+- You can make as many API calls as you need to (within the constraints of your database). We already have users making millions of requests per day.
+- We have been deliberately generous with authentication and storage on the free tier so that you get as much of the Supabase experience as possible.
+- We're starting with soft-limits for usage billing to prevent unexpected charges.
+- We'll reach out to you before changing your billing plan to see if it makes sense for your project.
+- On our "Pay as you go" tier we will work with you to forecast billing before making a commitment.
+
+## Next steps
+
+In the next few days, you will see your usage appear in the dashboard with an upgrade button.
+
+Check back throughout the week to see what else we're launching [here](/blog/2021/03/25/launch-week).
+
+Sign up for the Supabase Beta [here](https://app.supabase.io).
+
+And check out the full pricing details [here](/pricing). And we'd love to hear your opnions on our Pricing! You can let us know via support@supabase.io.
+
+[^1]: Updated on Aug 17 2021 for clarity: the referenced Launch Week ended on the 4th of April 2021. Users that signed up prior to that date can request credits.
diff --git a/www/_blog/2021-03-30-supabase-storage.mdx b/www/_blog/2021-03-30-supabase-storage.mdx
new file mode 100644
index 00000000000..ad626f706aa
--- /dev/null
+++ b/www/_blog/2021-03-30-supabase-storage.mdx
@@ -0,0 +1,163 @@
+---
+title: Storage is now available in Supabase
+description: Launching Supabase Storage and how you can use it in your apps
+author: inian
+image: storage/ph-1.png
+thumb: storage/ph-1.png
+tags:
+ - supabase
+ - storage
+date: '03-30-2021'
+---
+
+Today, we are launching one of most requested features - Storage! When you sign up for Supabase, you get a Postgres database with realtime subscriptions, user management, auto-generated APIs and now a scalable object store. These services integrate very well with each other and you don't need to sign up for yet another service just for your storage requirements.
+
+As with anything that we build in Supabase, Storage is fast, secure and scalable. You can use it to store terabytes of Machine Learning training data, your e-commerce product gallery or just your growing collection of JPEGs featuring cats playing synths in space.
+
+This post outlines our design decisions while building Storage, and we'll show you how to use it in your own applications.
+
+## Architecture
+
+There are three key components to Supabase Storage:
+
+- Backend (where the objects are actually stored).
+- Middleware (access and permissions). This consists of an API Server and Postgres.
+- Frontend (a nice UI).
+
+
+
+The Storage API server sits behind Kong, an API Gateway. It talks to different storage backends like S3, Backblaze, etc to retrieve and store objects.
+
+Object metadata and security rules are stored in your Postgres database.
+
+We have built a powerful file explorer right into the dashboard, and using our Client libraries you can integrate Storage into your applications.
+
+## Frontend
+
+We set out to build the most usable front-end for storing content. Using Lists to display file hierarchies is a poor experience for exploring files - the most common use-case of a shared File system.
+
+As avid Mac users, we've defaulted to using the column-based explorer in Finder as it allow us to quickly drill into nested folders and provides a clear birds eye view of file hierarchies at the same time.
+
+We put in a lot of effort to make sure that the dashboard is fast and easy to navigate with our miller-based column view, allowing you to get to deeply nested folders quickly. If you're a fan of List Views though, don't worry! We have that option available too. The choice is yours.
+
+
+
+Our File Browser also has a rich preview for a wide set of file types including images, audio, and videos.
+
+
+
+And if you already know the location of a file but want to save a few clicks, you can paste the path into the location bar and navigate to it directly.
+
+
+
+## Designing the storage middleware
+
+We focused on performance, security and interoperability with the rest of the Supabase ecosystem.
+
+### **Integration with the Supabase ecosystem**
+
+Supabase is a [collection of open source tools](/docs#how-it-works) which integrate very well with each other. We evaluated open source object storage servers like [Ceph](https://ceph.io/), [Swift](https://www.openstack.org/software/releases/ocata/components/swift), [Minio](https://min.io/) and [Zenko](https://github.com/scality/Zenko) but none of these tools were a good fit for our existing ecosystem.
+
+**Postgres Compatibility**
+
+Each of these open source tools are amazing, but they all had a major drawback - we couldn't use Postgres as the server's datastore. If you haven't noticed yet, our team likes Postgres a lot 😉.
+
+For example, Minio [uses etcd](https://docs.min.io/docs/minio-multi-user-quickstart-guide.html) (when used in multi-user gateway mode) and Zenko [requires mongodb and Kafka.](https://zenko.readthedocs.io/en/latest/operation/Architecture/index.html) Every project on Supabase is a dedicated Postgres database, so leveraging it for object and user metadata is more efficient, reducing the number of dependencies for anyone using the Supabase ecosystem of tools.
+
+**Smaller footprint**
+
+We are using managed services like [S3](https://aws.amazon.com/s3/), [Wasabi](https://wasabi.com/) and [Backblaze](https://www.backblaze.com/) for our storage backend. We won't be managing our own hard disks and storage capacity, and so we don't require a lot of features offered by existing tools. For example, a large part of Minio's codebase is to offer erasure encoding and bitrot protection, automatically making use of new disks attached to the cluster.
+
+**Integration with Supabase Auth**
+
+Existing tools do not play well with our authentication system. For example, Minio is bundled with its own [auth system](https://docs.min.io/docs/minio-admin-complete-guide.html#user) and there is no easy way to map Minio users to [Supabase users](/docs/guides/auth).
+
+In the end, we opted to build our own [Storage API server](https://github.com/supabase/storage-api).
+
+## Security
+
+### Authentication
+
+Our storage service sits behind [Kong](https://github.com/kong/kong) along with other services like [PostgREST](https://github.com/PostgREST/postgrest) and [Realtime](https://github.com/supabase/realtime). This allows us to reuse our existing Authentication system - any requests with a valid API key are authenticated and passed to the storage API.
+
+### Authorization
+
+For Authorization, we wanted to avoid creating a new DSL like Firebase. Instead, we created one where you can write policies in the One True Language - SQL!
+
+
+
+To do this, we leverage Postgres' Row Level Security. We create a table for `buckets` and `objects` inside each Supabase project. These tables are namespaced in a separate schema called `storage`.
+
+The idea is simple - if a user is able to `select` from the `objects` table, they can retrieve the object too. Using Postgres' Row Level Security, you can define fine-grained Policies to determine access levels for different users.
+
+When a user makes a request for a file, the API detects the user in the `Authorization` header and tries to `select` from the `objects` table. If a valid row is returned, the Storage API pipes the object back from S3. Similarly if the user is able to delete the row from the objects table, they can delete the object from the storage backend too.
+
+For example, if you want to give "read" access to a bucket called `avatars` you would use this policy:
+
+```sql
+create policy "Read access for avatars."
+on storage.objects for select using (
+ bucket_id = 'avatars'
+);
+```
+
+Extending this example, if you want to give access to a subfolder only (in this case called `public`):
+
+```sql
+create policy "Read access for public avatars."
+on storage.objects for select using (
+ bucket_id = 'avatars'
+ and (storage.foldername(name))[1] = 'public'
+);
+```
+
+We have created helper functions like `foldername()`, `filename()` and `extension()` in the storage schema to make Policies even simpler.
+
+This system integrates with our [User Management system](/docs/guides/auth). Here is an example policy which gives access to a particular file to a Supabase user:
+
+```sql
+create policy crud_uid_file
+on storage.objects for all using (
+ bucket_id = 'avatars'
+ and name = 'folder/only_uid.jpg'
+ and auth.uid() = 'd8c7bce9-cfeb-497b-bd61-e66ce2cbdaa2'
+);
+```
+
+Using the power of Postgres' Row Level Security, you can create pretty much any policy imaginable.
+
+### Performance
+
+The storage server is built with [Fastify](https://www.fastify.io/) and Typescript. Fastify is one of the [fastest](https://www.fastify.io/benchmarks/) Node frameworks and our initial benchmark results look very promising.
+
+We use Node streams everywhere. Objects are uploaded directly to S3 with minimal in-memory buffering. This minimizes RAM consumption even while uploading huge objects. The code does become a bit more complicated when using streams. For example, you can't figure out the size of the object being uploaded before streaming it to S3. But we believe this tradeoff is worth it.
+
+Postgres is another hidden gem for our storage performance. For example, what if you had a bucket with thousands of objects, and you needed to find all objects which a user has access to? Without Postgres, you would retrieve all objects from that folder, evaluate each policy in the storage middleware and only return the objects which the user has access to. But we can avoid this completely with Postgres! We use Postgres to evaluate all the polices, and the storage middleware just returns the objects which the user has access to.
+
+Supabase Storage has some opinionated defaults with respect to caching. Objects retrieved from S3 typically do not have a `Cache-Control` header. This isn't optimal for a Storage system since browsers don't cache objects completely without this header. Objects retrieved from Supabase Storage by default have a Cache-Control header of 1 hour. Of course, you can override this behaviour by specifying a different cache time when creating the object.
+
+## Storage Backend
+
+File objects are stored in an S3 bucket within the same region as your Supabase project. S3 has a high durability of 99.999999999% and is scalable as an object store.
+
+While we started with S3, other storage backends like Wasabi, Backblaze and Openstack Swift expose an S3 compatible API. It will be simple to add more S3 compatible storage options in the future.
+
+We have intentionally kept the API surface for the storage backend very small, in case the community also wants to add storage options which don't support the S3 API.
+
+### Client libraries
+
+You may be itching to get started tinkering around with our new Supabase storage - we have an example app prepared for you right [here](https://github.com/supabase/supabase-js/tree/master/example/next-storage) which simulates a simple context of setting an avatar image for a user. This will help you to get a high level overview of how to use your project's storage with our client library. For greater detail, refer to our storage API documentation [here](/docs/reference/javascript/storage-createbucket).
+
+
+
+
+
+## What's next
+
+- We currently support S3 and will be adding more storage backends. Vote for the storage backends you would like to see us implement [here](https://github.com/supabase/supabase/discussions/982).
+- We will integrate our storage service with a Content Delivery Network. With a CDN, objects are cached on a global network. This leads to faster access times for your users around the world.
+- We are working on transformations like resizing of images and automatic optimization of different media types. This makes it easy to embed Supabase objects directly in your websites and mobile applications without additional processing.
+- A better editor to make authoring policies easier and less error prone.
+- Reach out to us if you would like to help out with adding storage support in one of the [community maintained client libraries](/docs/reference/javascript/supabase-client).
+
+Take it for a spin on our [dashboard](http://app.supabase.io/) and let us know what you think!
diff --git a/www/_blog/2021-03-31-supabase-cli.mdx b/www/_blog/2021-03-31-supabase-cli.mdx
new file mode 100644
index 00000000000..b899d83558b
--- /dev/null
+++ b/www/_blog/2021-03-31-supabase-cli.mdx
@@ -0,0 +1,227 @@
+---
+title: Supabase CLI
+description: Local development, database migrations, and self-hosting.
+author: soedirgo
+image: cli/cli-og.jpg
+thumb: cli/cli-og.jpg
+tags:
+ - supabase
+ - storage
+date: '03-31-2021'
+---
+
+**UPDATE:** The Node.js CLI is now obsolete. Follow the latest instructions [here](/docs/guides/local-development).
+
+Today is Day 3 of [Launch Week](/blog/2021/03/25/launch-week), and as promised - we're releasing our CLI.
+
+This is the first step in a long journey of features we plan to deliver:
+
+- Running Supabase locally
+- Managing database migrations
+- Generating types directly from your database schema
+- Generating API and validation schemas from your database
+- Managing your Supabase projects
+- Pushing your local changes to production
+
+Here are some of the items we have completed so far.
+
+## Running Supabase Locally
+
+You can now run Supabase on your local machine, using Docker Compose. This Docker setup is 100% compatible with every project on Supabase - the tools used for local development are exactly the same as production.
+
+We have released a full set of documentation [here](/docs/guides/local-development). In this post we thought it would be useful to highlight how easy it is to get started.
+
+A lot of Supabase developers are familiar with React, so here are the steps you would use to create a new React project which uses Supabase as a backend.
+
+Install the CLI:
+
+```bash
+npm install -g supabase
+```
+
+Set up your React app:
+
+```bash
+# create a fresh React app
+npx create-react-app react-demo --use-npm
+
+# move into the new folder
+cd react-demo
+
+# Save the install supabase-js library
+npm install --save @supabase/supabase-js
+```
+
+Set up Supabase:
+
+```bash
+supabase init
+
+# ✔ Port for Supabase URL: · 8000
+# ✔ Port for PostgreSQL database: · 5432
+# ✔ Project initialized.
+# Supabase URL: http://localhost:8000
+# Supabase Key (anon, public): eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoiYW5vbiJ9.36fUebxgx1mcBo4s19v0SzqmzunP--hm_hep0uLX0ew
+# Supabase Key (service_role, private): eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoiYW5vbiJ9.36fUebxgx1mcBo4s19v0SzqmzunP--hm_hep0uLX0ew
+# Database URL: postgres://postgres:postgres@localhost:5432/postgres
+```
+
+Now that your application is now prepared, you can use Supabase anywhere in your application (for example, `App.js`):
+
+```jsx
+import { createClient } from '@supabase/supabase-js'
+const SUPABASE_URL = 'http://localhost:8000'
+const SUPABASE_ANON_KEY =
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoiYW5vbiJ9.36fUebxgx1mcBo4s19v0SzqmzunP--hm_hep0uLX0ew'
+const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)
+```
+
+Then start the backend and the frontend:
+
+```bash
+supabase start # Start Supabase
+npm start # Start the React app
+```
+
+If everything is working you should have a React app running on `http://localhost:3000` and Supabase services running on `http://localhost:8000`!
+
+### Next steps:
+
+Soon we will give you the ability to push your changes from your local machine to your Production project. How will we do that? Migrations!
+
+## Migrations
+
+Database Migrations are a process to "change" your database schema. In a NoSQL database you don't need migrations, because you can insert any JSON data without validation. However with Relational databases you define your schema upfront, and the database will reject data which doesn't "fit" the schema. This is one of the reasons Relational databases are so scalable - schemas ensure data integrity.
+
+Just like an application though, a database schema needs to be constantly updated. And that's where migrations fit! Migrations are simply a set of SQL scripts which change your database schema.
+
+There is one problem however: there is [no "right" way](https://news.ycombinator.com/item?id=21405501) to do migrations.
+
+### Diffs
+
+At Supabase, we do have one strong preference. We like schema "diffing" over "manual migrations".
+
+Manual migrations work like this:
+
+- A developer thinks about all the changes they want to make to their database
+- They create a SQL script which will cause those changes
+- They run that script on their database
+
+After a while though, these scripts pile up - the `migrations` folder can contain hundreds of migration scripts. This method is also "version control" on top of another version control system (i.e. git).
+
+A "diff" tool works like this:
+
+- a developer makes all the changes they desire to a local database
+- they use a tool to compare their local database to the production database
+- the tool then generates all the SQL scripts that are required, and runs them on the target database
+
+In this case, the tool does all the hard work. This is obviously an ideal state. Databases schemas are declarative, and when you check them into git, you can see their evolution over time. The hard part is finding a tool which can handle all the edge-cases of database diff'ing.
+
+### Choosing the best diff tool
+
+After evaluating these OSS tools:
+
+- [migra](https://github.com/djrobstep/migra) (Python)
+- [dbdiff](https://github.com/gimenete/dbdiff) (JS)
+- [pgdiff](https://github.com/joncrlsn/pgdiff) (Go)
+- [apgdiff](https://github.com/fordfrog/apgdiff) (Java)
+- [pgquarrel](https://github.com/eulerto/pgquarrel) (C)
+- [pgAdmin Schema Diff](https://www.pgadmin.org/docs/pgadmin4/development/schema_diff.html) (Python)
+
+We found that the most complete one was the pgAdmin Schema Diff, migra came a close second.
+
+The deciding factor was if the tool could track an owner change for a VIEW.
+
+```sql
+ALTER VIEW my_view OWNER TO authenticated;
+```
+
+This is critical for Row Level Security to work with views. For policies to kick in on views, the owner must not have `superuser` or `bypassrls` privileges. Currently migra doesn't track this change ([issue](https://github.com/djrobstep/migra/issues/160)), while the pgAdmin Schema Diff does.
+
+There was a problem in using the [pgAdmin Schema Diff](https://www.pgadmin.org/docs/pgadmin4/development/schema_diff.html) though, it's a GUI-only tool.
+
+
+
+So we did what we always strive to do - improve existing open source software. We created a CLI mode for the Schema Diff on [our repo](https://github.com/supabase/pgadmin4/blob/cli/web/cli.py). We've also released a [docker image](https://hub.docker.com/r/supabase/pgadmin-schema-diff) for a quick start.
+
+The CLI offers the same functionality as the GUI version. You can diff two databases by specifying the connection strings like shown below.
+
+```bash
+docker run supabase/pgadmin-schema-diff \
+ 'postgres://user:pass@local:5432/diff_source' \
+ 'postgres://user:pass@production:5432/diff_target' \
+ > diff_demo.sql
+
+Starting schema diff...
+Comparision started......0%
+Comparing Event Triggers...2%
+Comparing Extensions...4%
+Comparing Languages...8%
+Comparing Foreign Servers...14%
+Comparing Foreign Tables of schema 'public'...28%
+Comparing Tables of schema 'public'...50%
+Comparing Domains of schema 'test_schema_diff'...66%
+Comparing Foreign Tables of schema 'test_schema_diff'...68%
+Comparing FTS Templates of schema 'test_schema_diff'...76%
+Comparing Functions of schema 'test_schema_diff'...78%
+Comparing Procedures of schema 'test_schema_diff'...80%
+Comparing Tables of schema 'test_schema_diff'...90%
+Comparing Types of schema 'test_schema_diff'...92%
+Comparing Materialized Views of schema 'test_schema_diff'...96%
+Done.
+
+## the diff is written to diff_demo.sql
+```
+
+A sample diff can be seen on this [gist](https://gist.github.com/steve-chavez/3f286a233806aeee0bcea4a47f97f0b5). This was generated by diffing these [two databases](https://github.com/supabase/pgadmin4/tree/cli/web/pgadmin/tools/schema_diff/tests/pg/10_plus).
+
+On these [lines](https://gist.github.com/steve-chavez/3f286a233806aeee0bcea4a47f97f0b5#file-diff_demo-sql-L1022-L1023), you can see how it tracks the view's owner change (note: the `ALTER TABLE` statement is interchangeable with `ALTER VIEW` in this case). Additionally, you can see that it handles [domains](https://gist.github.com/steve-chavez/3f286a233806aeee0bcea4a47f97f0b5#file-diff_demo-sql-L278-L287) just fine, this is an edge-case that other diff tools don't handle.
+
+Also, similarly to the pgAdmin GUI:
+
+- You can include and exclude database objects from the diff with `--include-objects` or `--exclude-objects`
+- You can choose a single schema to diff with the `--schema` argument or you can pick different schemas to compare with the --source-schema and --target-schema arguments. We recommend you do this for Supabase databases. Diffing the whole database can take a while because of the `extensions` schema (especially if you enable PostGIS, which adds many functions).
+
+### Next steps
+
+Once we have added logins to the CLI, we will be able to use Migrations to create a seamless workflow between local development and your production database.
+
+Also, the pgAdmin team has showed [interest](https://www.postgresql.org/message-id/CA%2BOCxoyjZhV9stFMAQ-QhHuA0%2BdLQD5XD_YT%2BQo2vY0GhkBKFw%40mail.gmail.com) in including our Schema Diff CLI in the official pgAdmin. We'll be working with them to include this change upstream to benefit the whole community.
+
+## Self Hosting
+
+Finally, we are adding one critical command to our CLI for everybody who wants to self-host:
+
+```bash
+supabase eject
+```
+
+This gives you everything you need to run the Supabase stack.
+
+After running the command inside the terminal, you will see three items:
+
+- `docker-compose.yml` (file)
+- `kong` (directory)
+- `postgres` (directory)
+
+If you have an existing Postgres database running elsewhere you can easily drop the Postgres directory but first make sure you do these three things:
+
+- run the .sql files from the Postgres directory on your existing database
+- update all references to the DB URI in `docker-compose.yml` to your existing database
+- run [these steps](https://github.com/supabase/realtime#server) to enable replication inside the database, so that the realtime engine can stream changes from your database
+
+You may also want to play with the environment variables for each application inside `docker-compose.yml`. [PostgREST](https://postgrest.org/en/v7.0.0/configuration.html) has many additional configuration options, as does [GoTrue](https://github.com/supabase/gotrue#configuration). In the hosted version of Supabase we connect our own SMTP service to GoTrue for sending auth emails, so you may also want to add these settings here in order to enable this.
+
+Also check `kong.yml` inside the `kong` directory where you'll see how all the services are routed to, and with what rules, down the bottom you'll find the JWTs capable of accessing services that require API Key access.
+
+Once you're all set, you can start the stack by running:
+
+```bash
+docker-compose up
+```
+
+Head over to the [Self Hosting Docs](/docs/guides/self-hosting) for a more complete walk through, it also includes several [one-click deploys](/docs/guides/self-hosting#one-click-deploys), so you can easily deploy into your own cloud hosting provider.
+
+If you require any assistance feel free to reach out in our [github discussions](https://github.com/supabase/supabase/discussions) or at support@supabase.io.
+
+Check out what else we've [launched this week](/blog/2021/03/25/launch-week), contribute to the [CLI repo](https://github.com/supabase/cli), or go here for the [hosted version](https://app.supabase.io).
diff --git a/www/_blog/2021-04-01-supabase-nft-marketplace.mdx b/www/_blog/2021-04-01-supabase-nft-marketplace.mdx
new file mode 100644
index 00000000000..f3719b8c23f
--- /dev/null
+++ b/www/_blog/2021-04-01-supabase-nft-marketplace.mdx
@@ -0,0 +1,39 @@
+---
+title: Supabase Launches NFT Marketplace
+description: A fully encrypted NFT platform to protect and transact your digital assets
+author: ant_wilson
+author_title: Supabase
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: nft/nft-3.png
+thumb: nft/nft-3.png
+tags:
+ - supabase
+ - nfts
+date: '04-01-2021'
+---
+
+### Crypto at Supabase
+
+Most people don’t know this but the Supabase team has a long history of involvement in the NFT game. In 2018, Copple and Rory were minted as NFTs on Blockpunk.net , an Ethereum based Anime-NFT platform that four Supabase core team members helped build. We also helped in the building of the world’s first tokenised anime premiere - Vevara in Your Dream .
+
+The team were also founding members of the Guacchain Foundation , an economic experiment in a deflationary-based monetary system, inspired by the fact that Avacados ripen faster when stored together.
+
+NFTs are now capturing the imagination of speculators everywhere, but NFTs as they exist today have a major flaw. We call it the _Copy-Paste Problem_. The Copy-Paste problem is when a token contains a URL to an image hosted on the web, or even on IPFS; there is nothing stopping someone who does not own the token, from heading to that URL, and just downloading the image for themselves.
+
+As our latest foray into NFTs we’re announcing BuyMeth.com , (Meth = [M]isleading [E]ncrypted [Th]umbnails) an NFT marketplace that solves the copy-paste problem of NFTs today.
+
+
+
+### How does it work?
+
+Each NFT stores a blurhash representation of a full image, but also a link to the full encrypted version of the image stored on IPFS. The full image is always encrypted with the key of the _current_ owner.
+
+When a sale is initiated i.e. the seller accepts a buyers offer, Metamask re-encrypts the image with the public key of the buyer, and uploads it to IPFS, the url in the NFT is updated and the buyer assigned as the new owner. After the sale, a 1 week challenge period is initiated where the proceeds of the sale are kept in an escrow contract. The buyer can then decrypt the contents of the image, and can run an automated verification function to verify that the image received (when hashed) does indeed produce the publically available blurhash (or thumbnail). If it does not, then the buyer can submit a claim to the sales contract, along with a proof of the invalid file, and claim back the proceeds.
+
+
+
+As a way to dis-incentivise previous owners of the image to not reveal the original image, we bake in a royalty mechanism, whereby previous owners receive a fraction of the sale price each time, the artwork changes hands.
+
+Despite the undeniable value of such a platform, this announcement is of course an April Fools joke. We are not launching a Supabase NFT platform; but we are [Launching a TON of other stuff this week](/blog/2021/03/25/launch-week).
diff --git a/www/_blog/2021-04-02-supabase-dot-com.mdx b/www/_blog/2021-04-02-supabase-dot-com.mdx
new file mode 100644
index 00000000000..0788731e8c5
--- /dev/null
+++ b/www/_blog/2021-04-02-supabase-dot-com.mdx
@@ -0,0 +1,77 @@
+---
+title: Supabase Dot Com
+description: The Supabase Domain name is changing.
+author: paul_copplestone
+author_title: Supabase
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: supabase-dot-com-og.jpg
+thumb: supabase-dot-com-og.jpg
+tags:
+ - supabase
+date: '2021-04-02'
+---
+
+_tl;dr_ During the next week, we'll be migrating from "supabase.io" to "supabase.com".
+
+There are no changes required on your end. Your API URLs will remain on "supabase.co", and only our website URLs will change.
+
+The rest of this post talks a bit about the origin of the name, but there's nothing important to know.
+
+## SupaWhat?
+
+At the end of 2019 we released a Postgres [Realtime](https://github.com/supabase/realtime) engine on GitHub.
+We created this in my previous company after migrating from Firebase to Postgres.
+
+It started gaining traction (if you count "GitHub stars" as traction) and so I tapped my friend, [Ant](https://twitter.com/AntWilson),
+on the shoulder to see if he wanted to build an open source company with me (he was building another start up at the time).
+
+The company we envisaged had Postgres at the core. We searched for every "dot com" we could think of with "base" in the name - hyperbase,
+superbase, suprabase, uberbase. It turns out this is what every database start does. We couldn't find any good "dot coms".
+And so we moved on to "dot io" domains.
+
+Anybody who knows Ant, knows that he [loves memes](/blog/2021/03/25/launch-week). While we were brainstorming
+we found that "supabase.io" was available.
+
+To be honest, this name wasn't a strong contender, but it served a very important purpose - it was extremely "meme-able" because
+it sounds similar to Nikki Minaj's [Super Bass](https://youtu.be/4JipHEz53sU).
+
+We chose it as a placeholder and found it was, indeed, very funny to send each other Nikki memes while we brainstormed the business.
+
+
+
+Note to anyone starting a business, don't use a placeholder. You'll never change it.
+
+Luckily for us, the name [grew on us](https://news.ycombinator.com/item?id=23325430) and now we love it.
+
+## Supabase Dot Com
+
+When we joined Y Combinator, they gave this advice:
+
+> Except in unusual circumstances (like [Twitch.tv](http://twitch.tv/)), if you don't have the .com version of your name,
+> you should probably change it.
+
+We decided to try purchasing [supabase.com](http://supabase.com) from the current owner. The YC forums were full of founders
+recommending a particular Domain Specialist who would help us negotiate and purchase the domain. The only catch - he would take
+a percentage of the purchase price.
+
+This struck us as odd. The incentives were more aligned to the domain seller than the purchaser.
+
+We're not afraid to roll up our sleeves at Supabase, so we decided we could handle it ourselves.
+
+We were in for a huge surprise. After searching on the (old) [supabase.com](http://supabase.com) website, we found a company address.
+And it was literally 100m from my home.
+
+Of all the places in the world that the domain could be registered, the owner was within yelling-distance. But we didn't yell. We simply
+asked, and after some negotiation, the owner agreed to sell it.
+
+We were always willing to walk away from the Supabase brand if we needed to, but the price was reasonable for both parties. There really
+isn't much more to it than that.
+
+## What's next?
+
+Over the next few weeks, we'll update our domain name across most of the sites. If you're using a Supabase database and API, you're on
+a ".co" domain so your apps won't be affected at all.
+
+You may also find some [easter eggs](https://twitter.com/AntWilson/status/1354343248098070530) appear ...
diff --git a/www/_blog/2021-04-02-supabase-pgbouncer.mdx b/www/_blog/2021-04-02-supabase-pgbouncer.mdx
new file mode 100644
index 00000000000..6e55887e072
--- /dev/null
+++ b/www/_blog/2021-04-02-supabase-pgbouncer.mdx
@@ -0,0 +1,99 @@
+---
+title: PgBouncer is now available in Supabase
+description: Better support for Serverless and Postgres.
+author: angelico_de_los_reyes
+author_title: Supabase
+author_url: https://github.com/dragarcia
+author_image_url: https://github.com/dragarcia.png
+authorURL: https://github.com/dragarcia
+image: bouncer/pgbouncer-og.jpg
+thumb: bouncer/pgbouncer-thumb.jpg
+tags:
+ - database
+ - engineering
+date: '2021-04-02'
+---
+
+Javascript Frameworks like [Next.js,](https://nextjs.org/) [Redwood](https://redwoodjs.com/), [Blitz](https://blitzjs.com/), and tools
+like [Prisma](https://www.prisma.io/docs/guides/deployment/deployment#pgbouncer) are all moving in one direction. Serverless.
+
+Serverless functions work great for developers using the Supabase API because we manage a [PostgREST](https://postgrest.org/en/v7.0.0/)
+server for every project. Supabase also provides direct access to the Postgres database, so that developers can connect any tool they want.
+Unfortunately, Serverless function don't work well for direct Postgres connections (for reasons we'll discuss soon).
+
+Jamstack developers make up a large portion of the Supabase Community. While we'd love for developers to use PostgREST, we mostly want
+developers to use Postgres. This means supporting the tools which they already love.
+
+So today we are adding [PgBouncer](https://www.pgbouncer.org/), an open source connection pooler for Postgres.
+
+## What is Connection Pooling?
+
+
+
+Typically when a client connects to a PostgreSQL database, they need to open and manage their own database connection. With a connection pool,
+connections are already opened and available for use. When a client makes a request, they use a connection from the pool. When the transaction
+or session is completed the underlying connection is simply returned to the pool and is once again free to be used by another user or application.
+
+### Handling connection surges
+
+In a traditional architecture, middleware servers (e.g. APIs) manage a small number of connection to a Postgres database.
+Essentially, the middleware server is a connection pool.
+
+In a Serverless environment, there is no middleware server to maintain a connection, so they create a **new** connection for
+each concurrent request. Since Serverless functions are typically used for bursty workloads, this can end up opening a lot of
+connections to the database and overwhelm your Postgres server.
+
+Connection pools mitigate this. Connections are opened beforehand and recycled across users and applications. What's more,
+[connection pools are specialized for this task](https://medium.com/@k.wahome/database-connections-less-is-more-86c406b6fad).
+A small number of connections is sufficient to handle demand ten, twenty times its size, or even more. Whenever a new connection
+is required it is taken from a pool of open and available connections instead of initializing an entirely new one. This eliminates
+the need to spawn a new process.
+
+## Misconceptions
+
+It's a common misconception that PgBouncer increases the number of connections a Postgres instance can open.
+This is not the case. If Postgres is configured for a maximum of 50 connections before connection pooling, it
+will still only be able to open 50. Connection pooling simply keeps connections open and idle, ready to accept clients. Nevertheless,
+as mentioned above, PgBouncer allows your database to be able to handle more than it can without a connection pool.
+
+## Connection "Queuing"
+
+PgBouncer is like a Queue. With regular Postgres, when you hit your connection limit, new connections are rejected. PgBouncer overcomes this
+limitation. When all connections in the pool are in-use, it doesn't reject any incoming requests. Instead,
+[PgBouncer queues them](https://www.percona.com/blog/2021/02/26/connection-queuing-in-pgbouncer-is-it-a-magical-remedy/) until a
+connection is returned to the pool and made available. This doesn't mean connection pooling is a magic bullet. If your clients is
+running expensive queries then the connections might take a long time before they are returned to the pool. The natural solution to
+this is to increase your database resources so that it processes queries faster or PgBouncer can open more connections.
+
+## Using Connection Pooling in Supabase
+
+
+
+From today, all new projects will include connection pooling. In the `Database` section of our dashboard, you will notice a new section for it.
+Under the hood, we utilise PgBouncer which is installed in the same server as PostgreSQL. Through the dashboard, we provide you with the
+necessary connection details to start using the connection pool as well as the ability to modify `Pool Mode`. Not sure which mode to use?
+Below is a quick primer on each mode.
+
+## Pool modes
+
+`Pool Mode` determines how PgBouncer handles a connection.
+
+### Session
+
+When a new client connects, a connection is assigned to the client until it disconnects. Afterward, the connection is returned back to the pool. All PostgreSQL features can be used with this option.
+
+### Transaction
+
+This is the suggested option for serverless functions. With this, the connection is only assigned to the client for the duration of a transaction. Once done, the connection is returned to the pool. Two consecutive transactions from the same client could be done over two, different connections. Some session-based PostgreSQL features such as prepared statements are not available with this option. A more comprehensive list of incompatible features can be found [here](https://www.pgbouncer.org/features.html).
+
+### Statement
+
+This is the most granular option. Connections are returned to the pool after every statement. Transactions with multiple statements are not allowed. This is best used when `AUTOCOMMIT` is in use.
+
+## What's next?
+
+Try out connection pooling now with a new project in the [dashboard.](http://app.supabase.io) For now, we do not have any plans to port this over to older projects.
+
+Eventually, we will expose more PgBouncer settings to the UI such as `Pool Size`. At the moment it is set to `15`.
+
+We are still working towards getting the latest version of Supabase Postgres to both the AWS and Digital Ocean marketplaces. Follow us on [Twitter](https://www.notion.so/PgBouncer-is-now-available-in-Supabase-345a74d402464670923cf404b714a354) to be informed once it's released!
diff --git a/www/_blog/2021-04-02-supabase-workflows.mdx b/www/_blog/2021-04-02-supabase-workflows.mdx
new file mode 100644
index 00000000000..331fa7ad48b
--- /dev/null
+++ b/www/_blog/2021-04-02-supabase-workflows.mdx
@@ -0,0 +1,234 @@
+---
+title: Workflows are coming to Supabase
+description: Functions are great, but you know what's better?
+author: fracek
+author_title: Supabase
+author_url: https://github.com/fracek
+author_image_url: https://github.com/fracek.png
+authorURL: https://github.com/fracek
+image: workflows/workflows-og.jpg
+thumb: workflows/workflows-thumb.jpg
+tags:
+ - functions
+ - workflows
+date: '2021-04-02'
+---
+
+This week we [launched Supabase Storage](/blog/2021/03/30/supabase-storage), which leaves one other huge piece of the
+stack that everyone is asking for: Functions.
+
+## TLDR
+
+We're not releasing Functions today. Trust us, we know you want them. They are coming, just not today.
+
+But we are building something that we think you're going to like: Workflows. We haven't finished building it yet, but Workflows are
+a "piece" of the Function story and arguably an even more exciting feature.
+
+
+
+## Firebase Functions
+
+Firebase functions are relatively simple. If you use Serverless, AWS Lambda, Cloudflare Workers, Next.js API routes, or
+Netlify Functions, then you know how they work. A Firebase function executes some code which you provide, without you managing a server.
+
+Specifically for Firebase, they have another key feature - they can be triggered by database events. For example, you can
+trigger a function whenever a Firestore Document is updated.
+
+This is great, but it is still limited for a few real-world use cases. For example, what if you want to send an email to a user
+one day after a user signs up. Or one year? There is no queuing functionality in Firebase. You'd have to manage a process like
+this yourself, probably using a cron-job.
+
+## A better solution?
+
+We searched for some open source tools which we think are solving this problem well. We looked at
+[NodeRed](/blog/2021/03/30/supabase-storage#designing-the-storage-middleware), [n8n](https://n8n.io/),
+[Airflow](http://airflow.apache.org/blog/airflow-two-point-oh-is-here/), and about 10 other tools. They are amazing tools on their
+own, but for the Supabase Stack they ultimately had the
+[same shortcomings](/blog/2021/03/30/supabase-storage#integration-with-the-supabase-ecosystem) that we found
+with Storage providers - most of them lacked deep Postgres integration.
+
+We went back to the drawing board and asked, "if we could wave a wand and get the perfect solution, what would it look like?".
+The tool that came very close is [AWS Step Functions](https://aws.amazon.com/step-functions/). The only problem: it's not open source.
+Luckily, their [state language](https://states-language.net/spec.html) is.
+
+Using this states language, we are [building an open source orchestration engine](https://github.com/supabase/workflows) for
+managing very complex Workflows with queueing, etc. It will be built with Elixir.
+
+This engine won't execute code. Instead, it will coordinate and execute existing functions wherever they live: AWS, GCP, Azure,
+OpenFaas, and of course Postgres.
+
+We plan to add "modules" which work natively: email services, notification services, and other platforms.
+
+The engine is deeply integrated with Postgres. `Jobs`, `queues`, and `logs` will be stored and accessible by SQL. We'd like to give a shoutout to the [Oban](https://getoban.pro) team here, their robust job processing was a big missing piece for the engine. And most importantly, it's backed by Postgres!
+
+Once ready, we will make this available in the Supabase Dashboard with a Zapier-like interface.
+
+## What are Workflows
+
+Workflows orchestrate and execute functions in response to a database event (insert, update, delete) or a HTTP call (direct invocation).
+
+You can use them to rapidly develop microservices (once we have functions) without worrying about servers.
+
+Workflows are stateless - the output of a state becomes the input of the next state.
+
+Workflows are defined using Amazon States Languages, so you can import your workflows from AWS (although we are still building handlers
+for most AWS resources).
+
+Workflows can be _persistent_ (the default). This means they are tolerant to server restarts, but it also means they need to use
+the database to store their state.
+
+Workers can be _transient._ These are fully in-memory if you don't want to store the execution state (for example, IoT
+applications that trigger workflows very often). Transient workflows are not restarted if the server crashes or is restarted.
+
+## Example
+
+A typical use-case for workflows is sending emails. For example, you might want to send a user an email one day after they
+sign up. In database terms we can say: "trigger an email workflow whenever there is an insert on the `users` table."
+
+Let's break this down into steps, then tie it all together at the end:
+
+### Sending an email
+
+```yaml
+SendEmail:
+ Type: Task
+ Next: Complete
+ Resource: my-email-service
+ Parameters:
+ api_key: my-api-key
+ template_id: welcome-email
+ payload:
+ name.$: '$.record.name'
+ email.$: '$.record.email'
+```
+
+Here we have a "Task" which triggers a call to an email service (like Mailgun or Postmark). Specifically, it's telling
+the service to send the `welcome-email` template, and it's providing it a `name` and an `email` as parameters.
+
+### Waiting a day
+
+Since we don't want to send the email immediately, we need to tell Workflows to wait one day
+
+```yaml
+WaitOneDay:
+ Type: Wait
+ Next: SendEmail
+ Seconds: 86400
+```
+
+Here "one day" is specified in seconds.
+
+### Trigger on insert
+
+We mentioned that you could trigger a workflow whenever there is an "insert" on the `users` table. But what if you insert
+multiple users at once? Not a problem - we can loop through all the inserts with a `Map`:
+
+```yaml
+EmailUsers:
+ Type: Map
+ End: true
+ InputPath: '$.changes'
+ Iterator:
+ StartAt: CheckInsert
+ States:
+ CheckInsert:
+ Type: Choice
+ Default: Complete
+ Choices:
+ - Variable: '$.type'
+ StringEquals: INSERT
+ Next: WaitOneDay
+```
+
+In this part, we have a task "EmailUsers", which iterates through all the database events (`$.changes`) and checks if they are INSERTs.
+
+### Tying it all together
+
+Let's see how it looks all together:
+
+```yaml
+---
+Comment: Email users after one day
+StartAt: EmailUsers
+States:
+ EmailUsers:
+ Type: Map
+ End: true
+ InputPath: '$.changes'
+ Iterator:
+ StartAt: CheckInsert
+ States:
+ CheckInsert:
+ Type: Choice
+ Default: Complete
+ Choices:
+ - Variable: '$.type'
+ StringEquals: INSERT
+ Next: WaitOneDay
+ WaitOneDay:
+ Type: Wait
+ Next: SendEmail
+ Seconds: 86400
+ SendEmail:
+ Type: Task
+ Next: Complete
+ Resource: send-templated-email
+ Parameters:
+ api_key: my-api-key
+ template_id: welcome-email
+ payload:
+ name.$: '$.record.name'
+ email.$: '$.record.email'
+ Complete:
+ Type: Succeed
+```
+
+The workflow receives the following JSON data from Supabase [Realtime](https://github.com/supabase/realtime):
+
+```json
+{
+ "changes": [
+ {
+ "columns": [
+ {
+ "flags": ["key"],
+ "name": "id",
+ "type": "int8",
+ "type_modifier": 4294967295
+ },
+ {
+ "flags": [],
+ "name": "name",
+ "type": "text",
+ "type_modifier": 4294967295
+ },
+ {
+ "flags": [],
+ "name": "email",
+ "type": "text",
+ "type_modifier": 4294967295
+ }
+ ],
+ "commit_timestamp": "2021-03-17T14:00:26Z",
+ "record": {
+ "id": "101492",
+ "name": "Alfred",
+ "email": "alfred@example.org"
+ },
+ "schema": "public",
+ "table": "users",
+ "type": "INSERT"
+ }
+ ],
+ "commit_timestamp": "2021-03-17T14:00:26Z"
+}
+```
+
+## Next Steps
+
+We've already open sourced the Workflow interpreter [here](https://github.com/supabase/workflows). It's built with Elixir,
+so you can find it on Hex [here](https://hexdocs.pm/workflows/Workflows.html).
+
+After we've ironed out a few bugs we will integrate it into the Supabase Stack. As with all Supabase features, we'll add a
+[nice UI](https://ui.supabase.com/) to make prototyping extremely rapid. We'll integrate the UI with the code (via Git) to make
+sure everything is version controlled.
diff --git a/www/_blog/2021-04-06-supabase-beta-march-2021.mdx b/www/_blog/2021-04-06-supabase-beta-march-2021.mdx
new file mode 100644
index 00000000000..49222e89cb1
--- /dev/null
+++ b/www/_blog/2021-04-06-supabase-beta-march-2021.mdx
@@ -0,0 +1,122 @@
+---
+title: Supabase Beta March 2021
+description: Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: march-2021/release-mar-2021.jpg
+thumb: march-2021/release-mar-2021.jpg
+tags:
+ - release-notes
+date: '2021-04-06'
+---
+
+Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing. Here's what we released last month.
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+## Supabase Storage
+
+Need to store images, audio, and video clips? Well now you can do it on [Supabase Storage](/blog/2021/03/30/supabase-storage). It's backed by S3 and our new [OSS storage API](https://github.com/supabase/storage-api) written in Fastify and Typescript. Read the [full blog post](/blog/2021/03/30/supabase-storage).
+
+
+
+## Connection Pooling
+
+The Supabase API already handles Connection Pooling, but if you're connecting to your database directly (for example, with Prisma) we now [bundle PgBouncer](/blog/2021/04/02/supabase-pgbouncer). Read the [full blog post](/blog/2021/04/02/supabase-pgbouncer).
+
+
+
+## React UI Component Library
+
+We open sourced our internal UI component library, so that anyone can use and contribute to the Supabase aesthetic. It lives at [ui.supabase.com](https://ui.supabase.com/) . It was also the #1 Product of the Day [on Product Hunt](https://www.producthunt.com/posts/supabase-ui).
+
+
+
+## CLI
+
+Now you can run Supabase locally in the terminal with `supabase start`. We have done some preliminary work on [diff-based schema migrations](/blog/2021/03/31/supabase-cli#migrations), and added some new tooling for self-hosting Supabase with Docker. [Blog post here](/blog/2021/03/31/supabase-cli).
+
+
+
+## Pricing
+
+Our most frequently asked question by far is "ok supabase is sweet, but how much is it going to cost?". TL;DR there's **Free Tier** up to 500mb + 10k auth users, a **Pro** **Tier** at $25/month for 8GB + 100k auth users, and anything additional is charged on a usage basis.
+
+See [Pricing Page](/pricing) for full details and also our blog on why [pricing is hard](/blog/2021/03/29/pricing).
+
+
+
+## NFT Platform
+
+Well... not really, but it made for a great [April Fools joke](/blog/2021/04/01/supabase-nft-marketplace).
+
+
+
+## Supabase Dot Com
+
+We are now dot com! We'll be porting across over the next few weeks. Read the origin story behind the name [here](/blog/2021/04/02/supabase-dot-com).
+
+
+
+## OAuth Scopes
+
+Thanks to a comunity contribution ([@\_mateomorris](https://twitter.com/_mateomorris) and [@Beamanator](https://twitter.com/Beamanator)), Supabase Auth now includes OAuth scopes. These allow you to request elevated access during login. For example, you may want to request access to a list of Repositories when users log in with GitHub. Check out the [Documentation](/docs/reference/javascript/auth-signup#sign-up-with-scopes).
+
+
+
+## Kaizen
+
+- You can now manage your PostgREST configuration inside the Dashboard.
+- Our website has been redesigned. Check out our new [Homepage](/) and [Blog](/blog), and our new [Database](/database), [Auth](/auth), and [Storage](/storage) product pages.
+- We refactored some of our Filter methods to make them even easier to use. Check out the [Full Text Search](/docs/reference/javascript/textsearch) refactor.
+- We have added several new sections to our Docs including: [Local Dev](/docs/guides/local-development), [Self Hosting](/docs/guides/self-hosting), and [Postgres Reference](/docs/reference/postgres/getting-started) docs (all still under development).
+
+## Community
+
+- How to use Supabase inside Replit [[Video](https://www.youtube.com/watch?v=lQ5iIxaYduI)]
+- [Connecting Draftbit to Supabase](https://docs.draftbit.com/docs/supabase) by [@amanhimself](https://twitter.com/amanhimself)
+- [Creating Users in Next-js](https://t.co/IKcn3mgqW0?amp=1) by [@indigitalcolor](https://twitter.com/indigitalcolor)
+- [A Backend for IndieHackers](https://drew.tech/supabase-a-backend-for-indiehackers) by [@dbredvick](https://twitter.com/DBredvick)
+- The Firebase Alternative by [Simon Grimm](https://www.youtube.com/user/saimon1924) [[Video](https://www.youtube.com/watch?v=F6VyIXFQVtQ)]
+- Ionic Integration by [Simon Grimm](https://www.youtube.com/user/saimon1924) [[Video](https://www.youtube.com/watch?v=pl9XfIWutKE)]
+- Flutter Integration by [Aditya Thakur](https://www.youtube.com/channel/UChCAJNpMwoEUYCsE_eSyU4w) by [[Video](https://www.youtube.com/watch?v=fqfHEZvQPlY)]
+- Svelte Integration by [Khaerunnisa Isnaeni](https://www.youtube.com/channel/UCqNDj6eQeTLHuEwgEHWOGjw) [[Video](https://www.youtube.com/watch?v=odPYzJJyEJI)]
+- An [example app](https://github.com/supabase/supabase/tree/master/examples/nextjs-ts-user-management) for adding User Profiles to your Next.js app
+
+
+
+
+ Source: repository.surf/supabase
+
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or [follow us on Twitter](https://twitter.com/supabase).
+
+## Coming Next
+
+Lets say for each new sign up, you want to trigger a slack alert, send them an email after 24 hours.
+
+For this we are working on our own [Workflow engine](/blog/2021/04/02/supabase-workflows), it will eventually have a Zapier-like interface inside the dashboard. For now it's a state-machine interpreter (fully compatible with Amazon States Language) written in Elixir, [open source](https://github.com/supabase/workflows), and ready for community contributions.
+
+
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-05-03-supabase-beta-april-2021.mdx b/www/_blog/2021-05-03-supabase-beta-april-2021.mdx
new file mode 100644
index 00000000000..52d771b3461
--- /dev/null
+++ b/www/_blog/2021-05-03-supabase-beta-april-2021.mdx
@@ -0,0 +1,177 @@
+---
+title: Supabase Beta April 2021
+description: Supabase "gardening" - stability, security, and community support.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: april-2021/release-apr-2021.jpg
+thumb: april-2021/release-apr-2021.jpg
+tags:
+ - release-notes
+date: '2021-05-05'
+---
+
+This month was a "gardening" month for Supabase. The team focused on stability, security, and community support.
+Check out what we were working on below, as well as some incredible Community contributions.
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+## Light Mode
+
+We're a developer tool, which means that Dark Mode is [extremely popular](https://twitter.com/supabase/status/1388131942919376904).
+
+
+
+While Dark mode is great, for some people it's not an option. Dark Mode is difficult to use for developers with astigmatisms,
+or even just working in brightly-lit environments.
+
+So today we're shipping Light Mode. Access it in the settings of your [Dashboard](https://app.supabase.io).
+
+
+
+
+
+## Translations
+
+With the help of the community, we [started internationalizing](https://github.com/supabase/supabase/issues/1341) our main repository:
+
+- [Arabic | العربية](https://github.com/supabase/supabase/blob/master/i18n/README.ar.md)
+- [Chinese / 中文](https://github.com/supabase/supabase/blob/master/i18n/README.cn.md)
+- [Dutch / Nederlands](https://github.com/supabase/supabase/blob/master/i18n/README.nl.md)
+- [English](https://github.com/supabase/supabase)
+- [French / Français](https://github.com/supabase/supabase/blob/master/i18n/README.fr.md)
+- [German / Deutsch](https://github.com/supabase/supabase/blob/master/i18n/README.de.md)
+- [Hindi / हिंदी](https://github.com/supabase/supabase/blob/master/i18n/README.hi.md)
+- [Nepali / नेपाली](https://github.com/supabase/supabase/blob/master/i18n/README.ne.md)
+- [Italiano / Italian](https://github.com/supabase/supabase/blob/master/i18n/README.it.md)
+- [Japanese / 日本語](https://github.com/supabase/supabase/blob/master/i18n/README.jp.md)
+- [Norwegian (Bokmål) / Norsk (Bokmål)](https://github.com/supabase/supabase/blob/master/i18n/README.nb-no.md)
+- [Polish / Polski](https://github.com/supabase/supabase/blob/master/i18n/README.pl.md)
+- [Portuguese / Portuguese](https://github.com/supabase/supabase/blob/master/i18n/README.pt.md)
+- [Portuguese (Brazilian) / Português Brasileiro](https://github.com/supabase/supabase/blob/master/i18n/README.pt-br.md)
+- [Russian / Pусский](https://github.com/supabase/supabase/blob/master/i18n/README.ru.md)
+- [Spanish / Español](https://github.com/supabase/supabase/blob/master/i18n/README.es.md)
+- [Traditional Chinese / 正體中文](https://github.com/supabase/supabase/blob/master/i18n/README.zh-tw.md)
+- [Turkish / Türkçe](https://github.com/supabase/supabase/blob/master/i18n/README.tr.md)
+- [Ukrainian / Українська](https://github.com/supabase/supabase/blob/master/i18n/README.uk.md)
+
+
+
+## OpenAPI spec for Storage
+
+We released [Storage Api docs](https://supabase.github.io/storage-api) built using OpenAPI (swagger).
+
+
+
+## Stripe Sync Engine (Experimental)
+
+We [open-sourced a server](https://github.com/supabase/stripe-sync-engine) which keeps any Postgres database in sync with Stripe.
+This is experimental only. We're evaluating other tools such as [Singer](https://www.singer.io/tap/stripe/postgresql/),
+which provide a more general solution (but are less "realtime"), and we're opening it up here to gather feedback.
+
+
+
+## Community spotlight: Threaded comments
+
+One of the most powerful Postgres features is "recursive CTEs" which can be used for nested items (comments, pages, friend-graphs). [@lawrencecchen](https://twitter.com/lawrencecchen) has built a full [Threaded Comments demo](https://github.com/lawrencecchen/threaded-comments) which you can [Deploy with a single click](https://github.com/lawrencecchen/threaded-comments#instant-deploy). Want to add comments to your blog with [Full Text Search](/docs/reference/javascript/textsearch)? Just use Postgres.
+
+
+
+
+
+## Community spotlight: SupaScript
+
+It looks like [@burggraf2](https://twitter.com/burggraf2) got tired of waiting for us to ship Functions, and decided to
+build a whole JS ecosystem within his Supabase database. If you want to write PG functions in JS, import remote libraries
+from the web, and console log to your browser, check out this [SupaScript repo](https://github.com/burggraf/SupaScript).
+
+```js
+// After installing:
+// https://github.com/burggraf/SupaScript#installation
+
+/**
+ * Get all users who logged in this week.
+ * Use in the database: select * from users_this_week();
+ * Use in the browser: supabase.rpc('users_this_week');
+ */
+create or replace function users_this_week()
+returns json as $$
+ const moment = require('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.js', false);
+
+ const lastWeek = moment().subtract(7, 'days');
+ const query = 'select * from auth.users where created_at > $1'
+ const users = sql(query, lastWeek);
+
+ return users;
+$$ language plv8;
+```
+
+## Community spotlight: Fireship
+
+Fireship reviewed Supabase last week, and despite being a (self-proclaimed) Firebase fan-boy, the review was very impartial.
+
+
+
+## Community
+
+- Watch [@everConfusedGuy](https://twitter.com/everConfusedGuy)'s talk at DevX conf - Building Supabase Storage: [YouTube video](https://www.youtube.com/watch?v=YsUYOsq_o7g)
+- DuckDuckAbdaal by [@Nutlope](https://twitter.com/Nutlope) - a personalized search engine: [Twitter](https://twitter.com/Nutlope/status/1389082406477463557)
+- Supabase in 6 minutes by [Georges Duverger](https://www.youtube.com/channel/UCNERPJ-vs61KEsD_dRNWFIw): [YouTube video](https://www.youtube.com/watch?v=c8DNV9yl0mg)
+- Build a SaaS Platform with Stripe by [@\_\_dijonmusters:](https://twitter.com/_dijonmusters) [DEV blog](https://dev.to/dijonmusters/series/12346)
+- Supabase & Sveltekit by Svelte Mastery: [YouTube video](https://www.youtube.com/watch?v=j4AV2Liojk0)
+- Firebase vs. Supabase - Draftbit Office Hours: [YouTube Livestream](https://www.youtube.com/watch?v=9Yg6i_zCuiM)
+
+**Supabase GitHub Star Growth**
+
+- Our [main GitHub repo](https://github.com/supabase/supabase) grew 60% (by stars) and we saw a flood of new contributors.
+- Our [UI Library](https://github.com/supabase/ui) grew 175%
+- Our [Realtime Server](https://github.com/supabase/realtime) grew 39% after landing on the [front page of Hacker News](https://news.ycombinator.com/item?id=26968449).
+
+
+
+
+ Source: repository.surf/supabase
+
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or [follow us on Twitter](https://twitter.com/supabase).
+
+## Coming Next
+
+You might have noticed our Dashboard slowly changing (improving), as we migrate the components out to our [open source UI Library](https://github.com/supabase/ui). This progression is an important step towards offering a UI for [Local Development](/docs/guides/local-development) and [Self Hosting](/docs/guides/self-hosting).
+
+We're also working on our [Workflows engine](/blog/2021/04/02/supabase-workflows). This is quite a large task, but we're making progress and aiming to ship sometime in July.
+
+## One more thing
+
+[We started hiring](/docs/careers).
+
+
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-06-02-supabase-beta-may-2021.mdx b/www/_blog/2021-06-02-supabase-beta-may-2021.mdx
new file mode 100644
index 00000000000..acb604ecf46
--- /dev/null
+++ b/www/_blog/2021-06-02-supabase-beta-may-2021.mdx
@@ -0,0 +1,131 @@
+---
+title: Supabase Beta May 2021
+description: Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: 2021-may/release-may-2021.jpg
+thumb: 2021-may/release-may-2021.jpg
+tags:
+ - release-notes
+date: '2021-06-02'
+---
+
+Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries. Lots of great stuff to try out this month.
+
+### Quick demo
+
+Watch a full demo:
+
+
+
+## Apple logins are now available
+
+Did you know: if you ship an app to the App Store with any third-party logins, you're required to enable Apple logins as well? Now you can with Supabase Auth.
+
+
+
+## Twitter logins are now available
+
+You can also use Twitter as an OAuth provider with Supabase Auth. Twitter has a very archaic OAuth implementation, so this one took awhile.
+
+
+
+## New storage policy editor
+
+We shipped a new Policy Editor for managing Row Level Security on your Storage. We provide some templates to simplify the process for new developers.
+
+
+
+## Supabase Grid
+
+We are still working on Open Sourcing our Dashboard, and took another step closer by publicly releasing a new [Supabase Grid](https://github.com/supabase/grid). It's not ready to use outside of the Supabase ecosystem, but over time we hope to make it usable with any Postgres Database.
+
+
+
+## Japan (Tokyo) 🇯🇵 is now available as a region
+
+There are a huge number of Supabase developers in Japan and China, and at their request we've launched Tokyo as a region.
+
+
+
+## Return data as CSV
+
+You can now [retrieve your data](/docs/reference/javascript/select#return-data-as-csv) as Comma Separated Values. Thanks to [@andreivreja](https://github.com/andreivreja) for the [awesome PR](https://github.com/supabase/postgrest-js/pull/187).
+
+
+
+## New Go Libraries
+
+The community started developing the Go libraries. [postgrest-go](https://github.com/supabase/postgrest-go) is completed, [@Yusuf_Papurcu](https://twitter.com/Yusuf_Papurcu) and [@muratmirgun](https://twitter.com/muratmirgun) are working on the remaining libraries.
+
+
+
+## New Swift Libraries
+
+The community started developing the Swift libraries too. [@satishbabariya](https://twitter.com/satishbabariya) is making huge progress on
+[`storage-swift`](https://github.com/supabase/storage-swift),
+[`gotrue-swift`](https://github.com/supabase/gotrue-swift),
+[`realtime-swift`](https://github.com/supabase/realtime-swift), and
+[`supabase-swift`](https://github.com/supabase/supabase-swift).
+
+
+
+## Build in Public
+
+We started a weekly 1-hour live stream where we build in public.
+
+- [Build in Public 001](https://www.youtube.com/watch?v=p561ogKZ63o): Building a "Next.js + Supabase" Tutorial
+- [Build in Public 002](https://twitter.com/p_phiri/status/1397815806990372865?s=20): `maybeSingle()` and "React + Supabase" Tutorial
+
+
+
+## Community
+
+- `@p_phiri` made his first OSS contribution, and documented it on YouTube. [Twitter](https://twitter.com/p_phiri/status/1397815806990372865?s=20).
+- `@sonnylazuardi` built an awesome 3d globe using Supabase. [Twitter](https://twitter.com/sonnylazuardi/status/1397141285664792578?s=20).
+- `@yallurium` released Part 2 of "Going Full Stack with Flutter and Supabase". [Twitter](https://twitter.com/yallurium/status/1396850742724632582?s=20).
+- `@coderinblack` built an Audio Social Platform using Supabase. [Twitter](https://twitter.com/coderinblack/status/1396199050207121408).
+- `@adityathakurxd` built a Flutter + Supabase starter kit. [GitHub](https://github.com/adityathakurxd/supabase_flutter).
+- `@dshukertjr` built a geo-tagged video sharing app with Flutter + Supabase. [GitHub](https://github.com/dshukertjr/spot)
+- `@JonoYeong` created a 6-minute overview of Supabase. [YouTube](https://www.youtube.com/watch?v=1F240hR7nHU). [Twitter](https://twitter.com/JonoYeong/status/1398451556723294208).
+- Everyone who has produced Supabase content is now receiving their [swag](https://twitter.com/coderinblack/status/1397042488586559490?s=20). Send a link to your blog, app, or video to swag@supabase.io along with your address and we'll make sure you're included in the next drop.
+
+**Supabase GitHub Star Growth**
+
+
+
+
+ Source: repository.surf/supabase
+
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or [follow us on Twitter](https://twitter.com/supabase).
+
+## Coming Next
+
+We're planning another Launch Week at the end of July. We'll probably have a quiet month of shipping this month so that we can get everything prepared for July.
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-07-01-roles-postgres-hooks.mdx b/www/_blog/2021-07-01-roles-postgres-hooks.mdx
new file mode 100644
index 00000000000..aef471ea730
--- /dev/null
+++ b/www/_blog/2021-07-01-roles-postgres-hooks.mdx
@@ -0,0 +1,409 @@
+---
+title: Protecting reserved roles with PostgreSQL Hooks
+description: Using Postgres Hooks to protect functionality in your Postgres database.
+author: steve_chavez
+author_url: https://github.com/steve-chavez
+author_image_url: https://github.com/steve-chavez.png
+authorURL: https://github.com/steve-chavez
+image: postgres-hooks/og-postgres-hooks.jpg
+thumb: postgres-hooks/cover-postgres-hooks.jpg
+tags:
+ - postgres
+date: '2021-07-02'
+---
+
+PostgreSQL manages permissions through roles. To create these roles, a database user needs the `CREATEROLE` privilege,
+which not only allows role creation but also _modification_ of any role (except superusers).
+
+At Supabase, we use dedicated roles for each of our customers' backend services. For instance, our [Storage API](/storage)
+uses the `supabase_storage_admin` role for connecting to the database. Giving the `CREATEROLE` privilege to our customers would allow them to
+drop this role and take their own Storage API down.
+
+And yet, we want to give our customers the ability to manage roles the same as they do it in on-premises databases,
+with the usual `CREATE ROLE`, `ALTER ROLE`, and `DROP ROLE` statements.
+
+So, how do we grant them the `CREATEROLE` privilege and, at the same time, protect our own roles? In this blog post,
+we explain how we managed to do this by using PostgreSQL Hooks in our [SupaUtils](https://github.com/supabase/supautils) extension.
+
+## Reserved Roles
+
+PostgreSQL has a list of [predefined roles](https://www.postgresql.org/docs/14/predefined-roles.html) — all prefixed
+with "pg\_" — that cannot be dropped or altered. Attempting to do so will throw an error mentioning that the role is "reserved".
+
+```sql
+alter role pg_monitor createdb;
+ERROR: role name "pg_monitor" is reserved
+DETAIL: Cannot alter reserved roles.
+```
+
+This mechanism is an internal implementation detail. Unfortunately Postgres doesn't allow us to define our own reserved roles.
+
+### RDS reserved roles
+
+Amazon RDS has a similar defense mechanism, all of its predefined roles — prefixed with "rds" — cannot be modified.
+
+```sql
+alter role rdsadmin rename to another;
+ERROR: The "rdsadmin" role cannot be renamed.
+DETAIL: The "rdsadmin" role cannot be renamed because either the source
+ or the target name refer to an Amazon RDS reserved role name.
+LOCATION: handle_rename, rdsutils.c:1534
+```
+
+Again, the error mentions that the role is "reserved".
+
+Also note the `rdsutils.c` mention. That's not a stock Postgres source file. This means that the logic comes
+from an RDS extension. We can confirm this is the case by showing the preloaded libraries.
+
+```sql
+show shared_preload_libraries;
+
+ shared_preload_libraries
+-----------------------------
+ rdsutils,pg_stat_statements
+```
+
+`rdsutils` can be seen there. Naturally this lead us into thinking we can achieve the same logic with an extension
+of our own, and thus the SupaUtils idea was born.
+
+## Extending PostgreSQL with Hooks
+
+PostgreSQL hooks allow us to extend internal functionality. Hooks can modify behavior at different places,
+including when running SQL statements.
+
+For example, if we wanted to enforce our own password restrictions whenever a user changes passwords, we could
+use the `check_password_hook` to verify the password. We would write out our own Custom Logic, and raise an error
+if the password fails the password requirements.
+
+
+
+For `SupaUtils`, we're particularly interested in the `ProcessUtility_hook`, which allows us to hook into **utility statements:** every statement except `select`, `insert`, `delete` or `update`. They include `alter role` and `drop role`, which are the statements we want to hook on.
+
+### Hooks are global function pointers
+
+To use hooks, we can override functions pointers that are global. On the Postgres codebase, the `ProcessUtility_hook` is basically used[^1] like this:
+
+```c
+// src/backend/tcop/utility.c
+
+// ProcessUtility_hook is NULL by default
+ProcessUtility_hook_type ProcessUtility_hook = NULL;
+
+// This function is used for processing all the utility statements
+void
+ProcessUtility(PARAMS_OMITTED_FOR_BREVITY)
+{
+// call the ProcessUtility_hook if it's not NULL
+if (ProcessUtility_hook)
+ (*ProcessUtility_hook)(PARAMS_OMITTED_FOR_BREVITY);
+// otherwise call the standard function used to process utility statements
+else
+ standard_ProcessUtility(PARAMS_OMITTED_FOR_BREVITY);
+}
+```
+
+As you can see, `ProcessUtility_hook` is `NULL` by default, so our extension should set it for the hook to run. Also, the `standard_ProcessUtility` function is the one that actually does the job of creating or modifying the roles (among other things) so our hook should also call it.
+
+### Loading and running the hook
+
+Each extension set in `shared_preload_libraries` will get its `_PG_init` function called. This function will allow us to set our hook onto `ProcessUtility_hook`.
+
+Since hooks are global function pointers, it might be the case that another extension modifies the hook pointer (on its own `_PG_init`) before us and sets its own hook. So we need to ensure we also run this previously-set hook, before or after our own hook runs.
+
+It's typically[^2] done like this:
+
+```c
+// variable to store the previous hook
+static ProcessUtility_hook_type prev_hook = NULL;
+
+// initialize our extension
+void
+_PG_init(void)
+{
+ // ProcessUtility_hook has the global function pointer.
+ // Store its value in case another extension already set its own hook.
+ prev_hook = ProcessUtility_hook;
+ // Now override the ProcessUtility_hook with our hook
+ ProcessUtility_hook = our_hook;
+}
+
+static void
+our_hook(PARAMS_OMITTED_FOR_BREVITY)
+{
+ // our hook logic goes here
+
+ // If there was a previous hook, run it after our hook
+ if (prev_hook)
+ prev_hook(PARAMS_OMITTED_FOR_BREVITY);
+ // If there's no previous hook, call the standard function
+ else
+ standard_ProcessUtility(PARAMS_OMITTED_FOR_BREVITY);
+}
+```
+
+## Setting up the SupaUtils extension
+
+We can use the concepts above to build our extension.
+
+First we'll need a Makefile in order to compile the extension code and include it into our PostgreSQL installation.
+
+```makefile
+# Makefile
+
+# Our shared library
+MODULE_big = supautils
+
+# Our object files to build for the library
+OBJS = src/supautils.o
+
+# Tell pg_config to pass us the PostgreSQL extensions makefile(PGXS)
+# and include it into our own Makefile through the standard "include" directive.
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+```
+
+For the source file, we'll start with variable definitions and functions declarations.
+
+```c
+// src/supautils.c
+
+// include common declarations
+#include "postgres.h"
+
+// required macro for extension libraries to work
+PG_MODULE_MAGIC;
+
+// variable for the previous hook
+static ProcessUtility_hook_type prev_hook = NULL;
+
+// variable for our reserved roles configuration parameter
+static char *reserved_roles = NULL;
+
+// function declaration for extension initialization
+void _PG_init(void);
+
+// function declaration for our hook
+static void supautils_hook(
+ PlannedStmt *pstmt,
+ const char *queryString,
+ ProcessUtilityContext context,
+ ParamListInfo params,
+ QueryEnvironment *queryEnv,
+ DestReceiver *dest,
+ QueryCompletion *completionTag
+);
+
+// function declaration for our pure function that will return a reserved role
+static char* look_for_reserved_role(Node *utility_stmt, List *reserved_role_list);
+```
+
+Up next we'll define each one of these function declarations.
+
+## Initializing the extension
+
+Let's now `_PG_init` our extension. Besides setting the hook here, we want to define our reserved roles as a configuration parameter, that way they can be modified by editing the `postgresql.conf` file. For this, we can use the `DefineCustomStringVariable` function, which inserts the parameter into Postgres "Grand Unified Configuration"(GUC) system.
+
+```c
+void
+_PG_init(void)
+{
+ // Store the previous hook
+ prev_hook = ProcessUtility_hook;
+ // Set our hook
+ ProcessUtility_hook = supautils_hook;
+
+ // Define our "supautils.reserved_roles" parameter
+ // some arguments are unused so they are left as NULL
+ DefineCustomStringVariable("supautils.reserved_roles",
+ "Comma-separated list of roles that cannot be altered or dropped",
+ NULL,
+ // It will be assigned to the reserved_roles variable
+ &reserved_roles,
+ NULL,
+ // We should be able to reload this parameter without restarting the server,
+ // e.g. with "select pg_reload_conf()".
+ PGC_SIGHUP,
+ 0,
+ NULL, NULL, NULL);
+}
+```
+
+## Running the SupaUtils hook
+
+Now that our hook is set, we'll define what it will do. As specified in the [ProcessUtility_hook_type](https://github.com/postgres/postgres/blob/f807e3410fdfc29ced6590c7c2afa76637e001ad/src/include/tcop/utility.h#L71-L75), the hook's first parameter is a `PlannedStmt`, this represents the planned statement — the output from the Postgres planner. This is a step before the statement is executed.
+
+We'll look for the presence of a reserved role in the planned statement. If there's one present, we'll report an error and abort the statement execution step.
+
+```c
+static void
+supautils_hook(
+ // The planned statement
+ PlannedStmt *pstmt,
+ // These parameters are here for completion, we'll not use any of them
+ const char *queryString,
+ ProcessUtilityContext context,
+ ParamListInfo params,
+ QueryEnvironment *queryEnv,
+ DestReceiver *dest,
+ QueryCompletion *completionTag
+)
+{
+ // Get the utility statement from the planned statement
+ Node *utility_stmt = pstmt->utilityStmt;
+
+ // Only do the logic if supautils.reserved_roles is not NULL
+ if(reserved_roles){
+ // The found reserved role, assume none was found by default
+ char *reserved_role = NULL;
+ // Temp var for storing the list of reserved roles
+ List *reserved_role_list;
+
+ // split the comma-separated string into a List by using a
+ // helper function from varlena.h
+ if (!SplitIdentifierString(pstrdup(reserved_roles), ',', &reserved_role_list))
+ // abort and report an error if the splitting fails
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("parameter \"%s\" must be a comma-separated list of "
+ "identifiers", reserved_roles)));
+
+ // look for the reserved role in an internal function
+ reserved_role = look_for_reserved_role(utility_stmt, reserved_role_list);
+
+ // we're done with the list so free it from memory
+ list_free(reserved_role_list);
+
+ // abort and report an error if a reserved role was found
+ if(reserved_role)
+ ereport(ERROR,
+ (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("\"%s\" is a reserved role, it cannot be modified", reserved_role)));
+ }
+
+ // Run the previous hook if defined or call the standard function
+ if (prev_hook)
+ prev_hook(pstmt, queryString,
+ context, params, queryEnv,
+ dest, completionTag);
+ else
+ standard_ProcessUtility(pstmt, queryString,
+ context, params, queryEnv,
+ dest, completionTag);
+}
+
+```
+
+## Looking for the reserved role
+
+Lastly, we'll define how we look for the reserved role.
+
+At this stage, we already have the utility statement and the reserved role list. All that's left to do is to define if the utility statement is an `ALTER ROLE` or `DROP ROLE` statement, and whether if the role it affects is a reserved one.
+
+```c
+static char*
+look_for_reserved_role(Node *utility_stmt, List *reserved_role_list)
+{
+ // Check the utility statement type
+ switch (utility_stmt->type)
+ {
+ // Matches statements like:
+ // ALTER ROLE role NOLOGIN
+ case T_AlterRoleStmt:
+ {
+ // cast the utility statement to an alter role statement
+ AlterRoleStmt *stmt = (AlterRoleStmt *) utility_stmt;
+
+ //RoleSpec has the role name plus some attributes
+ RoleSpec *role = stmt->role;
+
+ // postgres defines its own list utilities in pg_list.h
+ // ListCell is an element of the list that we'll use for iteration
+ ListCell *role_cell;
+
+ // pg_list.h includes the foreach macro for iterating over lists
+ foreach(role_cell, reserved_role_list)
+ {
+ // get the list element
+ char *reserved_role = (char *) lfirst(role_cell);
+
+ // compare the statement role with the reserved role
+ // get_rolespec_name will get the RoleSpec role name,
+ // even in cases where the role is the special case of
+ // "current_user" or "session_user"
+ if (strcmp(get_rolespec_name(role), reserved_role) == 0)
+ return reserved_role;
+ }
+
+ break;
+ }
+
+ // Matches statements like:
+ // DROP ROLE role
+ case T_DropRoleStmt:
+ {
+ // cast the utility statement to a drop role statement
+ DropRoleStmt *stmt = (DropRoleStmt *) utility_stmt;
+ ListCell *item;
+
+ // the logic is the same as before, iterate over the reserved role list
+ // and find a match
+ foreach(item, stmt->roles)
+ {
+ RoleSpec *role = lfirst(item);
+ ListCell *role_cell;
+
+ foreach(role_cell, reserved_role_list)
+ {
+ char *reserved_role = (char *) lfirst(role_cell);
+
+ if (strcmp(get_rolespec_name(role), reserved_role) == 0)
+ return reserved_role;
+ }
+ }
+
+ break;
+ }
+
+ default:
+ break;
+ }
+ // Didn't find any reserved role on the statement, so return NULL
+ return NULL;
+}
+```
+
+## Testing the extension
+
+Now that the code is finished, we can test the extension. Since we already have a `Makefile`, the extension can be installed by doing `make && make install`. Then, in postgresql.conf:
+
+```sql
+# set the extension as preloaded, this will require a restart
+shared_preload_libraries="supautils"
+
+# the reserved roles
+supautils.reserved_roles="supabase_storage_admin, supabase_auth_admin"
+```
+
+We'll now try to alter or drop the reserved roles:
+
+```sql
+alter role supabase_storage_admin nologin password 'fake';
+ERROR: "supabase_storage_admin" is a reserved role, it cannot be modified
+
+drop role supabase_auth_admin;
+ERROR: "supabase_auth_admin" is a reserved role, it cannot be modified
+
+-- Success!!
+```
+
+## Wrapping up
+
+As you can see, PostgreSQL Hooks allow us to intercept SQL statements. There are many types of hooks, you can see unofficial documentation for these at [AmatanHead/psql-hooks](https://github.com/AmatanHead/psql-hooks).
+
+The full SupaUtils code is in our [GitHub repository](https://github.com/supabase/supautils/).
+
+By the way, if you like working on PostgreSQL tooling and extensions: we are hiring [PostgreSQL experts](/docs/careers/postgres-experts)!
+
+[^1]: You can see the `ProcessUtility_hook` declaration [here](https://github.com/postgres/postgres/blob/11e9caff82bc7326e2bc9782937cb03875050cc4/src/backend/tcop/utility.c#L75-L76) and its usage [here](https://github.com/postgres/postgres/blob/11e9caff82bc7326e2bc9782937cb03875050cc4/src/backend/tcop/utility.c#L515-L527).
+[^2]: This is also done on [pg_stat_statements](https://github.com/postgres/postgres/blob/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5/contrib/pg_stat_statements/pg_stat_statements.c#L1130-L1137) and [sepgsql](https://github.com/postgres/postgres/blob/6991e774e0304f5ef488cf1ae4fa79578b6ae3d5/contrib/sepgsql/hooks.c#L381-L388).
diff --git a/www/_blog/2021-07-02-supabase-beta-june-2021.mdx b/www/_blog/2021-07-02-supabase-beta-june-2021.mdx
new file mode 100644
index 00000000000..840b486061e
--- /dev/null
+++ b/www/_blog/2021-07-02-supabase-beta-june-2021.mdx
@@ -0,0 +1,171 @@
+---
+title: Supabase Beta June 2021
+description: Discord Logins, Vercel Integration, Full text search, and OAuth guides.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: 2021-june/release-june-2021.jpg
+thumb: 2021-june/release-june-2021-cover.jpg
+tags:
+ - release-notes
+date: '2021-06-02'
+toc_depth: 3
+---
+
+Supabase is gearing up for another Launch Week on July the 26th. Until then, here's a few new things to try.
+
+### Quick demo
+
+Watch a full demo of this month's releases
+
+
+
+## Vercel integration
+
+Vercel just released their new integrations, which means you can now deploy a Postgres database on Supabase directly from your Vercel account.
+Check it out! [vercel.com/integrations/supabase](https://vercel.com/integrations/supabase)
+
+
+
+## Discord logins are now available
+
+Building a community? There's almost no better tool than Discord (we're even trialling it ourselves).
+If you're building a community product, Discord logins are the perfect option.
+
+
+
+## New Guides
+
+We spent the month building up a new [Guides section](/docs/guides) in our Docs. Here are a few highlights:
+
+### Postgres Full Text Search
+
+Ever wanted to build a Search Engine? We just released a guide which shows you how to implement
+[Full Text Search using Postgres](/docs/guides/database/full-text-search).
+
+
+
+### OAuth Guides
+
+We released step-by-step guides to help you set up OAuth with
+[Apple](/docs/guides/auth/auth-apple),
+[Bitbucket](/docs/guides/auth/auth-bitbucket),
+[Facebook](/docs/guides/auth/auth-facebook),
+[GitHub](/docs/guides/auth/auth-github),
+[GitLab](/docs/guides/auth/auth-gitlab),
+[Google](/docs/guides/auth/auth-google), and
+[Twitter](/docs/guides/auth/auth-twitter).
+
+
+
+### Javascript + Postgres
+
+Did you know that you can use Javascript inside your Postgres database? Here's how, with the
+[`plv8` extension](/docs/guides/database/extensions/plv8).
+
+
+
+## Public Storage Buckets
+
+Want to share all your favourite memes? Now it's even easier with Public Storage Buckets. Simply mark a bucket as
+"Public" and the content will be accessible without a login.
+
+
+
+
+
+## Storage upserts
+
+Supabase Storage now supports `upsert`. Shoutout to [@ankitjena](https://github.com/ankitjena) for
+[this Pull Request](https://github.com/supabase/storage-api/pull/32).
+
+
+
+## Server restarts
+
+When things go wrong, sometime the best thing you can do is reboot. We released a restart button in the Dashboard,
+the first of many debugging tools we'll be releasing over the next few months.
+
+
+
+## Policy editor
+
+We added a new Table Policy Editor which makes Row Level Security even easier. We even included a few templates to get you started.
+
+
+
+## Build in Public
+
+We run a weekly 1-hour live stream where we build in public.
+
+- [Build in Public 003](https://youtu.be/a2r-GGILQiA): Redwood PR, GitHub Discussions, Pricing Pages, Postgres Policies, Styling docs
+- [Build in Public 004](https://youtu.be/7yhFmKmplDg): Svelte Quickstart, new `supabase-js` release, monthly GitHub release
+- [Build in Public 006](https://youtu.be/LHYrqBb4q9I): Supabase Studio
+- [Build in Public 007](https://youtu.be/R4gJhX_JFTo): Supabase Studio - API Docs
+
+
+
+## Community
+
+- [@dabit3](https://twitter.com/dabit3) released a complete guide to Supabase on FreeCodeCamp. [Twitter](https://twitter.com/freeCodeCamp/status/1404469119525732357) | [Blog](https://www.freecodecamp.org/news/the-complete-guide-to-full-stack-development-with-supabas/)
+- [@raddevon](https://twitter.com/raddevon) built a social network using Supabase and Vue3. [Twitter](https://twitter.com/raddevon/status/1410401132845801479) | [YouTube](https://www.youtube.com/watch?v=x25a_q0vHUY)
+- [@JonoYeong](https://twitter.com/JonoYeong) built live with Supabase + SvelteKit. [Twitter](https://twitter.com/JonoYeong/status/1409960155093946368) | [Twitch](https://www.twitch.tv/videos/1066520882)
+
+**Supabase GitHub Star Growth**
+
+
+
+
+ Source: repository.surf/supabase
+
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or
+[follow us on Twitter](https://twitter.com/supabase).
+
+## External contributions
+
+### PostgREST
+
+- Primarily for Prisma users, we patched PostgREST [openapi-mode](https://github.com/PostgREST/postgrest/pull/1881) to ignore anon privileges for the OpenAPI output.
+ Credit to [@steve-chavez](https://github.com/steve-chavez/).
+- We added better [PostgREST logging](https://github.com/PostgREST/postgrest/pull/1872) to include timestamps for every error
+ Credit to [@steve-chavez](https://github.com/steve-chavez/).
+
+### Auth0
+
+- We fixed a XSS bug in the Auth0 Next.js library. [GitHub](https://github.com/auth0/nextjs-auth0/security/advisories/GHSA-954c-jjx6-cxv7)
+ Credit to [@inian](https://github.com/inian) and [Ishan Patel](https://github.com/git-ishanpatel) (a Supabase community member)
+
+## Coming Next
+
+Launch Week!! Remember that time we did a [Launch Week](/blog/2021/03/25/launch-week)? Well we're doing it again at the end of July.
+Strap in, because we're shipping one thing every day for a week.
+
+Let's goooooo.
+
+
+
+### Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-07-22-supabase-launch-week-sql.mdx b/www/_blog/2021-07-22-supabase-launch-week-sql.mdx
new file mode 100644
index 00000000000..4240545c103
--- /dev/null
+++ b/www/_blog/2021-07-22-supabase-launch-week-sql.mdx
@@ -0,0 +1,109 @@
+---
+title: 'Supabase Launch Week II: The SQL'
+description: Five days of Supabase. Again.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: launch-week-sql/launchweek-2-the-sql-og.jpg
+thumb: launch-week-sql/supabase-launch-the-sql.png
+tags:
+ - launch-week
+date: '2021-07-22'
+toc_depth: 2
+---
+
+In March, Supabase held a [Launch Week](/blog/2021/03/25/launch-week) where we launched a new product/feature every day for a week.
+
+It may seem crazy to do another launch week just four months later, but we couldn't give up on a good pun, so get ready for **Launch Week II: the SQL**.
+
+## What to expect
+
+Just like last time, we don't want to spoil the surprise. So for now we'll give you a teaser of what to expect. Come back each day to see what we launch, or follow us on Twitter to keep up to date: [@supabase](https://twitter.com/supabase) and follow the hashtag [#supalaunchweek](https://twitter.com/hashtag/supalaunchweek).
+
+## Monday 26 July: Community Day
+
+
+
+### **When?**
+
+Monday 26 July 2021.
+
+### What?
+
+One of the best things about building Supabase is the community. We're even luckier because we're an amalgamation of tools like Postgres and PostgREST. We're starting the week by shining a spotlight on some of the latest developments from the community.
+
+### Where?
+
+Read the [blog post](/blog/2021/07/26/supabase-community-day).
+
+## Tuesday 27 July: Storage v2
+
+
+
+### **When?**
+
+Tuesday 27 July 2021.[^1]
+
+### What?
+
+We shipped [Version 1 of Supabase Storage](/blog/2021/03/30/supabase-storage) in the last Launch Week, and now we've had 4 months to work on Storage Reloaded.
+
+### Where?
+
+Read the [blog post](/blog/2021/07/27/storage-beta).
+
+## Wednesday 28 July: Auth v2
+
+
+
+### **When?**
+
+Wednesday 28 July 2021.[^1]
+
+### What?
+
+What's cooler than Arnie in the 90's? Passwordless logins. We've [already](/docs/guides/auth/auth-apple) [built](/docs/guides/auth/auth-bitbucket) [support](/docs/guides/auth/auth-discord) [for](/docs/guides/auth/auth-facebook) [eight](/docs/guides/auth/auth-github) [different](/docs/guides/auth/auth-gitlab) [Oauth](/docs/guides/auth/auth-google) [providers](/docs/guides/auth/auth-twitter), so it's anyone's guess what can happen in Supabase Auth Episode II.
+
+### Where?
+
+Read the [blog post](/blog/2021/07/28/supabase-auth-passwordless-sms-login).
+
+## Thursday 29 July: Dashboard v2
+
+
+
+### **When?**
+
+Thursday 29 July 2021.
+
+### What?
+
+Who needs a futuristic [Hoverboard from 2015](https://www.youtube.com/watch?v=NRkGYW9JAmQ) when you've got a super slick Dashboard from 2021. We've got some exciting changes coming to the Dashboard.
+
+### Where?
+
+Read the [blog post](/blog/2021/07/29/supabase-reports-and-metrics).
+
+## Friday 30 July: One more thing
+
+
+
+### **When?**
+
+Friday 30 July 2021.
+
+### What?
+
+We all know that the best [SeQueLs](https://www.reddit.com/r/SequelMemes/) are actually [PreQueLs](https://www.reddit.com/r/PrequelMemes/). We've got a few surprises lined up for Friday that make the Supabase story a bit more complete.
+
+### Where?
+
+Read about [Supabase Hackathon](/blog/2021/07/30/supabase-swag-store),
+[Supabase Functions Updates](/blog/2021/07/30/supabase-functions-updates),
+and the Supabase [Swag Store](/2021/07/30/1-the-supabase-hackathon).
+
+[^1]:
+ When we first announced, Storage was on Wednesday and Auth was on Tuesday. We switched the order of these as we are doing a
+ Storage [presentation](https://www.meetup.com/the-monthly-dev-world-class-talks-by-expert-developers/events/278158726/) with
+ [daily.dev](https://daily.dev/) on Wednesday.
diff --git a/www/_blog/2021-07-26-epsilon3-self-hosting.mdx b/www/_blog/2021-07-26-epsilon3-self-hosting.mdx
new file mode 100644
index 00000000000..f5005583c8f
--- /dev/null
+++ b/www/_blog/2021-07-26-epsilon3-self-hosting.mdx
@@ -0,0 +1,89 @@
+---
+title: 'Epsilon3 Self-Host Supabase To Revolutionize Space Operations '
+description: Learn how the team at Epsilon3 use Supabase to help teams execute secure and reliable operations in an industry that project spend runs into the billions.
+author: rory_wilding
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: epsilon3/og-epsilon3.jpg
+thumb: epsilon3/cover-epsilon3.jpg
+tags:
+ - case-study
+date: '2021-07-26'
+toc_depth: 2
+---
+
+Epsilon3 is a USA-based Y Combinator startup. They digitize paper-based procedures in the space industry using telemetry data,
+simplifying testing and operations. Their product is rapidly becoming the OS for space projects and complex operations.
+
+Learn how the team at Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project
+spend runs into the billions.
+
+### Space Operations
+
+Epsilon3's customers run testing and operational procedures in real-time. Epsilon3's solution allows online collaboration as a team,
+instead of being siloed and separated which is an increasingly important requirement in a post-pandemic working world.
+Epsilon3 is powering an industry where reliability is paramount. In the space industry, missions cost billions and need to run reliably.
+
+
+
+Epsilon3's software saves operators time and reduces errors to improve complex operations. Their customers are using their software and
+successfully sending satellites into space and are about to use Epsilon3's software for an operational Rocket Launch. As a result, their
+reputation for improving the quality standard for complex operations has led to demand from other industries. The team is receiving
+enquiries from clients in the robotics, logistics and medical equipment sectors who need a structured and standardized way of running
+procedures and keeping audit trails.
+
+## Moving fast in regulated markets
+
+As a startup, Epsilon3 needs to move fast and scale. They require security, reliability, and performance.
+
+The team has a background in engineering from Northrop, Google, and SpaceX and understands the technical benefits Postgres offers as a
+battle-tested open-source relational database.
+
+Real-time functionality is also a key for their customers to see how running procedures are progressing as the changes occur.
+
+The space industry is highly regulated, adding complexity. For example, in the USA, deployments must be in an ITAR-compliant way
+(for instance AWS GovCloud supports ITAR compliance) while customers in countries outside the USA may need to host their data within their own
+country. These customer requirements mean Epsilon3 must be able to offer flexible hosting options, including on-premises deployment.
+
+
+ Billion dollar missions need to run reliably and securely.
+
+ We didn’t just want something that works, we wanted a solution implementing best practices. We
+ also needed a setup that we could self-host to meet compliance needs and allow on-premises
+ deployment options for our customers.
+
+
+ We use Supabase because they give us an open-source scalable back-end built by database experts
+ that we can self-host.
+
+
+ Supabase takes out the mental effort from our back-end infrastructure so we can focus on our
+ customers needs.
+
+
+
+### Supabase gives Postgres users Superpowers
+
+The team implemented a self-hosted Supabase setup. They use AWS with a self-hosted Supabase API powering an RDS Postgres instance.
+This setup gives a balance of rapid development, reduced DevOps, and flexible hosting options. As Supabase uniquely offers real-time for
+Postgres, it allows their customers to see updates from running procedures. Supabase offers well-supported client libraries that make
+Postgres Row Level Security easy to use, which is a critical item on the Epsilon3 roadmap.
+
+All this was easy for the team to set up, even with self-hosting, so the team was able to focus on what they do best—helping their customers
+run complex operations smoothly. With this implementation, Epsilon3 gets all the benefits of Postgres, plus the smooth developer experience and
+support that Supabase is known for, without compromising their compliance needs.
+
+
+
+### Self-hosted Supabase, a superpower
+
+Self-hosting Supabase allows the crew at Epsilon3 to move fast. They are revolutionizing space operations securely and reliably in real-time whilst
+staying compliant. The team is now seeing demand from other industries and is confident in their scaling capability because they know it's
+just Postgres under the hood.
+
+Check out the [Epsilon3 website](https://www.epsilon3.io/) to learn more about the team and their OS for space operations. If you are interested
+in self-hosting Supabase then you can **contact us** to learn more.
diff --git a/www/_blog/2021-07-26-supabase-community-day.mdx b/www/_blog/2021-07-26-supabase-community-day.mdx
new file mode 100644
index 00000000000..3995482185f
--- /dev/null
+++ b/www/_blog/2021-07-26-supabase-community-day.mdx
@@ -0,0 +1,136 @@
+---
+title: 'Supabase Community Day'
+description: Community Day
+author: steve_chavez
+author_url: https://github.com/steve-chavez
+author_image_url: https://github.com/steve-chavez.png
+authorURL: https://github.com/steve-chavez
+thumb: launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-thumb.jpg
+image: launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-og.jpg
+tags:
+ - launch-week
+date: '2021-07-26'
+toc_depth: 2
+---
+
+Supabase has grown a lot [^1] since last [Launch Week](/blog/2021/03/25/launch-week),
+but it wouldn't be possible without some amazing open source tools.
+Since we're shipping a few upgrades this week we feel it's only fair
+to shine a spotlight on some tools and community efforts that make Supabase possible.
+
+## PostgreSQL version 13.3
+
+
+
+PostgreSQL is a big part of Supabase, and it's also a huge inspiration - the speed that they ship, their community organization,
+and their absolute dedication towards reliability. PostgreSQL 13.3 was released in June and (from today) every new Supabase project will
+be on [PostgreSQL version 13.3](/blog/2021/07/26/supabase-postgres-13).
+
+### Giving back
+
+Supabase makes it easy to get started with Postgres, but we think you should try it even if you don't want to use Supabase. Here's a
+few ways we make it easy to use PostgreSQL without Supabase:
+
+- Supabase was the first company to put Postgres in the [Digital Ocean Marketplace](https://marketplace.digitalocean.com/apps/supabase-postgres).
+ Since then it's been installed over 1000 times (not by us!).
+- We provide a Postgres image in the [AWS marketplace](https://aws.amazon.com/marketplace/pp/prodview-lk2pfa5nafecg).
+- We're packaging the Marketplace version, [along with "Bundles"](/blog/2021/07/26/supabase-postgres-13#postgresql-bundles)
+- We're developing a few extensions: [supautils](https://github.com/supabase/supautils), [pg_net](https://github.com/supabase/pg_net), and a couple more soon to be announced.
+
+### Get involved
+
+- Follow the official [PostgreSQL Twitter](https://twitter.com/PostgreSQL) account.
+- Join the official [mailing lists](https://www.postgresql.org/community/).
+
+## PostgREST version 8.0
+
+
+
+This new PostgREST stable version comes with the improvements we've made to make it truly enterprise-grade. Due to our commitment with OSS,
+all of our improvements are upstreamed, so you can fully use them on your own self-hosted projects.
+
+### Highlights
+
+**Improved Performance**: Due to Supabase's high throughput requirements, PostgREST 8.0 handles up to 50% more throughput on
+GET requests, according to our benchmarks. We converted all SELECT queries to use prepared statements and reduced logging
+verbosity to make this possible.
+
+**Reduced downtime**: we need PostgREST to be more "set it and forget it", so reloading schema cache now has zero downtime.
+
+**Dynamic Configuration**: we've made it easier to handle PostgREST configuration at scale (we manage thousands of PostgREST instances).
+This new version includes the ability to use an in-database configuration that is reloadable through a `NOTIFY` command.
+
+**Less admin burden**: PostgREST previously required the `pg_listen` utility to reload its schema cache. This is no longer needed.
+The schema cache is reloadable with a simple `NOTIFY` command.
+
+**Better diagnostic information**: in the rare cases where PostgREST fails, we want to find the exact root cause quickly.
+For this we've improved its logging by adding logging levels and timestamps to all server errors.
+
+**Simpler OpenAPI**: showing a complete OpenAPI output used to require a highly-privileged `anon` role. With the new `openapi-mode`,
+this is no longer needed and `anon` can be kept with minimal privileges.
+
+The community has made many more enhancements and bug fixes for the new version. See
+[v8.0 CHANGELOG](https://github.com/PostgREST/postgrest/releases/tag/v8.0.0) for the full list.
+
+### Get Started
+
+Want to get started with PostgREST? The Supabase community has built a number of client libraries to make it simpler to use:
+
+- Javascript: [postgrest-js](https://github.com/supabase/postgrest-js)
+- Rust: [postgrest-rs](https://github.com/supabase/postgrest-rs)
+- Go: [postgrest-go](https://github.com/supabase/postgrest-go)
+- Python: [postgrest-py](https://github.com/supabase/postgrest-py)
+- Dart: [postgrest-dart](https://github.com/supabase/postgrest-dart)
+- C#: [postgrest-csharp](https://github.com/supabase/postgrest-csharp)
+- Swift: [postgrest-swift](https://github.com/supabase/postgrest-swift)
+- Ruby: [postgrest-rb](https://github.com/supabase/postgrest-rb)
+- Kotlin: [postgrest-kt](https://github.com/supabase/postgrest-kt)
+
+### Get involved
+
+- Help with [PostgREST development](https://github.com/PostgREST/postgrest/blob/main/.github/CONTRIBUTING.md).
+- Help with [PostgREST docs translations](https://github.com/PostgREST/postgrest-docs/issues/393).
+- Follow the official [PostgREST Twitter](https://twitter.com/postgrest_org) account.
+
+## Supabase Flutter/Dart (Beta release)
+
+
+
+While the Supabase team have been busy with the Javascript libraries, the community have been beavering away with Dart. They've even
+[built fully-functional apps](https://www.producthunt.com/posts/spot-2d300f54-7a0a-4dbf-aee2-4a75311217cc) using Supabase Auth and Storage.
+
+Today the Community are releasing both the Flutter and Dart libraries in Beta (with a bit of help from the Supabase team).
+
+### Get started
+
+- Check out the [Flutter Quickstart Guide](/docs/guides/with-flutter)
+- Check out the code:
+ - Supabase Flutter: [GitHub](https://github.com/supabase/supabase-flutter/) | [Release](https://pub.dev/packages/supabase_flutter)
+ - Supabase Dart: [GitHub](https://github.com/supabase/supabase-dart/) | [Release](https://pub.dev/packages/supabase)
+
+### Get involved
+
+- Help [write](/docs/handbook/supasquad#author) the Flutter Docs.
+- Help [maintain](/docs/handbook/supasquad#maintainer) the [Flutter](https://github.com/supabase/supabase-flutter/)
+ and [Dart](https://github.com/supabase/supabase-dart/) libraries.
+
+## Supabase Discord
+
+
+
+OK, OK, we get it - GitHub [Discussions](https://github.com/supabase/supabase/discussions) aren't enough for y'all. While we've been trying
+to keep the conversation contained to our GitHub org, the community has been creating [subreddits](https://www.reddit.com/r/Supabase/),
+StackOverflow [tags](https://stackoverflow.com/questions/tagged/supabase), and GitHub [topics](https://github.com/topics/supabase).
+
+A few weeks ago one of the community created a Community-led Discord, and so the team figured we might as well join the fun.
+
+We'll still be using Discussions for debugging, but if you're looking for a place to hang out with Supabase developers, Discord is where to find it.
+
+### Get involved
+
+Join the Supabase Community Discord: [discord.supabase.com](http://discord.supabase.com), say hi, and start building.
+
+[^1]:
+ Supabase has been one of the fastest growing startups [on GitHub](https://github.com/supabase/supabase) for four consecutive quarters:
+ 207% in [Q3](https://runacap.com/ross-index/q3-2020/) 2020; 1,373% in [Q4](https://runacap.com/ross-index/q4-2020/) 2020;
+ 462% in [Q1](https://runacap.com/ross-index/q1-2021/) 2021; 1,653% in [Q2](https://runacap.com/ross-index/q2-2021/) 2021.
diff --git a/www/_blog/2021-07-26-supabase-postgres-13.mdx b/www/_blog/2021-07-26-supabase-postgres-13.mdx
new file mode 100644
index 00000000000..6857acd7d0b
--- /dev/null
+++ b/www/_blog/2021-07-26-supabase-postgres-13.mdx
@@ -0,0 +1,122 @@
+---
+title: 'Supabase is now on Postgres 13.3'
+description: From today, new Supabase projects will be on a version of Supabase Postgres that runs on Postgres 13.3.
+author: angelico_de_los_reyes
+author_url: https://github.com/dragarcia
+author_image_url: https://github.com/dragarcia.png
+authorURL: https://github.com/dragarcia
+image: pg13/postgres-13-og.jpg
+thumb: pg13/postgres-13-thumb.jpg
+tags:
+ - launch-week
+ - database
+date: '2021-07-26'
+toc_depth: 2
+---
+
+From today, new Supabase projects will be on a version of [Supabase Postgres](https://github.com/supabase/postgres) that runs
+on [Postgres 13.3](https://www.postgresql.org/about/news/postgresql-13-released-2077/). This won't be the only big change however in this version.
+Here are a few other things that have changed under the hood.
+
+## PostgreSQL version 13.3
+
+We've jumped from PostgreSQL 12.0 to PostgreSQL [version 13.3](https://www.postgresql.org/docs/13/release-13-3.html), introducing
+significant performance improvements and some great new functionality. Some changes include:
+
+- native [UUID generation](https://www.postgresql.org/docs/13/functions-uuid.html) (!) using `gen_random_uuid`
+- a new JSONB [datetime](https://www.postgresql.org/docs/13/functions-json.html) function
+- vacuuming indexes in [parallel](https://www.postgresql.org/docs/13/sql-vacuum.html)
+- [incremental sorting](https://www.postgresql.org/docs/13/using-explain.html#USING-EXPLAIN-BASICS)
+- smaller [btree indexes](https://www.postgresql.org/docs/13/btree-implementation.html#BTREE-DEDUPLICATION)
+- improvements to [extended statistics](https://www.postgresql.org/docs/13/planner-stats.html#PLANNER-STATS-EXTENDED)
+
+## Supabase Versioning
+
+Our [Postgres repo](https://github.com/supabase/postgres) has jumped from `0.15.0` to `13.3.0`. From now on, both major and minor versions of
+Supabase Postgres will follow PostgreSQL. This makes it much easier to ascertain what version of PostgreSQL is installed. In the situation wherein
+there are no updates to PostgreSQL in between releases, the patch version will be bumped up.
+
+## Large System Extensions (LSE) enabled for ARM instances
+
+
+ *Disclaimer for self-hosting: This is not available for x86 instances. All instances on the
+ Supabase platform have this enabled by default.*
+
+
+The recent wave of Graviton 2 instances from AWS introduces support for the Large System Extensions (LSE). This looks to greatly enhance
+application performance through atomics, and
+[improves locking and synchronisation performance across large systems](https://github.com/aws/aws-graviton-getting-started#building-for-graviton-and-graviton2).
+
+### Preliminary Benchmarks
+
+Below is a comparison between the ARM versions of Supabase Postgres `0.15.0` and `13.3.0`. Both are using `m6gd.8xlarge` instances
+and follow the PostgreSQL configuration [here](https://www.percona.com/blog/2021/01/22/postgresql-on-arm-based-aws-ec2-instances-is-it-any-good/).
+The following configuration of `pgbench` was used.
+
+```bash hideCopy
+pgbench -i -s 150
+```
+
+Running the benchmark with 2, 4, 8, 16, 64, and 128 clients:
+
+```bash hideCopy
+pgbench -P 5 -c {num_clients} -j {num_clients} -T 300 -M prepared postgres
+```
+
+
+
+## Ubuntu 20.04
+
+We have taken the opportunity to upgrade new projects from Ubuntu 18.04 to Ubuntu 20.04. A switch to Ubuntu 20.04 guarantees that the underlying
+OS of Supabase Postgres is supported by the Canonical team up until the year 2025 (2023 for Ubuntu 18.04).
+
+## Built from source
+
+Driven by the need to enable LSE, the underlying PostgreSQL in this version was built from the ground up instead of downloaded binaries.
+Supabase Postgres can now be easily upgraded whenever a new major or minor version of PostgreSQL is released. When PostgreSQL 14 comes out,
+expect Supabase Postgres 14 to quickly follow.
+
+## New Extensions
+
+### `pgRouting`
+
+An extension of PostGIS, [`pgRouting`](https://pgrouting.org/) provides geospatial routing functionality.
+
+More information can be found [here](https://docs.pgrouting.org/latest/en/index.html).
+
+### `wal2json`
+
+Converts WAL output into clean and organized JSON objects.
+
+More information can be found [here](https://github.com/eulerto/wal2json).
+
+## Enhanced security
+
+To help combat brute force attacks, `fail2ban` has now been configured to protect direct connections to Postgres. This applies to both
+ports `5432` (PostgreSQL) and `6543` (PgBouncer).
+
+IPs get banned for 10 minutes after three failed attempts, and we'll continue to fine-tune and improve the protections applied to the
+database servers based on evolving traffic patterns.
+
+## PostgreSQL bundles
+
+`[Coming Soon]`
+
+Last but not the least, we're diversifying the images of Supabase Postgres available in the AWS and Digital Ocean Marketplaces.
+
+Instead of a single option, we'll soon offer four configurations of PostgreSQL. Each bundle offers functionality for
+common use-cases. For example, if you're using Postgres with Serverless functions, you might want to run the PgBouncer bundle. If you want an
+HTTP API with your Postgres offering you might want to run the PostgREST bundle.
+
+| `Name` | `PostgreSQL` | `PgBouncer` | `PostgREST` |
+| ----------------------------------- | ------------ | ----------- | ----------- |
+| Supabase Postgres | ✅ | | |
+| Supabase Postgres: PgBouncer Bundle | ✅ | ✅ | |
+| Supabase Postgres: PostgREST Bundle | ✅ | | ✅ |
+| Supabase Postgres: Complete Bundle | ✅ | ✅ | ✅ |
+
+Each offering will be available for both the `x86` and `arm` architectures.
+
+## Try PostgreSQL 13
+
+Try the new features of PostgreSQL 13.3 today by creating a [new project](https://app.supabase.io/) on Supabase.
diff --git a/www/_blog/2021-07-27-spot-flutter-with-postgres.mdx b/www/_blog/2021-07-27-spot-flutter-with-postgres.mdx
new file mode 100644
index 00000000000..d25c59fe665
--- /dev/null
+++ b/www/_blog/2021-07-27-spot-flutter-with-postgres.mdx
@@ -0,0 +1,90 @@
+---
+title: 'Spot: a video sharing app built with Flutter'
+description: Spot is a geolocation-based video-sharing app with some social networking features.
+author: rory_wilding
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: spot/og-spot-flutter-supabase.jpg
+thumb: spot/cover-spot-flutter-supabase.jpg
+tags:
+ - case-study
+date: '2021-07-27'
+toc_depth: 2
+---
+
+Learn why Tyler decided Flutter and Supabase are the perfect tech-stack shipping innovative ideas fast.
+
+[Tyler Shukert](https://twitter.com/dshukertjr) is an indie developer who has been building websites and applications for seven years.
+Tyler is a Firebase & Flutter expert who recently discovered Supabase. After falling in love with Supabase,
+Tyler decided to launch his latest app. [Spot](https://www.producthunt.com/posts/spot-2d300f54-7a0a-4dbf-aee2-4a75311217cc)
+is a geolocation-based video-sharing app with some social networking features.
+
+## NoSQL doesn't mean No Schema
+
+Tyler loves how easy it is to create high-quality web and mobile applications with Firebase. For the past few years he has honed
+his Flutter, Angular, and Firebase skills to quickly ship mobile and web apps. But the more his development expertise grew,
+the more he understood the limitations of Firebase.
+
+Before starting a project, Tyler is never sure if the project will grow. It could be an overnight success, or it might need to
+pivot in a different direction. He finds this is particularly difficult with Firebase as he faces a denormalization dilemma.
+Denormalization means combining the data into a single table to make data retrieval faster. Google promotes denormalization
+as best practice for a snappier app experience. Denormalisation in Firebase takes work and requires additional development
+time. For new projects, it is often unclear if they will reach a scale justifying the effort denormalization requires.
+In relational databases like Postgres, data is normalized, meaning reduced data redundancy with maintained data integrity.
+
+## Supabase + Flutter: a match made in heaven
+
+When Tyler discovered Supabase on Twitter, he was intrigued by the promise of Postgres with Firebase-like features.
+He wanted the benefits of SQL and Relational schemas, and decided to build an app to test Supabase.
+
+Tyler had been thinking about building Spot, a mobile app for sharing geo-based video content. When he previously planned Spot,
+he felt like hacking around Firebase would be too much effort. After researching the PostGIS extension for geospatial data,
+he realized Supabase was the perfect fit. As an avid Flutter fan, Supabase's Dart library was a bonus.
+Tyler loves the open-source nature of Supabase and immediately began contributing to the Dart library to enable functionality that he needed.
+
+Tyler decided that Spot would be perfect to showcase the power of Supabase and Flutter. Since he's active in the open-source community,
+he decided to open-source the whole project, making Spot one of the most interesting Supabase examples.
+
+
+
+## Comparing Firebase to Supabase
+
+Although Spot seems simple, it has a lot of complicated components. Implementing social "Likes" requires `count` functionality,
+which is notoriously tricky in Firebase. In Supabase, because it's just Postgres under the hood, `count` is implemented
+using a simple SQL `count` query.
+
+Supabase has Row-Level Security, which Tyler uses as a filter - something he can't do with Firebase.
+
+Spot uses Supabase Storage for managing large video files. Firebase Storage [has a reputation](https://stackoverflow.com/questions/43851742/firebase-storage-very-slow-compared-to-firebase-hosting) for slowness until it is public, which was a privacy concern for Tyler. With Supabase Storage, this wasn't an issue - storage is performant and secure.
+
+The Firebase API pricing model makes it is difficult to predict pricing upfront for new projects. With Supabase,
+Tyler doesn't need to worry about how many API calls his project makes.
+
+Supabase gives Spot speed, performance, and predictable pricing.
+
+As of today, Tyler has around 3000 installs for Spot and is getting ready to add new functionality. He is confident Supabase,
+Postgres, and his data structure will enable future development.
+
+
+
+ As soon as I saw Supabase I knew it was the perfect technology to use alongside Flutter to build
+ apps faster than ever. For apps like Spot where we handle user submitted files, it is very easy
+ to manage them securely.
+
+
+ Supabaseを最初発見した時にこれとFlutterを組み合わせれば今まで以上に爆速でアプリ開発ができるだろうと思いました。
+ Spotのようにユーザーがファイルを投稿するアプリの場合でもセキュアに取り扱うのが簡単で本当に助かります。
+
+
+
+## Spot is Open Source
+
+With Supabase, Tyler can use Flutter to build a performant app quickly at a low cost. Tyler is now a massive fan of the Supabase
+experience and has even joined the SupaSquad.
+
+You can download and install spot for [iOS](https://apps.apple.com/us/app/spot-videos/id1564675926?utm_source=supabase&utm_campaign=static)
+and [Android](https://play.google.com/store/apps/details?id=app.spotvideo&utm_source=supabase&utm_campaign=static)
+to see just how snappy his setup is.
+Tyler has fully open-sourced his example - you can [clone the repo](https://github.com/dshukertjr/spot)
+and use it as the basis of your next big idea.
diff --git a/www/_blog/2021-07-27-storage-beta.mdx b/www/_blog/2021-07-27-storage-beta.mdx
new file mode 100644
index 00000000000..cc13a234962
--- /dev/null
+++ b/www/_blog/2021-07-27-storage-beta.mdx
@@ -0,0 +1,169 @@
+---
+title: 'Supabase Storage now in Beta'
+description: Supabase Storage moves into Beta.
+author: inian
+image: launch-week-sql-day-2/supabase-storage-beta-og.jpg
+thumb: launch-week-sql-day-2/supabase-storage-beta.jpg
+tags:
+ - storage
+ - launch-week
+date: '2021-07-27'
+toc_depth: 2
+---
+
+At Supabase, one of our core values is [Kaizen](https://en.wikipedia.org/wiki/Kaizen) - continuous improvement. And that's exactly what we've been doing with Storage since it [launched](/blog/2021/03/30/supabase-storage) three months ago. Today, we are launching the Sequel to Storage Alpha (I bet you didn't see that coming): Storage Beta!
+
+## Streaming Media
+
+We've added support for streaming audio and video files.
+
+Clients can use the `Content-Range` HTTP header to request specific parts of a file from a server. This allows them to intelligently download the parts of the video that a user is viewing, without buffering irrelevant sections of the media file. Supabase Storage now supports this header, making it easier to host and watch [nyan cat videos](https://www.youtube.com/watch?v=SkgTxQm9DWM) all day long.
+
+
+
+
+
+## Public Buckets
+
+Public Buckets have been one of our most requested features. We launched without them because there are too [many horror stories](https://www.google.com/search?q=s3+bucket+negligence+award&oq=s3+bucket+negligence+award) of S3 buckets unintentionally exposing objects. We wanted to take the time to implement safeguards against this.
+
+To enable this feature safely, buckets are made private by default, with an extremely prominent warning in the dashboard when you choose to make them public.
+
+You can make objects public in S3 via multiple mechanisms (e.g. tags, or prefixes). While this allows for flexibility, it makes it hard to discover publicly exposed objects. To prevent any confusion, we decided that buckets must be public in their entirety. This public visibility is straightforward - if it's in a public bucket, it's public!
+
+Objects in public buckets can be accessed via a URL without any Authorization tokens or headers. This makes them perfect for hosting assets for your web or mobile application.
+
+Public buckets still require [Auth Policies](/docs/guides/storage#policy-examples) to upload and delete objects, allowing you to securely manage their contents.
+
+
+
+
+
+## Directory uploads
+
+You can now upload an entire directory to Supabase Storage and the directory structure is fully preserved after the upload. We used the [File and Directory entries API](https://developer.mozilla.org/en-US/docs/Web/API/File_and_Directory_Entries_API) for implementing this. This is a non-standard API, but we didn't find any compatibility issues in the browsers we support. So, now you can upload the [Storage GitHub repo](https://github.com/supabase/storage-api/) to storage 🤓
+
+
+
+
+
+## A New Policy Editor
+
+Postgres [Row Level Security](https://www.postgresql.org/docs/13/ddl-rowsecurity.html) (RLS) is at the core of Supabase Storage and Auth. RLS lets you define complex policies, tightly integrated with Supabase Auth users, using the language you're already comfortable with - SQL.
+
+However, getting started with RLS can be daunting. To make it more approachable for beginners, we've included a set of pre-defined templates on our Dashboard, covering common use-cases.
+
+
+
+Once you've selected a template, you choose which operations to allow and the Dashboard determines which API functions can access the bucket. For example, a user with INSERT permissions will be able to call the `createObject`, `copyObject` and `getSignedObject` functions in the `supabase-js` library.
+
+
+
+After writing the policy definition (which can be any valid SQL expression), you get an opportunity to review the final policy before saving. We made sure that there is no magic going on behind the scenes: you can always see the underlying SQL definition of the policies. As you become more comfortable with Row Level Security, you can define these policies directly using our SQL editor.
+
+## Using Storage in Local development
+
+It took some time to enable Storage on self-hosted Supabase. We wanted to provide a completely local experience during development, but storage had a hard dependency on an object storage service like S3. This required developers to create an S3 bucket, an IAM user in AWS, and add the credentials of the IAM user to the local setup, which was far from an ideal experience.
+
+From day 1, Supabase Storage was designed so that it would be easy to add new Storage backends. We knew we'd add more storage options like Google Cloud Storage or Backblaze, but little did we expect that this would be useful for our self-hosting setup! We implemented a new Storage Backend which [use a local filesystem](https://github.com/supabase/storage-api/blob/master/src/backend/file.ts) for storing objects. You can now get started with Storage without any additional setup, giving you a completely self-contained instance of Supabase.
+
+Check out our updated [self hosting guide](/docs/guides/self-hosting) and our [CLI](https://github.com/supabase/cli) to get started.
+
+## Upload anything
+
+At launch, you could pass in a `File` object and `supabase-js` used `FormData` to send a request to the storage server to upload the file. This made it easy to send the cache control information and other options directly to the server as a multipart request.
+
+However, `FormData` is only supported in the browser, making `supabase-js` incompatible with Node.js. The simplest way to solve this would have been to include the [FormData polyfill](https://www.npmjs.com/package/form-data) along with the library.
+
+At Supabase, we are [maniacal about performance](/blog/2020/12/13/supabase-dashboard-performance). Keeping our client libraries lean is a key differentiator. Our entire client library (including the clients for postgrest, storage, realtime and auth) is just 15.8 kb. If you are just interested in using a single service like storage, you can use the `storage-js` library directly which is [even smaller](https://bundlephobia.com/package/@supabase/storage-js@1.4.0). This made including polyfills like Formdata a no-go.
+
+
+
+We also considered shipping separate bundles for Node.js and the browser. This would have avoided polyfills for APIs which are already supported in each browser. However, this comes with an increase in complexity to our build process, and users would need to choose which flavor of the library to use in different environments like React Native, Deno, etc. We want to make our libraries universal.
+
+Instead, we modified the storage server to accept Binary data directly. With this change, you can directly upload binary Data and even NodeJS streams to the storage API.
+
+
+
+With this change in place, the client library supports uploading `ArrayBuffer`, `ArrayBufferView`, `Blob`, `Buffer`, `File`, `FormData`, `NodeJS.ReadableStream`, `ReadableStream` - without any change to the bundle size! This should enable you to use storage from an even wider range of environments.
+
+## Context menus
+
+The storage explorer in our Dashboard feels like using a file explorer in your operating system. There were a lot of challenges to make it feel intuitive and robust, since S3 is not a traditional filesystem. For example, S3 doesn't support a move operation natively - you need to copy the object to the new location and delete the original object. S3 also doesn't have a concept of directory, which means there is no API call to rename a directory. But to make the storage explorer feel like a native file explorer, we implemented these features.
+
+Context menus on folders
+
+
+Context menus on files
+
+
+### The case of the disappearing folders
+
+As we already mentioned, S3 doesn't really have a concept of directories. So if a user uploads an object with path `dir/subdir/avatar.png`, the dir and subdir are automatically "created" and there is no explicit API call to create them.
+
+This leads to an issue where if a user creates an empty directory and refreshes the page, the directory disappears since it is not persisted to S3. To simulate a normal filesystem (where empty directories are not garbage collected), we upload an empty file when the user creates a directory on the dashboard. The dashboard hides this placeholder file and the placeholder is deleted when the user uploads an object in the directory - voila, no more disappearing directories!
+
+## Performance improvements for large buckets
+
+We significantly improved rendering for a large number of items in the Dashboard. We use a virtualization library to render the objects in view and actively discard DOM elements that are not currently rendered from memory. This makes scrolling through thousands of items buttery smooth.
+
+Here is a demo testing rendering the heaviest object known to mankind - the `node_modules` folder!
+
+
+
+
+
+## API changes
+
+Supabase Storage now supports `upsert`. Shoutout to [@ankitjena](https://github.com/ankitjena) for
+[this Pull Request](https://github.com/supabase/storage-api/pull/32).
+
+
+
+We also have automated API docs generated [here](https://supabase.github.io/storage-api/#/) if you want to use the Storage API directly.
+
+### Storage in the wild
+
+We have a few production applications using Supabase Storage. Wataru is using Storage to power his community site [Shikutoku](https://shikutoku.me/) and Tyler is using Supabase Storage to store short video clips uploaded to his [Spot app](/blog/2021/07/27/spot-flutter-with-postgres) built with Flutter
+
+
+
+ As soon as I saw Supabase I knew it was the perfect technology to use alongside Flutter to build
+ apps faster than ever. For apps like Spot where we handle user submitted files, it is very easy
+ to manage them securely.
+
+
+ Supabaseを最初発見した時にこれとFlutterを組み合わせれば今まで以上に爆速でアプリ開発ができるだろうと思いました。Spotのようにユーザーがファイルを投稿するアプリの場合でもセキュアに取り扱うのが簡単で本当に助かります。
+
+
+
+
+
+ I think it’s a great service, simple and scalable. I like that the dashboard makes it easy to
+ check and search for images.
+
+
+ シンプルで拡張性のある素晴らしいサービスだと思います。ダッシュボードで画像が確認しやすく、検索できるのもいいですね。
+
+
+
+## What's next
+
+We're planning a Content Delivery Network for faster downloads, as well as basic transformation and optimization support for media files (like resizing, etc). We will continue our Kaizen on smaller improvements like allowing configurable upload limits and improving service stability and scalability.
+
+Anything else you want to see or can help implement in Storage? Reach out on our [Discord channel](https://discord.supabase.com/) and give Storage a try by [creating a project](https://app.supabase.io/) on Supabase!
diff --git a/www/_blog/2021-07-28-mobbin-supabase-200000-users.mdx b/www/_blog/2021-07-28-mobbin-supabase-200000-users.mdx
new file mode 100644
index 00000000000..039b82143a0
--- /dev/null
+++ b/www/_blog/2021-07-28-mobbin-supabase-200000-users.mdx
@@ -0,0 +1,89 @@
+---
+title: 'Mobbin uses Supabase to authenticate 200,000 users'
+description: Learn how Mobbin migrated 200,000 users from Firebase for a better authentication experience.
+author: rory_wilding
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: mobbin/og-mobbin-supabase.jpg
+thumb: mobbin/cover-mobbin-supabase.jpg
+tags:
+ - case-study
+ - auth
+date: '2021-07-28'
+toc_depth: 2
+---
+
+Learn how Mobbin migrated 200,000 users from Firebase for a better authentication experience.
+
+Mobbin helps over 200,000 creators globally search and view the latest design patterns from well-known apps.
+Their platform allows creators to search screenshots of mobile apps to inspire product development.
+Creators use Mobbin to combine inspiration and develop new experiences.
+
+## From Idea to 30,000 users in one Product Hunt launch
+
+The initial concept for Mobbin was just a Dropbox full of screenshots. After sharing with their early users,
+the team tried organizing them into folders but this quickly became unscalable. Clear interest from users encouraged them to build a full website. They used Firebase for the backend and launched on
+[Product Hunt](https://www.producthunt.com/posts/mobbin-1).
+
+Mobbin went viral, and within the first week they had 30,000 users. In just over two years, they have grown to over 200,000
+registered users through word of mouth. Their curation continues to attract designers and creators globally.
+
+
+
+## Scaling issues put Mobbin growth at risk
+
+Firebase helped the team launch quickly, but at scale, they found Firebase lacked the functionality required for a high-quality user experience.
+
+The first problem was duplicate user logins. Firebase Authentication doesn't automatically merge users with the same email address.
+For example, users cannot log in with Google and Facebook if they share the same email address.
+Users struggled to upgrade to a paid account because they couldn't remember which authentication provider they signed up with.
+
+Next, they had issues with data integrity. While Firebase has 99.95% uptime, application code can (and does) fail.
+Mobbin didn't want to implement idempotence for every mutative Firebase Function. Between a failed Function execution and a retry,
+a document state might change without strict validation. The team could never be confident their data had the level of integrity they required.
+
+Finally, the team grew concerned with their increasing Firebase bill. Because of the document-based data structure,
+their API requests required several round trips. At one point, they were making 5 million API requests per month.
+These round trips made their website slow and led to a notable time investment hacking together a fix.
+
+
+
+## Migrating to Supabase
+
+Mobbin's initial product gave them a comprehensive understanding of customer requirements. For their second version,
+they needed a better authentication experience, fairer pricing, and a relational database to deliver a quality
+application sustainable for their business model.
+
+The team found Supabase and realized it covered all the bases. Not only that, their team had experience with the
+tools open source tools that Supabase is built with.
+
+Auth, built using [GoTrue](https://github.com/supabase/gotrue), instantly solved their users' login issues.
+Under the hood, Supabase is just Postgres, and Jian Jie (co-founder and CTO of Mobbin) knows this is one of the best battle-tested
+open source relational databases.
+
+They decided that moving to Supabase was a no-brainer. The process itself was smooth - the real challenge was validating their
+data integrity due to historical failures on their serverless functions.
+
+Mobbin is now successfully running on top of Supabase, with superior performance compared to their old Firebase setup.
+Because Supabase does not charge based on API requests, Mobbin significantly reduced their monthly spending without maintaining a custom backend.
+
+
+ Migrating to Supabase meant that we could instantly fix our Auth problems and save money.
+
+ Just being on Supabase alone gives us confidence we can deliver on whatever users need in the
+ future.
+
+
+ The cool thing is now we know under the hood it's just Postgres, it really does feel like
+ anything is possible for the future of our product
+
+
+
+## Supabase saves Mobbin time and money
+
+Migrating to Supabase helped the team at Mobbin instantly improve the end-user experience and save costs.
+They now add new features with confidence, and they continue to help creators all over the globe find inspiration for their next project.
+You can [check out Mobbin on their website](https://mobbin.design/browse/ios/apps).
+
+Sign up to Supabase's free tier and set up a scalable backend in less than 2 minutes.
diff --git a/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx b/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx
new file mode 100644
index 00000000000..2f2972eae53
--- /dev/null
+++ b/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx
@@ -0,0 +1,105 @@
+---
+title: 'Supabase Auth v2: Phone Auth now available'
+description: Phone Auth is available today on all new and existing Supabase projects.
+author: kangmingtay
+author_url: https://github.com/kangmingtay
+author_image_url: https://github.com/kangmingtay.png
+authorURL: https://github.com/kangmingtay
+image: auth-v2/supabase-auth-v2-og.jpg
+thumb: auth-v2/supabase-auth-v2-cover.jpg
+tags:
+ - launch-week
+ - auth
+date: '2021-07-28'
+toc_depth: 3
+---
+
+Since launching Supabase Auth [last summer](https://news.ycombinator.com/item?id=24072051) it's proven to be a key part of the Supabase Stack.
+We receive a constant stream of feature requests and community PRs resulting in a long
+list of external providers including GitHub, Discord, Azure, Apple and more.
+
+Supabase Auth is similar to Auth0 and Firebase Auth with one major difference - the user data lives in your own database,
+reducing lock-in, and making the auth system more extensible. You can write native PostgreSQL Row Level Security policies to
+determine which data your users should (or should not) have access to. It can even be used in conjunction with other Supabase features,
+such as [Storage](/storage), to control access for specific files and buckets.
+
+Today we're announcing some major new features for our [fork](https://github.com/supabase/gotrue) of Netlify's [GoTrue](https://github.com/netlify/gotrue) Auth server.
+
+## Phone Auth is here!
+
+Your users can now log in using their mobile with SMS-based OTPs (one-time password).
+
+### Passwordless SMS login
+
+Users can log in using a passwordless SMS based OTP with `supabase-js`, or directly with the Auth API.
+
+
+
+After logging in, the user will receive a six-digit One Time Password. The OTP can be easily verified.
+
+
+
+### SMS login with passwords
+
+Phone Auth can be used in conjunction with a password. Using this flow, your users can subsequently log in
+with either an OTP or a phone + password combo.
+
+
+
+### Choose an SMS Provider
+
+Supabase Auth supports [Twilio](https://www.twilio.com/) as an SMS provider, with more options coming soon.
+Simply plug your Twilio credentials into your Auth Settings in the Supabase Dashboard to get started.
+
+Check out the [documentation](/docs/guides/auth/auth-twilio) to get started with Mobile OTPs,
+or watch the [Youtube guide](https://youtu.be/akScoPO01bc).
+
+
+
+### Multi-Factor Auth coming soon
+
+Phone Auth is available today on all new and existing Supabase projects. We've also laid the groundwork for mobile Multi-Factor
+Auth and will be offering that as an option soon.
+
+## Even more OAuth providers
+
+The community has contributed tons of OAuth providers, and today we're announcing two more.
+
+Shoutout to [@ph1p](https://github.com/ph1p) who contributed [Twitch](/docs/guides/auth/auth-twitch) as our latest OAuth provider!
+The Supabase team added [Discord](/docs/guides/auth/auth-discord) last month, bringing the total OAuth Providers to ten.
+
+
+
+You can request more providers on our [Auth repo](https://github.com/supabase/gotrue) and Pull Requests are, of course, always welcome.
+
+## Generate Confirmation Links
+
+To make life easy for developers, the Supabase hosted platform manages all Auth-related emails, including confirmation,
+recovery, invite, and passwordless "magic-link" emails. The templates are customizable and we even offer the ability to bring your own SMTP provider.
+
+Some of our power users require a little more flexibility however. We've had a lot of requests to dynamically generate email content,
+especially for sending internationalized emails. To handle situations like these, today we're adding the ability to
+generate confirmation, invite, recovery, and magic links via an API endpoint.
+
+We've exposed this functionality in `supabase-js`, and it can be invoked with the use of your `service_role` admin key
+(which means you should only be calling this function from a backend and not from the client itself).
+
+
+
+## What's next?
+
+The next major item on the list is MFA (Multi-Factor Authentication) - which includes TOTP
+([Time-Based One Time Password](https://en.wikipedia.org/wiki/Time-based_One-Time_Password)).
+
+Find out how Mobbin is using Supabase Auth to [manage 200,000 users](/blog/2021/07/28/mobbin-supabase-200000-users).
+
+Anything else you want to see or can help implement in Auth? Reach out on
+[Discord](https://discord.supabase.com/) and give Auth a try by [creating a project](https://app.supabase.io/) on Supabase!
diff --git a/www/_blog/2021-07-29-supabase-reports-and-metrics.mdx b/www/_blog/2021-07-29-supabase-reports-and-metrics.mdx
new file mode 100644
index 00000000000..4b499a803f0
--- /dev/null
+++ b/www/_blog/2021-07-29-supabase-reports-and-metrics.mdx
@@ -0,0 +1,125 @@
+---
+title: 'Supabase Reports and Metrics'
+description: We're exposing a full set of metrics in your projects, so that you can build better (and faster) products for your users.
+author: div_arora
+author_url: https://github.com/darora
+author_image_url: https://github.com/darora.png
+authorURL: https://github.com/darora
+image: launch-week-sql-day-4-reports-and-metrics/supabase-reports-and-metrics-og.jpg
+thumb: launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-thumb.jpg
+tags:
+ - launch-week
+ - reports
+ - database
+date: '2021-07-29'
+toc_depth: 3
+---
+
+Supabase offers a supercharged Postgres instance, along with a set of complementary services, making it easy to build mobile and web applications.
+Today, we're exposing a full set of metrics in your projects, so that you can build better (and faster) products for your users.
+
+## Reports page
+
+We've added a new "Reports" section to the Dashboard. You can view one month of data, including
+API requests across all of Supabase's core pillars:
+Database, Auth and Storage. We've included two instance health metrics, CPU usage and Memory usage,
+with a lot more on the way.
+
+
+
+All charts are built with [Recharts](https://recharts.org/en-US), an MIT-licensed React chart library chosen for its ease of use.
+We'll add customizable charts in the future, so we'd love to hear which libraries you'd like to see in Supabase.
+
+We support one configurable report per project, accessible and editable by all team members. In the next few weeks,
+we'll expand to unlimited reports, with longer date range options, new layout configurations, report templates,
+stacked charts and private/public visibility across your project's members.
+
+## New project home page
+
+Every project has a new home page with a weekly overview of important metrics. We've included usage bars for Database storage,
+number of Auth users, and Storage space.
+
+And we're just getting warmed up. Over the next few months you'll see more project information, notifications, and highlights to
+monitor your project health at a glance.
+
+
+
+## Observability metrics
+
+Backend as a Service? Infrastructure as a Service? We don't care about the label, but we do care about giving developers the relevant
+observability metrics. Supabase gives you a full Postgres cluster for every project, and now we give you the tools to diagnose and manage
+important infrastructure anomalies.
+
+All databases are now launched with `pg_stat_statements` enabled, so you can expect some useful query statistics in the future too.
+
+
+
+## Building a metrics pipeline
+
+"If you can't measure it, you can't improve it."
+
+### Full control, full responsibility
+
+When developers build services and applications on top of Supabase, relying on the platform's reliability and performance.
+Product observability is critical, as it allows developers to make decisions on where to spend their optimization dollars,
+and to get ahead of possible issues before they become showstoppers.
+
+At Supabase, each project is provisioned with a Postgres cluster, and a suite of associated services that add, ahem,
+supa-powers to the database.
+
+
+
+Our users get liberal access to each of these services - you can use PostgREST for a RESTful API,
+Realtime to listen to changes in your Postgres instance, or even just open a raw connection to the database.
+While this makes for an extremely flexible offering, it presents a diverse cast of [foot-guns](https://en.wiktionary.org/wiki/footgun).
+Want to mess with Realtime? Why not bulk-insert millions of records on tables you've configured it to watch?
+Feel like taking out your entire database? Just connect to it and run a wildly inefficient query!
+
+We're continuously rolling out protections to mitigate failure scenarios and to minimize the blast radius.
+However, given the power and flexibility exposed via our services and the diverse workloads they support,
+our users remain best positioned to make the call on what's reasonable for their project.
+As such, we're also working on exposing as much data as possible to them.
+
+### Gathering relevant metrics
+
+Given the setup described above, there are two major categories of metrics that we care about.
+There are metrics pertinent to the services mentioned ("Project Metrics") that get spun up for each project
+(e.g. the number of active connections to the db), and there are metrics for the underlying infrastructure
+(e.g. system health). Most of the time, our users shouldn't have to care about the latter,
+though the nature of leaky abstractions dictates that sometimes they become relevant to Project Metrics as well.
+
+In order to build a comprehensive view of the project's health, each service needs to be instrumented along with its
+underlying infrastructure. We're looking at hundreds of thousands of targets at our current scale
+(likely approaching millions in the near future) each of them presenting hundreds of metrics of interest (every minute!).
+
+To buy ourselves some headroom, we built a federated approach: we run instances of our monitoring systems in each
+geographical region we operate in. This provides a natural dimension for sharding, while reducing the latency for everyone.
+We run [Prometheus](https://prometheus.io/) out of inertia, soon to be [VictoriaMetrics](https://victoriametrics.com/).
+The monitoring instances scrape data from a number of exporters that are bundled into each of our projects.
+A small subset of the metrics collected gets aggregated to a centralized VictoriaMetrics instance for easier cohort analysis.
+
+
+
+### Available sources and metrics
+
+To start with, we're focusing on metrics a few of the most pertinent metrics:
+
+- Database metrics: CPU and RAM usage
+- API Requests: Ingress, Egress, `GET`, `POST`, `PATCH`, `PUT`, `OPTIONS`, and all requests.
+- Storage Requests: Ingress, Egress, `GET`, `POST`, `PATCH`, `PUT`, `OPTIONS`, and all requests.
+- Auth Requests: Ingress, Egress, `GET`, `POST`, `PATCH`, `PUT`, `OPTIONS`, and all requests.
+
+## What's next?
+
+Where to begin?
+
+- Multiple reports per project: we've started with just one report per project, but in the next few weeks we'll allow you to create as many as you want.
+- More metrics: we're just getting started.
+ - Number of active connections to your database.
+ - Various detailed stats from `pg_stat_statements`, `pg_stat_bgwriter`, `pg_stat_database`, `pg_stat_database_conflicts`.
+ - System level metrics like CPU, memory and disk utilization.
+- Granularity: project statistics will come down to hourly.
+- Longer time periods: view historical data going back several months.
+- Interactive widgets: view-only reports are fine, but we wouldn't be a Postgres company if we didn't allow you to write your own SQL queries.
+
+Any other metrics you want to see in your projects? Reach out on our [Discord channel](https://discord.supabase.com/) and give Supabase a try by [creating a project](https://app.supabase.io/).
diff --git a/www/_blog/2021-07-30-1-the-supabase-hackathon.mdx b/www/_blog/2021-07-30-1-the-supabase-hackathon.mdx
new file mode 100644
index 00000000000..9db102a40a5
--- /dev/null
+++ b/www/_blog/2021-07-30-1-the-supabase-hackathon.mdx
@@ -0,0 +1,140 @@
+---
+title: 'The Supabase Hackathon'
+description: A whole week of Hacking for Fun and Prizes.
+author: ant_wilson
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: hackathon/og-supabase-hackathon.png
+thumb: hackathon/cover-supabase-hackathon.png
+tags:
+ - launch-week
+ - hackathon
+date: '2021-07-30'
+toc_depth: 3
+---
+
+# The Supabase Hackathon
+
+We've reached the end of [Launch Week II: The SQL](/blog/2021/07/22/supabase-launch-week-sql) - but it's the start of something else...
+
+The first Supabase Hackathon starts **right now**.
+
+## Key Facts
+
+- You have 7 days to build a new **Open Source** project using Supabase
+- It can be whatever you want - a project, app, tool, library, anything
+- Enter as an individual, or as a team of up to 5 people
+- Submission deadline is 11:59pm Friday night PDT (6th August 2021)
+- You can win one of these extremely [Limited Edition Olympic Gold](https://store.supabase.com/products/hackathon-prize) and Silver Supabase T-Shirts
+
+
+
+## Details
+
+### Schedule
+
+- Opening Ceremony - the Hackathon begins **NOW**! (8am PDT 30th July 2021)
+- Work on your project any time this week
+- Submission deadline (11.59pm PDT Friday 6th August 2021)
+- Judges Deliberate (Saturday + Sunday)
+- Medal Ceremony (Winners Announced) (9pm PDT Monday 9th August 2021)
+
+### Prizes
+
+There are 5 chances to win, there will be prizes for:
+
+- Best Overall Project
+- Most Visually Pleasing
+- Most Technically Impressive
+- Most Fun/Interesting
+- Best Meme (add it to your README)
+
+There will be a winner and a runner-up prize for each category.
+
+
+
+### Submission
+
+You should submit your project using [this form](https://forms.gle/erYrSFKSErKVBFFC8).
+
+You will be asked to send a link to a GitHub (or similar) repo, in the README you should include:
+
+- link to hosted demo (if applicable)
+- list of team members GitHub handles (and Twitter if they have one)
+- any demo videos, instructions, or memes
+- a brief description of how you used Supabase:
+ - to store data?
+ - realtime?
+ - auth?
+ - storage?
+- any other info you want the judges to know (motivations/ideas/process)
+- optional team photo
+
+### Judges
+
+We have assembled an All Star Judging Panel:
+
+- [@swyx](https://twitter.com/swyx/)
+- [@themarcusbattle](https://twitter.com/themarcusbattle)
+- The Supabase Team
+- One more Mystery Guest
+
+
+
+They will be looking for a few things, including:
+
+- creativity/inventiveness
+- functions correctly/smoothly
+- visually pleasing
+- technically impressive
+- use of Supabase features
+ - deep usage of a single feature or
+ - broad usage are both ok
+- FUN! 😃
+
+### Rules
+
+- Team size 1-5 (all team members on winning teams will receive a prize)
+- You cannot be in multiple teams
+- One submission per team
+- All design elements, code, etc. for your project must be created **during** the event
+- All entries must be Open Source (link to source code required in entry)
+- Must use Supabase in some capacity
+- Can be any language or framework
+- You must submit before the deadline (no late entries)
+- You can continue to make updates to your project after the submission deadline, but there is no guarantee that the judges will see additions made after the submission time.
+
+### Community
+
+The Supabase Team will be taking part in the Hackathon and you'll find us live building in our discord all week. We're temporarily adding two channels:
+
+- Text channel: hackathon
+- Audio channel: hackathon
+
+If you need help or advice when building, find other people to join your team, or if you just want to chill and watch people build, come and join us!
+
+[Join our Discord](https://discord.supabase.com)
+
+
+
+### Guides
+
+Here's a collection of resources that will help you get started building with Supabase:
+
+- [Examples and Resources](/docs/guides/examples)
+- [Supabase Crash Course](https://www.youtube.com/watch?v=7uKQBl9uZ00) [video]
+- [Flutter Quickstart Guide](/docs/guides/with-flutter)
+- [Nextjs Quickstart Guide](/docs/guides/with-nextjs)
+- [Using Supabase inside Replit](/blog/2021/03/11/using-supabase-replit)
+- [Full Stack Development with Next.js and Supabase – The Complete Guide](https://www.freecodecamp.org/news/the-complete-guide-to-full-stack-development-with-supabas/)
+- [Auth Deep Dive - Learn everything there is to know about Supabase Auth](/docs/learn/auth-deep-dive/auth-deep-dive-jwts) [videos]
+- [Send SMS notifications using Twilio](https://www.twilio.com/blog/send-sms-notifications-supabase-users-node-js-twilio-messaging)
+- [How to Integrate Supabase in Your Ionic App](https://www.youtube.com/watch?v=pl9XfIWutKE) [video]
+- [Building a Slack clone with authentication and realtime data syncing using Supabase](https://www.youtube.com/watch?v=LUMxJ4w-MUU) [video]
+- [Creating Protected Routes In NextJS With Supabase](https://aboutmonica.com/blog/creating-protected-routes-in-next-js-with-supabase)
+
+### Additional Info
+
+- Any intellectual property developed during the hackathon will belong to the team that developed it. We expect that each team will have an agreement between themselves regarding the IP, but this is not required
+- By making a submission you grant Supabase permission to use screenshots, code-snippets and/or links to your project or content of your README on our Twitter, blog, website, email updates, and in the Supabase discord server. Supabase does not make any claims over your IP.
diff --git a/www/_blog/2021-07-30-supabase-functions-updates.mdx b/www/_blog/2021-07-30-supabase-functions-updates.mdx
new file mode 100644
index 00000000000..37e7c281c3d
--- /dev/null
+++ b/www/_blog/2021-07-30-supabase-functions-updates.mdx
@@ -0,0 +1,251 @@
+---
+title: 'Updates for Supabase Functions'
+description: The question on everyone's mind - are we launching Supabase Functions? Well, it's complicated.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: functions-updates/og-supabase-hooks.jpg
+thumb: functions-updates/thumb-supabase-hooks.jpg
+tags:
+ - launch-week
+ - functions
+date: '2021-07-30'
+toc_depth: 3
+---
+
+The question on everyone's mind - are we launching Supabase Functions? Well, it's complicated.
+
+Today we're announcing _part_ of Functions - Supabase Hooks - in Alpha, for all **new** projects.
+
+We're also releasing support for Postgres Functions and Triggers in our Dashboard, and some timelines for the rest of Supabase Functions.
+Let's cover the features we're launching today before the item that everyone is waiting for: Supabase Functions.
+
+## PostgreSQL Functions
+
+(Not to be confused with Supabase Functions!)
+
+Postgres has built-in support for [SQL functions](https://www.postgresql.org/docs/current/sql-createfunction.html). Today we're making it even easier for developers to build PostgreSQL Functions by releasing a native Functions editor. Soon we'll release some handy templates!
+
+
+
+You can call PostgreSQL Functions with `supabase-js` using your project API [[Docs](/docs/reference/javascript/rpc)]:
+
+```js hideCopy
+const { data, error } = await supabase.rpc('best_star_wars_series', {
+ name: 'The Prequels',
+})
+```
+
+## PostgreSQL Triggers
+
+[Triggers](https://www.postgresql.org/docs/current/trigger-definition.html) are another amazing feature of Postgres, which allows you to execute any SQL code after inserting, updating, or deleting data.
+
+While triggers are a staple of Database Administrators, they can be a bit complex and hard to use. We plan to change that with a simple interface for building and managing PostgreSQL triggers.
+
+
+
+## Supabase Functions
+
+They say building a startup is like jumping off a cliff and assembling the plane on the way down. At Supabase it's more like assembling a 747 since, although we're still in Beta, thousands of companies depend on us to power their apps and websites.
+
+For the past few months we've been designing Supabase Functions based on our customer feedback.
+
+### BYO Functions, zero lock-in
+
+A recurring request from our customers is the ability to trigger their _existing_ Functions.
+This is especially true for our Enterprise customers, but also Jamstack developers who develop API Functions directly within their stack (like Next.js [API routes](https://nextjs.org/docs/api-routes/introduction), or Redwood [Serverless Functions](https://redwoodjs.com/docs/serverless-functions)).
+
+### Timeline
+
+To meet these goals, we're releasing Supabase Functions in stages:
+
+- _Stage 1:_ Give developers the ability to trigger external HTTP functions - today, using Function Hooks.
+- _Stage 2:_ Give developers the ability to trigger their own Serverless functions on AWS and GCP - Q4 2021.
+- _Stage 3:_ Release our own Serverless Functions (Supabase Functions) - Q4 for Early Preview customers.
+
+
+
+## Function Hooks (Alpha)
+
+Today we're releasing Functions Hooks in `ALPHA`. The `ALPHA` tag means that it is NOT stable, but it's available for testing and feedback. The API will change, so do not use it for anything critical. You have been warned.
+
+Hooks? Triggers? Firestore has the concept of [Function Triggers](https://firebase.google.com/docs/functions/firestore-events), which are very cool.
+Supabase Hooks are the same concept, just with a different name.
+Postgres already has the concept of [Triggers](https://www.postgresql.org/docs/current/triggers.html), and we thought this would be less confusing[^1].
+
+### Hook Events
+
+Function Hooks allow you to "listen" to any change in your tables to trigger an asynchronous Function. You can hook into a few different events:`INSERT`, `UPDATE`, and `DELETE`. All events are fired **after** a database row is changed. Keen eyes will be able to spot the similarity to Postgres triggers, and that's because Function Hooks are just a convenience wrapper around triggers.
+
+
+
+### Hook Targets
+
+Supabase will support several different targets.
+
+- HTTP/Webhooks: Send HTTP requests directly from your Postgres Database.
+- AWS Lambda/Google Cloud Run: Provide Supabase with a restricted IAM role to trigger Serverless functions natively.
+- Supabase Functions: We'll develop an end-to-end experience.
+
+
+
+### Hook Payload
+
+If the target is a Serverless function or an HTTP `POST` request, the payload is automatically generated from the underlying table data. The format matches Supabase [Realtime](/docs/reference/javascript/subscribe), except in this case you don't a client to "listen" to the changes. This provides yet another mechanism for responding to database changes.
+
+```ts hideCopy
+type InsertPayload = {
+ type: 'INSERT'
+ table: string
+ schema: string
+ record: TableRecord
+ old_record: null
+}
+type UpdatePayload = {
+ type: 'UPDATE'
+ table: string
+ schema: string
+ record: TableRecord
+ old_record: TableRecord
+}
+type DeletePayload = {
+ type: 'DELETE'
+ table: string
+ schema: string
+ record: null
+ old_record: TableRecord
+}
+```
+
+## Hooks technical design: `pg_net v0.1`
+
+As with most of the Supabase platform, we leverage PostgreSQL's native functionality to implement Function Hooks.
+
+To build hooks, we've released a new PostgreSQL Extension, [pg_net](https://github.com/supabase/pg_net/), an asynchronous networking extension with an emphasis on scalability/throughput. In its initial (unstable) release we expose:
+
+- asynchronous HTTP `GET` requests.
+- asynchronous HTTP `POST` requests with a JSON payload.
+
+The extension is (currently) capable of >300 requests per second and is the networking layer underpinning Function Hooks. For a complete view of capabilities, check out [the docs](https://supabase.github.io/pg_net/api/).
+
+### **Usage**
+
+`pg_net` allows you to make asynchronous HTTP requests directly within your SQL queries.
+
+```sql
+-- Make a request
+select
+ net.http_post(
+ url:='https://httpbin.org/post',
+ body:='{"hello": "world"}'::jsonb
+ );
+
+-- Immediately returns a response ID
+http_post
+---------
+ 1
+```
+
+After making a request, the extension will return an ID. You can use this ID to collect a response.
+
+```sql hideCopy
+-- Collect the response from a request
+select
+ *
+from
+ net.http_collect_response(1);
+
+-- Results (1 row)
+status | message | response
+--------+---------+----------
+SUCCESS ok (
+ status_code := 200,
+ headers := '{"date": ...}',
+ body := '{"args": ...}'
+ )::net.http_response_result
+```
+
+You can cast the response to JSON within PostgreSQL:
+
+```sql
+-- Collect the response json payload from a request
+select
+ (response).body::json
+from
+ net.http_collect_response(request_id:=1);
+```
+
+Result:
+
+```json noCopy
+ {
+ "args": {},
+ "data": "{\"hello\": \"world\"}",
+ "files": {},
+ "form": {},
+ "headers": {
+ "Accept": "*/*",
+ "Content-Length": "18",
+ "Content-Type": "application/json",
+ "Host": "httpbin.org",
+ "User-Agent": "pg_net/0.1",
+ "X-Amzn-Trace-Id": "Root=1-61031a5c-7e1afeae69bffa8614d8e48e"
+ },
+ "json": {
+ "hello": "world"
+ },
+ "origin": "135.63.38.488",
+ "url": "https://httpbin.org/post"
+ }
+(1 row)
+```
+
+### Implementation
+
+To build asynchronous behavior, we use a PostgreSQL [background worker](https://www.postgresql.org/docs/current/bgworker.html) with a [queue](https://github.com/supabase/pg_net/blob/3d52e7758909bb73bf7fa4586f42cea73ed239b6/sql/pg_net--0.1.sql#L11-L19). This, coupled with the [libcurl multi interface](https://curl.se/libcurl/c/libcurl-multi.html), enables us to do multiple simultaneous requests in the same background worker process.
+
+Shout out to [Paul Ramsey](https://github.com/pramsey), who gave us the implementation idea in [pgsql-http](https://github.com/pramsey/pgsql-http/#to-do). While we originally hoped to add background workers to his extension, the implementation became too cumbersome and we decided to start with a clean slate. The advantage of being async can be seen by making some requests with both extensions:
+
+```sql hideCopy
+\timing on
+
+-- using pgsql-http to fetch from "supabase.io" 10 times
+select
+ *
+from
+ http_get('https://supabase.com')
+cross join
+ generate_series(1, 10) _;
+
+-- Returns in 3.5 seconds
+Time: 3501.935 ms
+
+-- using pg_net to fetch from "supabase.io" 10 times
+select
+ net.http_get('https://supabase.com')
+from
+ generate_series (1,10) _;
+
+-- Returns in 1.5 milliseconds
+Time: 1.562 ms
+```
+
+Of course, the sync version waits until each request is completed to return the result, taking around 3.5 seconds for 10 requests; while the async version returns almost immediately in 1.5 milliseconds. This is really important for Supabase hooks, which run requests for every event fired from a SQL trigger - potentially thousands of requests per second.
+
+### Future/Roadmap
+
+This is only the beginning! First we'll thoroughly test it and make a stable release, then we expect to add support for
+
+- the remaining HTTP methods (`PUT` / `PATCH`)
+- synchronous HTTP
+- additional protocols e.g. SMTP, FTP
+- more throughput (using epoll)
+
+## Get started today
+
+Function Hooks is enabled today on all [new projects](https://app.supabase.io). Find it under Database > Alpha Preview > Function Hooks.
+
+
+
+[^1]: Postgres also has the concept of [Hooks](/blog/2021/07/01/roles-postgres-hooks), but they're more of an internal concept.
diff --git a/www/_blog/2021-07-30-supabase-swag-store.mdx b/www/_blog/2021-07-30-supabase-swag-store.mdx
new file mode 100644
index 00000000000..5e4b4ffdba6
--- /dev/null
+++ b/www/_blog/2021-07-30-supabase-swag-store.mdx
@@ -0,0 +1,66 @@
+---
+title: 'Supabase Swag Store'
+description: Today we are officially launching the Supabase Swag Store.
+author: rory_wilding
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: swag-store/og-supabase-swag-store.jpg
+thumb: swag-store/cover-swag-store.jpg
+tags:
+ - launch-week
+ - swag
+date: '2021-07-30'
+toc_depth: 3
+---
+
+Today we are officially [launching the Supabase Swag Store](https://store.supabase.com/).
+
+Since we started gifting swag, we are constantly asked, "when will you launch a store?".
+We take our swag game seriously. We're as hands-on with our swag as we are with our repos.
+When you receive an item of swag from Supabase, you can be confident that we designed it, managed the production, packed it, and posted it.
+
+This process often means late nights for the team, making sure things are packed and ready to dispatch for the next day.
+Why? Because we want to offer high-quality swag to our users.
+
+
+
+## Swaggable Behavior
+
+Our primary goal with swag is gifting. We send swag to developers who make meaningful contributions to Supabase in a variety of ways.
+This includes:
+
+- 📺 Creating Supabase related content.
+- 🐛 Finding bugs in our software and reporting them or helping fix them.
+- ⁉️ Answering questions and helping on GitHub discussions, Discord, Twitter.
+- 👨💻 Developers who create pull requests on GitHub.
+- 📲 Advocates who share Supabase related content on social media.
+- 📚 Developers who contribute to open source libraries
+
+
+
+For example, [Hassan's tweet caught our eye](https://twitter.com/Nutlope/status/1389082406477463557) because the idea is
+innovative and uses Supabase as part of an interesting tech stack. We are amazed by the creative use cases you all find for Supabase.
+We love it when folks #buildinpublic and share open-source examples that benefit the entire community.
+
+We do our best to identify members of the community engaging in these "swaggable behavior".
+We don't have a specific benchmark for these activities. We can say, if you are engaging in these behaviors regularly,
+then our Chief Swag Officer will find you and will get swag to you. We also like to do occasional random giveaways to
+show some love for folks in the conversation. We will continue to announce these via Twitter and Discord.
+
+
+
+We have had significant demand from users who just wanted to rock some Supabase swag.
+So, we decided to launch the [Supabase Swag Store](https://store.supabase.com/).
+
+We will put our hands up here and tell you we built the store using Shopify. We couldn't dogfood an entire eCommerce store.
+Shopify is good enough, and we wanted to go live with this as part of launch week 🚀 👩🚀
+
+Due to the lack of outsourcing, we need to highlight several things about the Supabase store:
+
+- We post from Singapore 💌 . There is currently a pandemic underway that is disrupting the international postal services. We currently have limited shipping options, and delivery can take some time. We are now trying to improve our delivery options while keeping as much control of the swag supply chain as possible. You can read more about our shipping conditions here.
+- Swag is limited. We do limited production runs, usually to around 100 t-shirts at a time 👕
+- If it's in stock on the site, then you can buy it. If it's not, we will be working on a restock. The priority with inventory is to reward those contributing to Supabase. We will be actively trying to gift swag. When swag does land, it will likely sell out quickly. You can sign up to get alerted when there is a new swag drop. You can let us know here 👉 [swag@supabase.io](mailto:swag@supabase.io)
+- In-house designs and small runs mean some swag will be limited edition. Once it's gone, it's gone forever. You might need to be fast to get it while it's 🔥
+
+Check out the [Supabase Swag Store](https://store.supabase.com/)
diff --git a/www/_blog/2021-08-09-hackathon-winners.mdx b/www/_blog/2021-08-09-hackathon-winners.mdx
new file mode 100644
index 00000000000..6970bd58eae
--- /dev/null
+++ b/www/_blog/2021-08-09-hackathon-winners.mdx
@@ -0,0 +1,159 @@
+---
+title: 'Open Source Hackathon Winners'
+description: Let the medal ceremony begin for the best projects submitted during the Supabase Hackathon.
+author: ant_wilson
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: hackathon-winners/misc/winners-og.png
+thumb: hackathon-winners/misc/winners-og.png
+tags:
+ - hackathon
+date: '2021-08-09'
+toc_depth: 2
+---
+
+# The Medal Ceremony
+
+We've reached the end of the first ever Supabase Hackathon and the entries have all been incredible. We received way more entrants than expected and therefore it took our judging panel a little longer than expected to get through their deliberations.
+
+Thanks to everyone who joined in, and made this hackathon awesome. We're already looking forward to the next one. But for now, let's dish out some medals.
+
+Don't forget that all the projects here are Open Source, so you can always dive into the code, PR, or fork projects you find interesting.
+
+## Best Overall Project
+
+### Winner
+
+[Work From](https://github.com/joshcawthorne/work-from) - by [@cawthornejosh](https://twitter.com/cawthornejosh)
+
+Josh's project allows employees to log which days and hours they'll be working and gives everyone on the team and within the company an overview of who is working when. The animations, UI/UX of this submission combined with the fact that it was built within a single week was absolutely mind-blowing!
+
+[](https://github.com/joshcawthorne/work-from)
+
+### Runner Up
+
+[Fireplace](https://github.com/0xDebabrata/fireplace) - by [@0xDebabrata](https://twitter.com/0xDebabrata), [@\_anishbasu](https://twitter.com/_anishbasu), [@DebMondalX](https://github.com/DebMondalX)
+
+Fireplace makes great use of Supabase Storage for a shared video streaming experience, the killer feature here was the ability to share play, pause, and skip events across multiple users.
+
+[](https://github.com/0xDebabrata/fireplace)
+
+## Most Visually Pleasing
+
+### Winner
+
+[Flutter Dictionary App](https://github.com/KathirvelChandrasekaran/dictionary_app) - by [@KathirvelChandrasekaran](https://github.com/KathirvelChandrasekaran)
+
+The judges found the design of this Flutter app to be super impressive, the animations and color palette are especially top drawer!
+
+[](https://github.com/KathirvelChandrasekaran/dictionary_app)
+
+### Runner Up
+
+[Avatar Village](https://github.com/dshukertjr/avatar-village) - by [@dshukertjr](https://twitter.com/dshukertjr)
+
+Tyler's app allows you to come together and chat with strangers in the browser, the feature we loved most was the randomized avatar generation (click the button in the top right to try it out)
+
+[](https://github.com/dshukertjr/avatar-village)
+
+## Most Technically Challenging
+
+### Winner
+
+[Feature.so](https://github.com/richiemcilroy/feature) - by [@richiemcilroy](https://twitter.com/richiemcilroy)
+
+Boss work from Richie here - simply add a snippet to your app, then build and manage the components of your application from the Feature dashboard. An amazing example of where no-code is going.
+
+[](https://github.com/richiemcilroy/feature)
+
+### Runner Up
+
+[Flutter Add-ons](https://github.com/bdlukaa/supabase_addons) - by [@bdlukaa](https://twitter.com/bdlukaa)
+
+Hook up your supabase credentials and Flutter app and Add-ons will start collecting metrics, analytics, and crashalytics, all in a neat dashboard with great visualization tools. Unbelievable that bdlukaa was able to build this in the space of a week.
+
+[](https://github.com/bdlukaa/supabase_addons)
+
+## Most Fun/Interesting
+
+### Winner
+
+[Peckish Peach](https://github.com/Ngineer101/peckish-peach) - by [@nwbotha](https://twitter.com/nwbotha)
+
+Add at 4 or more ingredients to your list and Peckish Peach will use ML to generate a full recipe. You can have some real fun adding random foods together and seeing what the algo comes up with. Bonus points for the adorable Peach gif!
+
+[](https://github.com/Ngineer101/peckish-peach)
+
+### Runner Up
+
+[Tamagotreal](https://github.com/mgilangjanuar/tamagotreal) - by [@mgilangjanuar](https://twitter.com/mgilangjanuar)
+
+Instagram for Pets! The best bit is all the interactions inside the app are from the perspective of your pet. We were loving the Tamagotchi throwback!
+
+[](https://github.com/mgilangjanuar/tamagotreal)
+
+## Best Meme
+
+### Winner
+
+This cheeky one from lautaro had us tickled.
+
+[Bittermate Meme](https://github.com/imlautaro/bittermate#meme) - by [@mgilangjanuar](https://twitter.com/dev_lautaro)
+
+### Runner Up
+
+[Multiple Memes](https://github.com/rotimi-best/sveltedoc) - by [@rotimi-best](https://github.com/rotimi-best)
+
+ - by [@wycowley](https://github.com/wycowley), by [@SonavAgarwal](https://github.com/SonavAgarwal)
+
+## The Prizes
+
+All gold medal winners will be contacted and sent one of these limited edition gold Supabase tees (one per team member), and all runners up will receive the same design in silver. Prize winners should keep an eye on their emails so we can collect T-Shirt size and shipping details.
+
+
+
+### Other Notable Projects
+
+Here's a list of Projects that made the shortlist or otherwise caught the judges eye:
+
+- [comradery](https://github.com/carlomigueldy/comradery)
+- [furniture-exchange](https://github.com/dhaiwat10/furniture-exchange)
+- [notes-overflow](https://github.com/DharmarajX24/notes-overflow/)
+- [accio](https://github.com/fabianferno/accio)
+- [discussbase](https://github.com/hilmanski/discussbase)
+- [supabubbabase](https://github.com/ivanq3w/supabubbabase)
+- [angular-starters](https://github.com/jneterer/angular-starters)
+- [newbaseql](https://github.com/jonas-kgomo/newbaseql)
+- [hartup](https://github.com/Rahat-ch/hartup)
+- [ambient](https://github.com/sambarrowclough/ambient)
+- [stories_w_supabase](https://github.com/semihpolat/stories_w_supabase)
+- [Tokenized](https://github.com/Senkottuvelan/Tokenized)
+- [fttx app](https://github.com/fttx-gr/app)
+- [secret-diary](https://github.com/zernonia/secret-diary)
+
+### Participation Prize
+
+We also decided that everyone else should receive some participation prize, so we will be in touch with all the participants via email to collect your shipping details.
+
+If you want to join the community and build with us, find other people using Supabase, or if you just want to chill and watch people build, come and join us in Discord!
+
+[Join our Discord](https://discord.supabase.com)
+
+
+
+### Get Started Guides
+
+If you're inspired to build, here's a collection of resources that will help you get started building with Supabase:
+
+- [Examples and Resources](/docs/guides/examples)
+- [Supabase Crash Course](https://www.youtube.com/watch?v=7uKQBl9uZ00) [video]
+- [Flutter Quickstart Guide](/docs/guides/with-flutter)
+- [Nextjs Quickstart Guide](/docs/guides/with-nextjs)
+- [Using Supabase inside Replit](/blog/2021/03/11/using-supabase-replit)
+- [Full Stack Development with Next.js and Supabase – The Complete Guide](https://www.freecodecamp.org/news/the-complete-guide-to-full-stack-development-with-supabas/)
+- [Auth Deep Dive - Learn everything there is to know about Supabase Auth](/docs/learn/auth-deep-dive/auth-deep-dive-jwts) [videos]
+- [Send SMS notifications using Twilio](https://www.twilio.com/blog/send-sms-notifications-supabase-users-node-js-twilio-messaging)
+- [How to Integrate Supabase in Your Ionic App](https://www.youtube.com/watch?v=pl9XfIWutKE) [video]
+- [Building a Slack clone with authentication and realtime data syncing using Supabase](https://www.youtube.com/watch?v=LUMxJ4w-MUU) [video]
+- [Creating Protected Routes In NextJS With Supabase](https://aboutmonica.com/blog/creating-protected-routes-in-next-js-with-supabase)
diff --git a/www/_blog/2021-08-12-supabase-beta-july-2021.mdx b/www/_blog/2021-08-12-supabase-beta-july-2021.mdx
new file mode 100644
index 00000000000..5ca7355fb2b
--- /dev/null
+++ b/www/_blog/2021-08-12-supabase-beta-july-2021.mdx
@@ -0,0 +1,142 @@
+---
+title: Supabase Beta July 2021
+description: Discord Logins, Vercel Integration, Full text search, and OAuth guides.
+author: ant_wilson
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: 2021-july/release-july-2021.jpg
+thumb: 2021-july/release-july-2021-cover.jpg
+tags:
+ - release-notes
+date: '2021-08-12'
+toc_depth: 2
+---
+
+July ended with our second "Launch Week", where we shipped something every day for a week. There's a lot to get through this time!
+
+### Quick demo
+
+Watch a full demo of this month's releases.
+
+
+
+## Launch Week II: The SQL
+
+Following the success of our first Launch Week in March, we finished July with "[Launch Week II: The SQL](/blog/2021/07/22/supabase-launch-week-sql)".
+The community has been sieving through a slew of bad puns and retro memes to discover the new feature announcements.
+
+
+
+## Auth v2 with Phone Auth
+
+Your users can now log in with SMS based mobile auth! We have a Twilio integration ([Guide Here](/docs/guides/auth/auth-twilio)) and will be adding more providers soon.
+
+Other Auth updating include, Twitch logins, and the ability to generate invite, recovery, confirmation, and magic links via the API,
+for people who want more control over the email templating flow. Read the [blog post here](/blog/2021/07/28/supabase-auth-passwordless-sms-login).
+
+
+
+## Storage is now in Beta
+
+Storage updates include Media Streaming, Public Buckets, Directory Uploads, and a Performance Improvements.
+
+Streaming Media in particular opens up a whole new host of potential use cases, learn more about the [updates here](/blog/2021/07/27/storage-beta).
+
+
+
+## Dashboard v2
+
+We made some major new additions to the dashboard including usage statistics, a new project home, and tons of database insights.
+Check the [post here](/blog/2021/07/29/supabase-reports-and-metrics) on what you get and how we built it.
+
+
+
+## We launched a Discord server
+
+You'll find us hanging out regularly in the #hangout channel.
+We even "live-fixed" some production errors in there on Monday night (which occurred literally 1 hour before our first announcement of the week! Typical!).
+We're fast approaching 1,500 members so come and join the action! [discord.supabase.com](https://discord.supabase.com)
+
+
+
+## PostgreSQL 13
+
+All new Supabase projects will be launched with PostgreSQL 13.3, and we're working on a migration path for old projects.
+This gives you [looooaads of new stuff out the box](/blog/2021/07/26/supabase-postgres-13).
+
+
+
+## PostgREST v8.0
+
+We worked with our friends at [PostgREST](https://postgrest.org/) to make some [huge improvements](/blog/2021/07/26/supabase-community-day#postgrest-version-80).
+For those of you who don't know, every Supabase instance comes with a dedicated PostgREST server by default,
+which provides the auto-generated CRUD API that we wrap with `supabase-js`.
+
+
+
+## Flutter/Dart support
+
+Our community driven libs for the fast growing mobile and web framework are now in beta. Learn more by following the [Quickstart guide](/docs/guides/with-flutter).
+
+
+
+## Hackathon
+
+We're running a week long hackathon starting NOW. There are some legit prizes, and you can win in a bunch of different categories.
+Check the [full instructions here](/blog/2021/07/30/1-the-supabase-hackathon) on how to participate. Submissions close next Friday at midnight PST.
+
+
+
+## Hooks & Functions
+
+We made an announcement on the progress of functions, and even shipped a few preliminary components, try them out and give us feedback as we continue to move towards this next major milestone.
+Read the latest [updates here](/blog/2021/07/30/supabase-functions-updates).
+
+
+
+## Swag Store
+
+Get your hands on some [Supabase Swag](https://store.supabase.com/), hand packed and mailed by our team based in Singapore.
+
+
+
+## Community
+
+- [@traversymedia](https://twitter.com/traversymedia) made a [Supabase Crash Course](https://www.youtube.com/watch?v=7uKQBl9uZ00) video
+- [@themarcusbattle](https://twitter.com/themarcusbattle/status/1419638564573360130?s=20) wrote a [guide](https://www.twilio.com/blog/send-sms-notifications-supabase-users-node-js-twilio-messaging) on sending sms notifications using node.js, Twilio, and Supabase (this is different to sms auth above)
+- [@dots_hq](https://twitter.com/dots_hq) launched a slack/discord [community management tool](https://dots.community/) built on Supabase
+- [@KennethCassel](https://twitter.com/KennethCassel) launched a [platform for building programming courses](https://www.slip.so/) using Supabase
+- [@MobbinDesign](https://twitter.com/MobbinDesign) migrated their UI/UX library app to Supabase, currently [serving 200,000 users](/blog/2021/07/28/mobbin-supabase-200000-users)
+- To the amazing users who are helping moderate our discord server, ya'll are amazing
+
+**Supabase GitHub Star Growth**
+
+
+
+
+ Source: repository.surf/supabase
+
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or
+[follow us on Twitter](https://twitter.com/supabase).
+
+## Coming Next
+
+Security, stability, performance ... and Functions.
+
+## Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-09-10-supabase-beta-august-2021.mdx b/www/_blog/2021-09-10-supabase-beta-august-2021.mdx
new file mode 100644
index 00000000000..e30edd18101
--- /dev/null
+++ b/www/_blog/2021-09-10-supabase-beta-august-2021.mdx
@@ -0,0 +1,165 @@
+---
+title: Supabase Beta August 2021
+description: Fundraising, Realtime Security, custom SMS templates, and deployments in South Korea.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: 2021-august/release-august-2021.jpg
+thumb: 2021-august/release-august-2021-cover.jpg
+tags:
+ - release-notes
+date: '2021-09-10'
+toc_depth: 3
+---
+
+We've raised $30M and shipped a bunch of features. Let's dive into what's been happening at Supabase during the month of August.
+
+### Quick recap
+
+Watch a recap of this month's release.
+
+
+
+## We raised $30 million
+
+Hot off the press, we raised our Series A.
+We'll use the funds to do more of the same - ship features and hire open source developers.
+We'll release more details soon. Read more on [TechCrunch](https://techcrunch.com/2021/09/09/supabase-raises-30m-for-its-open-source-insta-backend/).
+
+
+
+## Realtime Security, codename: WALRUS
+
+If you've been waiting for Row Level Security to land in Postgres [subscriptions](/docs/reference/javascript/subscribe),
+then you're going to love our new repo:
+[Write Ahead Log Realtime Unified Security (WALRUS)](https://github.com/supabase/walrus).
+The name might be a bit forced, but the security design is deliberate.
+It's not in production yet, but we're making the repo public for comments using an
+[RFC process](https://github.com/supabase/walrus/blob/master/README.md#rfc-process).
+
+
+
+## Custom SMS templates
+
+If you're using SMS login in [Auth v2](/blog/2021/07/28/supabase-auth-passwordless-sms-login), you can now customize the SMS which is sent to your users. Read more in the [docs](/docs/guides/auth/auth-twilio#sms-custom-template).
+
+
+
+## Dart and Flutter Docs
+
+Thanks entirely to [@dshukertjr](https://twitter.com/dshukertjr), we now have in-depth [reference Dart documentation](/docs/reference/dart/installing) for CRUD, Auth, Realtime and more!
+
+
+
+## We launched the South Korea region
+
+We added another region for those wanting to host their data and APIs in Seoul. We now have 12 regions to choose from
+
+
+
+## Table creation is even easier
+
+You can now create columns while creating your table. We've also added improvements for composite primary keys and foreign key creation.
+
+
+
+## Unbreakable CSV Imports
+
+Our previous importer would choke on CSV files which were too large. Not any more!
+
+
+
+## Connection strings
+
+We now provide a handy copy utility for various database connection strings because we were so tired of looking them up on Stack Overflow.
+
+
+
+## We released a primer on Row Level Security
+
+RLS can be a bit foreign for developers getting started with Postgres.
+This video by [@\_dijonmusters](https://twitter.com/_dijonmusters) demystifies it. If you find the video a useful medium for learning, consider [subscribing to our channel](https://www.youtube.com/c/supabase).
+
+
+
+## Community
+
+### We had a community Hackathon
+
+We held a one-week async Hackathon. Check out [all the winners](/blog/2021/08/09/hackathon-winners) - it was truly impressive what people were able to build in just 7 days.
+
+
+
+### We had a team Hackathon
+
+The Supabase team didn't want to miss out on the fun so we held our own hackathon. It was a good way to dog food. Some notable projects include
+
+- [Supaflix](https://supaflix.vercel.app/) by [@abc3](https://twitter.com/abc3erl) [[GitHub](https://github.com/abc3/supaflix)] - a Netflix clone build with Supabase
+- [Personal-Casts](https://github.com/inian/personal-casts) by [@everconfusedguy](https://twitter.com/everconfusedguy) [[GitHub](https://github.com/inian/personal-casts)] - converts Youtube videos and articles into a personal podcast feed.
+- And it wouldn't be a Supabase hackathon without a high-effort meme entry.
+ Check out [meme.town](http://meme.town) by [@Joshenlimek](https://twitter.com/joshenlimek) [[GitHub](https://github.com/joshenlim/meme-maker)]
+
+
+
+### GitHub Trending
+
+We hit 18,000 stars on GitHub, and got to the [top of GitHub trending](https://twitter.com/supabase/status/1435868863518760964) for Typescript.
+
+
+
+
+ Source: repository.surf/supabase
+
+
+If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/c/supabase) or
+[follow us on Twitter](https://twitter.com/supabase).
+
+## Dependency contributions
+
+### GoTrue (Auth)
+
+- HCaptcha - users can add captcha on their passwordless logins to prevent abuse
+ [https://github.com/supabase/gotrue/pull/192](https://github.com/supabase/gotrue/pull/192)
+- Email change endpoint is fixed (sends out 2 emails, one to the old email and one to the new one)
+ [https://github.com/supabase/gotrue/pull/132](https://github.com/supabase/gotrue/pull/132)
+
+### PostgREST (APIs)
+
+- Allow a function with single unnamed parameter to be called with POST
+ [https://github.com/PostgREST/postgrest/issues/1735](https://github.com/PostgREST/postgrest/issues/1735)
+
+### pg_net (Function Hooks)
+
+- Better handling of URL errors
+ [https://github.com/supabase/pg_net/issues/39](https://github.com/supabase/pg_net/issues/39)
+
+## Coming Next
+
+Last December we [moved from Alpha to Beta](/beta), with a focus on Security, Performance, and Reliability. After a couple of Launch Weeks pushing out new and sexy features, we have decided it's time to focus on these again.
+
+By the time we're done, Supabase will be production-ready for all use cases.
+
+## Get started
+
+- Start using Supabase today: [app.supabase.io](https://app.supabase.io/)
+- Make sure to [star us on GitHub](https://github.com/supabase/supabase)
+- Follow us [on Twitter](https://twitter.com/supabase)
+- Subscribe to our [YouTube channel](https://www.youtube.com/c/supabase)
+- Become a [sponsor](https://github.com/sponsors/supabase)
diff --git a/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx b/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx
new file mode 100644
index 00000000000..0fc25d86734
--- /dev/null
+++ b/www/_blog/2021-09-28-supabase-hacktoberfest-hackathon-2021.mdx
@@ -0,0 +1,152 @@
+---
+title: 'Supabase Hacktoberfest Hackathon 2021'
+description: We're running another Supabase Hackathon during Hacktoberfest!
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: hacktoberfest-hackathon/hacktoberfest_banner.png
+thumb: hacktoberfest-hackathon/hacktoberfest_banner.png
+tags:
+ - hacktoberfest
+ - hackathon
+date: '2021-09-28'
+toc_depth: 3
+---
+
+# Supabase Hacktoberfest Hackathon 2021
+
+We were absolutely blown away by [all the amazing projects](/blog/2021/08/09/hackathon-winners) you built during our [first Supabase Hackathon](/blog/2021/07/30/1-the-supabase-hackathon), that we were looking for an excuse to run our next virtual open-source hackathon, and we found it in the upcoming [Hacktoberfest](https://hacktoberfest.digitalocean.com/).
+
+## Here's the plan
+
+- On **Friday Oct 1st at 08:00am PT** we're kicking things off with our Hacktoberfest Discord Hangout. Join us in the #hackathon channel on our Discord server: [https://discord.gg/bnncdqgBSS](https://discord.gg/bnncdqgBSS)
+- Then you have 10 days to build a new **open-source** project with Supabase or contribute to one of our [supabase-community projects](https://github.com/supabase-community?q=topic%3AHacktoberfest&type=&language=&sort=) that have the `hacktoberfest` topic.
+- It can be whatever you want - a project, mobile app, tool, library, anything
+- Enter as an individual, or as a team of up to 5 people
+- Submission deadline is **Sunday Oct 10th at 11:59pm PT**
+- Besides [earning your Hacktoberfest shirt](https://hacktoberfest.digitalocean.com/resources/participation), you can win some extremely limited edition Supabase swag ✨ (see [here](https://twitter.com/supabase/status/1440737587895799809?s=21) what folks won last time!)
+
+## Details
+
+### Timeline
+
+- **Friday Oct 1st at 08:00am PT:** Opening Ceremony in the #hackathon channel [on Discord](https://discord.gg/bnncdqgBSS).
+- Build your project during the next 10 days and hang out with the community [on Discord](https://discord.gg/bnncdqgBSS).
+- **Sunday Oct 10th at 11:59pm PT:** Submission deadline
+- Judges Deliberate (Monday)
+- We'll be contacting and announcing the winners [on Twitter](https://twitter.com/supabase) throughout the week after.
+
+ {' '}
+
+### Prize categories
+
+There are 5 chances to win, there will be prizes for:
+
+- Best Overall Project
+- Most Visually Pleasing
+- Most Technically Impressive
+- Best mobile project (can user Flutter, React Native, Ionic, etc.)
+- Most Spooky/Fun (Halloween is coming up!)
+
+There will be a winner and a runner-up prize for each category.
+
+### Submission
+
+Submit your project via [madewithsupabase.com/hacktoberfest](https://www.madewithsupabase.com/hacktoberfest)
+
+You will be asked to send a link to a GitHub (or similar) repo, in the README you should include:
+
+- link to hosted demo (if applicable)
+- list of team members github handles (and twitter if they have one)
+- any demo videos, instructions, or memes
+- a brief description of how you used Supabase:
+ - to store data?
+ - realtime?
+ - auth?
+ - storage?
+- any other info you want the judges to know (motivations/ideas/process)
+- _optional_ team photo
+
+### Judging & announcement of winners
+
+The Supabase team will excitedly review what you've built. They will be looking for a few things, including:
+
+- creativity/inventiveness
+- functions correctly/smoothly
+- visually pleasing
+- technically impressive
+- use of Supabase features
+ - deep usage of a single feature or
+ - broad usage are both ok
+- FUN! 😃
+
+We'll be contacting and announcing winners [on Twitter](https://twitter.com/supabase) throughout the week after submission closes.
+
+ {' '}
+
+### Rules
+
+- Team size 1-5 (all team members on winning teams will receive a prize)
+- You cannot be in multiple teams
+- One submission per team
+- All design elements, code, etc. for your project/feature must be created **during** the event
+- All entries must be Open Source (link to source code required in entry)
+- Must use Supabase in some capacity
+- Can be any language or framework
+- You must submit before the deadline (no late entries)
+- You can continue to make updates to your project after the submission deadline, but there is no guarantee that the judges will see additions made after the submission time.
+
+### Community & help
+
+Hang out with the Supabase team and community on Discord:
+
+- Text channel: hackathon
+- Audio channel: hackathon
+
+If you need help or advice when building, find other people to join your team, or if you just want to chill and watch people build, come and join us!
+
+Join our Discord: [discord.gg/bnncdqgBSS](https://discord.gg/bnncdqgBSS)
+
+
+
+### Resources & Guides
+
+Here's a collection of resources that will help you get started building with Supabase:
+
+- Need some inspiration? [See what folks built last time](/blog/2021/08/09/hackathon-winners)!
+- [Examples and Resources](/docs/guides/examples)
+- [Supabase Crash Course](https://www.youtube.com/watch?v=7uKQBl9uZ00) [video]
+- [Flutter Quickstart Guide](/docs/guides/with-flutter)
+- [Nextjs Quickstart Guide](/docs/guides/with-nextjs)
+- [Using Supabase inside Replit](/blog/2021/03/11/using-supabase-replit)
+- [Full Stack Development with Next.js and Supabase – The Complete Guide](https://www.freecodecamp.org/news/the-complete-guide-to-full-stack-development-with-supabas/)
+- [Auth Deep Dive - Learn everything there is to know about Supabase Auth](/docs/learn/auth-deep-dive/auth-deep-dive-jwts) [videos]
+- [Send SMS notifications using Twilio](https://www.twilio.com/blog/send-sms-notifications-supabase-users-node-js-twilio-messaging)
+- [How to Integrate Supabase in Your Ionic App](https://www.youtube.com/watch?v=pl9XfIWutKE) [video]
+- [Building a Slack clone with authentication and realtime data syncing using Supabase](https://www.youtube.com/watch?v=LUMxJ4w-MUU) [video]
+- [Creating Protected Routes In NextJS With Supabase](https://aboutmonica.com/blog/creating-protected-routes-in-next-js-with-supabase)
+
+### Additional Info
+
+- Any intellectual property developed during the hackathon will belong to the team that developed it. We expect that each team will have an agreement between themselves regarding the IP, but this is not required
+- By making a submission you grant Supabase permission to use screenshots, code-snippets and/or links to your project or content of your README on our twitter, blog, website, email updates, and in the Supabase discord server. Supabase does not make any claims over your IP.
diff --git a/www/_blog/2021-10-04-supabase-beta-sept-2021.mdx b/www/_blog/2021-10-04-supabase-beta-sept-2021.mdx
new file mode 100644
index 00000000000..4c9e3ec8ec6
--- /dev/null
+++ b/www/_blog/2021-10-04-supabase-beta-sept-2021.mdx
@@ -0,0 +1,131 @@
+---
+title: Supabase Beta Sept 2021
+description: Hackathon, Aborting request, UI updates, and now Hiring.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: 2021-sept/release-sept-2021.jpg
+thumb: 2021-sept/release-sept-2021-cover.jpg
+tags:
+ - release-notes
+date: '2021-10-04'
+toc_depth: 3
+---
+
+Did you know it's been 2 years since the [first commit](https://github.com/supabase/realtime/commit/175f649784147af80acfc9ff5be9d160285c76ea) to Realtime, our real-time engine for Postgres? Before we even existed as a company!
+We spent this month updating docs and content, improving UX, and [onboarding Developer Advocates](https://twitter.com/thorwebdev/status/1441041268411277322)!
+
+## Hackathon v2
+
+To kick off [Hacktoberfest](https://hacktoberfest.digitalocean.com/), another Supabase Hackathon is happening [right now](/blog/2021/09/28/supabase-hacktoberfest-hackathon-2021). You've got another 7 days to be in to win a limited edition t-shirt.
+
+
+
+## Abort Requests
+
+We added support for [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) in our Javascript library so that you can abort long-running queries. [[Docs](/docs/reference/javascript/select#aborting-requests-in-flight)]
+
+
+
+## Improved table management
+
+We've made a number of changes to the Dashboard to expose some great features of PostgreSQL including:
+
+### Column types
+
+We've improved the column Type field so that it supports your [custom types](https://www.postgresql.org/docs/current/sql-createtype.html).
+
+
+
+### Is Unique
+
+We've made it simple to add a unique constraint when creating or editing a table.
+
+
+
+### Edit columns
+
+By popular request, you can now view all columns in a table at a glance and edit them in bulk.
+
+
+
+## Cross-schema relationships
+
+We updated our [grid](https://github.com/supabase/grid) to support relationships across multiple schemas.
+
+
+
+## Improved Auth Docs
+
+We've revamped the Auth docs - The docs are now broken down into [Authentication](/docs/guides/auth/auth-apple) and [Authorization](/docs/guides/auth/row-level-security), and organized alongside our [Deep Dive](/docs/learn/auth-deep-dive/auth-deep-dive-jwts) series.
+
+
+
+## Low Code demo
+
+Low Code demo, Using Supabase with [Clutch.io](http://clutch.io/) - [@\_dijonmusters](https://twitter.com/_dijonmusters) ran a [session at General Assembly](https://www.youtube.com/watch?t=642&v=5fsKMTeBKKY) showing how to use these two tools together to create apps using a low code approach.
+
+
+
+## Community
+
+There was a lot of new content this month.
+
+### Videos
+
+- How I built the #10 product in 30 days - [Gary Tokman [video]](https://www.youtube.com/watch?v=CS1myTKJBR4)
+- GitHub OAuth flow with Supabase + React - [Nader Dabit [video]](https://www.youtube.com/watch?v=jSqTzZk9UMg)
+- The Best Stack for Web Developers - [Christopher Kapic [video]](https://www.youtube.com/watch?v=-2s_87QkPEI)
+- Flutter + Supabase Course - [Abhishvek [video]](https://www.youtube.com/watch?v=PjVG6QtUYw4)
+- React Native Mobile Auth - [Aaron Saunders [video]](https://www.youtube.com/watch?v=aBuB-Q6vHDE)
+- Self Hosting Supabase - [Kelvin Pompey [video]](https://www.youtube.com/watch?v=HCqta43JHkU)
+- Teta Flutter Frontend builder - [Teta Team [product]](https://www.youtube.com/watch?v=rooTglpUuvE)
+- Magic Link + Route Controls in Next.js - [Nader Dabit [Video]](https://www.youtube.com/watch?v=oXWImFqsQF4)
+- Supabase in 6 minutes - [Nader Dabit [video]](https://www.youtube.com/watch?v=ogEitL8RwtQ)
+
+### Twitter
+
+We hit 16.5k followers. [Follow us](https://twitter.com/supabase/status/1441428275176247302) there for advance frontend tips and 👁️⚡👁️
+
+
+
+### GitHub
+
+Not far from 20K stars: [github.com/supabase/supabase](http://github.com/supabase/supabase)
+
+
+
+Source: [repository.surf/supabase](https://repository.surf/supabase)
+
+### Discord
+
+Our Discord is growing fast. Come hangout with 3500+ developers building on Supabase today: [discord.supabase.com](http://discord.supabase.com)
+
+
+
+## Hiring
+
+We're Hiring [SREs](https://about.supabase.com/careers/sre). We're fully remote and we love Open Source. [See open roles](https://about.supabase.com/careers).
+
+
+
+## Coming Next
+
+We're warming up for another Launch Week! Last time was "[Launch Week II: the SQL](/blog/2021/07/22/supabase-launch-week-sql)". We're going to need another month to come up with a good pun again, so we'll aim for November.
+
+## Get started
+
+- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
+- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
+- Follow us **[on Twitter](https://twitter.com/supabase)**
+- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
+- Become a **[sponsor](https://github.com/sponsors/supabase)**
diff --git a/www/_blog/2021-10-14-hacktoberfest-hackathon-winners-2021.mdx b/www/_blog/2021-10-14-hacktoberfest-hackathon-winners-2021.mdx
new file mode 100644
index 00000000000..7b05bded6e1
--- /dev/null
+++ b/www/_blog/2021-10-14-hacktoberfest-hackathon-winners-2021.mdx
@@ -0,0 +1,157 @@
+---
+title: 'Hacktoberfest Hackathon Winners 2021'
+description: Celebrating many amazing projects submitted to our Hacktoberfest Hackathon.
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: hackathon-winners/misc/hacktoberfest-og.png
+thumb: hackathon-winners/misc/hacktoberfest-og.png
+tags:
+ - hacktoberfest
+ - hackathon
+date: '2021-10-14'
+toc_depth: 2
+---
+
+Hacktoberfest is in full swing and we've been blown away by [all the incredible projects]() submitted to our second open-source Hackathon.
+
+We've picked our top ten favourite projects across five categories, and believe us, it was a tough decision to make!
+
+Since all submissions were so stellar, we've decided to reward everyone with a [limited edition participation tee](https://store.supabase.com/products/hacktoberfest-participation-tee).
+
+Now, let us introduce the winner and runner up for each category, and see below for the even more limited edition swag they've won!
+
+Lastly, remember that all projects are open-source, so do check them out and spend the second half of Hacktoberfest contributing to your favourite projects!
+
+## Best Overall Project
+
+### Winner
+
+[Pickle](https://github.com/alizahid/pickle) - by [@alizahid0](https://twitter.com/alizahid0)
+
+Ali built a blazingly fast, privacy and developer focused analytics service. Complete with a dashboard and docs. And the dashboard even syncs events in realtime. Mind blowing stuff!
+
+[](https://github.com/alizahid/pickle)
+
+### Runner Up
+
+[og:supa](https://github.com/janniks/ogsupa) - by [@jnnksbrt](https://twitter.com/jnnksbrt)
+
+og:supa is a snazzy site allowing you to generate og:images for your posts to make empty link previews a thing of the past. And the site looks fabulous itself!
+
+[](https://github.com/janniks/ogsupa)
+
+## Most Visually Pleasing
+
+### Winner
+
+[CourseBuddy](https://github.com/seufernandez/coursebuddy) - by [@seufernandez](https://twitter.com/seufernandez)
+
+Fernand built a platform for students to share their learnings and notes with each other. A great cause with a great design and some awesome illustrations.
+
+[](https://github.com/seufernandez/coursebuddy)
+
+### Runner Up
+
+[Relm](https://github.com/imsaptarshi/relm) - by [@imsaptarshiii](https://twitter.com/imsaptarshiii)
+
+Relm is a platform to help you build, manage, and nurture your communities, with features around managing events, tracking analytics, and sending newsletters. Complete with a slick design and UX.
+
+[](https://www.loom.com/share/58f6be6a1f7241a3843b1edc82a3a40a)
+
+## Most Technically Impressive
+
+### Winner
+
+[Feedback](https://github.com/drmzio/feedback) - by [@drmzio](https://twitter.com/drmzio)
+
+Daniel built a feedback widget that you can include on your page to easily collect your user's sentiment about your page. Our feedback for Daniel: we love it!
+
+[](https://github.com/drmzio/feedback)
+
+### Runner Up
+
+[Party Parrot as a Service](https://github.com/highlight-run/party-parrot-as-a-service) - by [@c00brill](https://twitter.com/c00brill), [@theJayKhatri](https://twitter.com/theJayKhatri), [@JohnPhamous](https://twitter.com/JohnPhamous)
+
+Who doesn't love a custom party parrot Slack emoji, but who has time to create a gif for each team member?! Let us introduce: Party Parrot as a Service! Just input a picture with your face in it and PPaaS will find it and create a party parrot gif for you!
+
+
+
+[](https://www.loom.com/share/8a20eac10ee94708960bd86835e3a000)
+
+## Best Mobile Project
+
+### Winner
+
+[Utility Manager Flutter App](https://github.com/KathirvelChandrasekaran/utility_manager_flutter_supabase) - by [@KathirvelChandrasekaran](https://github.com/KathirvelChandrasekaran)
+
+Kathirvel's [dictionary app](https://github.com/KathirvelChandrasekaran/dictionary_app) won him a [limited edition gold tee](https://store.supabase.com/products/hackathon-prize?variant=40662411673755) at our last hackathon, and with his not only useful but also brilliantly looking utility manager Flutter app he's able to extend his collection of limited edition Supabase tees. Well done!
+
+[](https://github.com/KathirvelChandrasekaran/utility_manager_flutter_supabase)
+
+### Runner Up
+
+[TLWR](https://github.com/croquies/TLWR) - by [@Aqudi](https://github.com/Aqudi), [croquies](https://github.com/croquies)
+
+Taejung and Wonmo built a logger tool for Flutter based apps that logs and visualizes the path a user takes through your app to identify improvements to your user experience.
+
+[](https://youtu.be/Yx4N2bONA44)
+
+## Most Spooky/Fun
+
+### Winner
+
+[Spookd](https://github.com/netgfx/Spookd) - by [@netgfx](https://twitter.com/netgfx)
+
+Michael prototyped a spooky halloween game using Framer and then made it actually playable by connecting Framer with Supabase. Now that's spooky good fun!
+
+[](https://youtu.be/8SsWL3unwGI)
+
+### Runner Up
+
+[uwudaily](https://github.com/maggie-j-liu/uwudaily) - by [@maggie-j-liu](https://github.com/maggie-j-liu), [@sampoder](https://github.com/sampoder), and [@eilla1](https://github.com/eilla1)
+
+This project by a group of high school students gave us the feel good vibes. On the one hand with their awesome website that conveniently lets you log your daily vibes and check in on your friends', and on the other hand because high school students are building brilliant things with Supabase. How freaking cool is that?!
+
+[](https://github.com/maggie-j-liu/uwudaily)
+
+## The Prizes
+
+As is now tradition with Supabase Hackathons, the winners will receive an [extremely limited edition gold medal shirt](https://store.supabase.com/products/hacktoberfest-gold-tee).
+
+
+
+The same goes for the [silver medal shirts](https://store.supabase.com/products/hacktoberfest-silver-tee).
+
+
+
+### Participation Prize
+
+It was extremely tough to pick the winners because of all the stellar submissions. As a thank you for sharing your fabulous projects with us and the community, we've decided to award a [limited edition participation tee](https://store.supabase.com/products/hacktoberfest-participation-tee) to everyone who submitted their projects to the hackathon. We'll be contacting everyone via Twitter or email in the coming days with instructions of how to redeem your extremely limited and valuable shirts.
+
+
+
+## Hang out with us and the community
+
+If you want to join the community and build with us, find other people using Supabase, or if you just want to chill and watch people build, come and join us in Discord!
+
+[Join our Discord](https://discord.supabase.com)
+
+
+
+### Get Started Guides
+
+If you're inspired to build, here's a collection of resources that will help you get started building with Supabase:
+
+- [Examples and Resources](/docs/guides/examples)
+- [Supabase Crash Course](https://www.youtube.com/watch?v=7uKQBl9uZ00) [video]
+- [Flutter Quickstart Guide](/docs/guides/with-flutter)
+- [Nextjs Quickstart Guide](/docs/guides/with-nextjs)
+- [Using Supabase inside Replit](/blog/2021/03/11/using-supabase-replit)
+- [Full Stack Development with Next.js and Supabase – The Complete Guide](https://www.freecodecamp.org/news/the-complete-guide-to-full-stack-development-with-supabas/)
+- [Auth Deep Dive - Learn everything there is to know about Supabase Auth](/docs/learn/auth-deep-dive/auth-deep-dive-jwts) [videos]
+- [Send SMS notifications using Twilio](https://www.twilio.com/blog/send-sms-notifications-supabase-users-node-js-twilio-messaging)
+- [How to Integrate Supabase in Your Ionic App](https://www.youtube.com/watch?v=pl9XfIWutKE) [video]
+- [Building a Slack clone with authentication and realtime data syncing using Supabase](https://www.youtube.com/watch?v=LUMxJ4w-MUU) [video]
+- [Creating Protected Routes In NextJS With Supabase](https://aboutmonica.com/blog/creating-protected-routes-in-next-js-with-supabase)
diff --git a/www/_blog/2021-10-19-replenysh-time-to-value-in-less-than-24-hours.mdx b/www/_blog/2021-10-19-replenysh-time-to-value-in-less-than-24-hours.mdx
new file mode 100644
index 00000000000..6b4eb895c5b
--- /dev/null
+++ b/www/_blog/2021-10-19-replenysh-time-to-value-in-less-than-24-hours.mdx
@@ -0,0 +1,77 @@
+---
+title: 'Replenysh uses Supabase to implement OTP in less than 24-hours'
+description: Learn how Replenysh uses Supabase to power the circular economy, redefining how brands interact with their customers and products.
+author: rory_wilding
+author_url: https://github.com/roryw10
+author_image_url: https://github.com/roryw10.png
+authorURL: https://github.com/roryw10
+image: replenysh/og-replenysh.png
+thumb: replenysh/thumb-replenysh.png
+tags:
+ - case-study
+ - auth
+date: '2021-10-19'
+toc_depth: 2
+---
+
+Replenysh connects brands who want to recover their products and packaging with communities looking to monetize used materials.
+
+Learn how Replenysh uses Supabase to power the circular economy, redefining how brands interact with their customers & products.
+
+## Material recovery offers brands a new way to connect to their customers
+
+At the end of a linear economy, products usually end up in landfills or the ocean. Every year, 8 million metric tons of plastics enter our ocean. This is on top of the estimated 150 million metric tons that currently circulate our marine environments. In the USA alone, every year, 139 million tons of waste is sent to landfills.
+
+The problem is our current waste and recycling infrastructure can't support that demand. With less than 10% of material actually getting recycled, the vast majority just ends up in a landfill or as pollution.
+
+Replenysh is building a solution to this problem by creating entirely new infrastructure to help brands get their materials back. They're building an ecosystem of tools to enable any community in the world to do the right thing.
+
+Whenever material is dropped off at a host, brands have the opportunity to engage with that person, resulting in a win-win situation for the planet, the brands, and the individual who all want to make a positive impact. Anyone in the community can take their used products and materials to the hosts — with that material being tracked all the way back to the brands and manufacturers who will reuse it. Brands have the opportunity to engage with that person, resulting in a win-win situation for the planet, the brands, and the individual who all want to make a positive impact. This turns a traditional consumption model into an opportunity for brands and customers to participate in the circular economy.
+
+Brands are adopting Replenysh to demonstrate their commitment to making a positive environmental impact, while seeking to engage with consumers in a new, authentic way. Replenysh provides the technology to communities that are helping build the future infrastructure where all materials are traceable and reused.
+
+
+
+## Refactoring code leads to a better way forward
+
+Historically the team created their own backend infrastructure, setting up APIs and Authentication to run their own OTP system with Twilio and passwords. Postgres is essential to their requirements because Replenysh uses Row Level Security for authorization. Before adopting Supabase, the team used a Haskell server with a different Postgres instance deployed on Heroku.
+
+The team decided to do a large refactor of their codebase and began investigating alternative hosting options to help speed up development time and reduce maintenance.
+
+Firebase seemed appealing due to its ability to get started quickly, but the team didn't want to migrate away from a relational database. Specifically, Postgres and RLS fit their requirements.
+
+When the team discovered Supabase on Hacker News they felt excitement. Supabase has a reputation for a smooth developer experience, providing Postgres and Row Level Security as a core feature.
+
+As a bonus, Supabase provided more than just a database, reducing their DevOps overhead. After reading the [Supabase Auth documentation](/docs/guides/auth) the team determined they can have the functionality they need, like SMS OTP. When they saw [Mobbin are using Supabase at scale](/blog/2021/07/28/mobbin-supabase-200000-users), they decided to migrate to Supabase.
+
+## Globally recognized brands need quality at scale
+
+Less than a day after beginning development with Supabase, the team completed their SMS OTP implementation, and deployed their app to the app store a few weeks later.
+
+
+
+Replenysh clients include brands with global recognition and millions of customers. With their reputation at stake, major brands have a high-quality threshold. If a global brand asks its customers to adopt a technology, the user experience must be high quality and reliable. Their customers' primary interaction point is mobile-first. This means a robust and smooth mobile Auth experience is non-negotiable. After switching to Supabase, when they demo, clients are instantly impressed with just how easy it is for users to log in with an SMS OTP and start participating in the circular economy. As a result, some of the world's largest retailers and beverage companies have recently joined Replenysh and the circular economy.
+
+
+
+## Supabase means faster development and reduced maintenance
+
+
+
+ We saw the Auth update for launch week we thought it was the perfect time to get going with
+ Supabase.
+
+
+ We implemented & pushed live phone (OTP) auth and had something ready to deploy to the app store
+ in less than 24-hours!
+
+
+ Supabase's developer experience lived up to its reputation. Our app is ready to launch with
+ major brands to help them reach sustainability goals and connect with their customers in a
+ meaningful way
+
+
+
+## Supabase help Replenysh continue to scale
+
+Supabase turbo-charged Replenysh's development time with a seamless end-user mobile login experience. They are ready to help major brands engage with their users through participation in the circular economy. With Supabase, the team knows they have a slick auth experience, reduced DevOps overhead, and can continue to scale with Postgres. You can test out the Supabase developer experience today by [starting a new project on the free tier!.](https://app.supabase.io/)
diff --git a/www/_blog/2021-10-28-supabase-series-a.mdx b/www/_blog/2021-10-28-supabase-series-a.mdx
new file mode 100644
index 00000000000..cd838ffc50a
--- /dev/null
+++ b/www/_blog/2021-10-28-supabase-series-a.mdx
@@ -0,0 +1,270 @@
+---
+title: 'Supabase $30m Series A'
+description: Supabase just raised $30M, bringing our total funding to $36M.
+author: paul_copplestone
+image: series-a/supabase-series-a.png
+thumb: series-a/supabase-series-a.png
+tags:
+ - supabase
+date: '2021-10-28'
+toc_depth: 3
+---
+
+Supabase [just raised $30M](https://techcrunch.com/2021/09/09/supabase-raises-30m-for-its-open-source-insta-backend/),
+bringing our total funding to $36M. How will we spend this? Read on to find out.
+
+## We're growing fast
+
+From the outside, you can see that we're growing fast.
+To solidify some of the numbers with internal metrics:
+
+### Database Growth
+
+As of September, we've launched over 50,000 databases. This is _only_ on our hosted platform - it doesn't include our open source offering,
+because we don't add telemetry. Active databases are growing 35% per month.
+
+
+
+### Developers
+
+As of September, over 40,000 developers have signed up to Supabase from some of the world's leading companies.
+Because of the versatility of Postgres, they're building everything from
+[counter-fraud systems for Fintech](/blog/2020/12/02/case-study-xendit) to
+[digital platforms powering 200,000 users](/blog/2021/07/28/mobbin-supabase-200000-users).
+
+
+
+### Community
+
+Supabase has been in GitHub's top-15 fastest growing open source startups for
+[five consecutive quarters](https://twitter.com/kiwicopple/status/1451104569266671619),
+and our [Discord](https://discord.supabase.com) has grown to nearly 4000 members since launching just 3 months ago.
+Our growth is all organic.
+
+
+
+## About the round
+
+Supabase is an ambitious project. Firebase, to their credit, is a very well-developed platform which offers _a lot_ of functionality.
+Building an alternative is a bit like launching five different startups at once.
+
+That said, our approach has been clear from the start: we don't want to re-invent the wheel.
+We want to leverage existing open source products wherever we can, improving them by up-streaming changes and employing maintainers
+([PostgREST](/blog/2020/06/15/supabase-steve-chavez),
+[PostgreSQL](https://www.postgresql.org/message-id/CABwTF4UZzYoHcaEGe2cESVn-e9dc3wzg%3Dmvx7Tz8qbKJ7p3UKA%40mail.gmail.com)).
+This model is the real promise of open source, and we've been lucky to have investors who have backed our approach
+since the start - Y Combinator, Mozilla, and our lead investor, Coatue.
+
+Because of their conviction in Supabase, Coatue doubled down on their Seed investment to lead our Series A. We're extremely excited to welcome
+[Caryn Marooney](https://www.linkedin.com/in/caryn-marooney/) to our Board.
+
+
+ We are proud to lead a second consecutive round in Supabase and officially join the board.
+
+ We continue to be impressed by Paul and Ant and it has been a pleasure partnering with them. We
+ believe that the team has done an impressive job scaling their open-source community and think
+ that the strong traction and adoption speaks for itself.
+
+
+
+### Joining the round
+
+We've had a number of new investors join the round, this time a lot of operators and partners:
+
+- Elad Gill
+- Tom Preston-Werner (GitHub cofounder)
+- Solomon Hykes (Docker cofounder)
+- Alex Solomon (PagerDuty cofounder)
+- Guillermo Rauch (Vercel founder)
+- Kurt Mackey (Fly cofounder)
+- Chris Nguyen (LogDNA cofounder)
+- Tod Sacerdoti (Pipedream Founder)
+- Alana Anderson (Base Case Capital)
+- Astasia Myers (Quiet Capital)
+- (and more)
+
+
+ See all investors
+
+
+## Building Supabase
+
+Our early positioning is an "open source Firebase alternative" but you might be surprised to learn that this is a small part of the Supabase vision.
+
+Firebase is arguably one of the best tools in the world for building _new products_, but it has a flaw: scalability.
+
+### Phase 1: Start with scalability
+
+The term "open source Firebase alternative" is becoming popular now, and we are often asked: how are we different?
+
+Simple. Supabase has smuggled scalability into the product, perhaps without you noticing.
+Every Supabase project is a _full_ Postgres database. It's not "Postgres compatible", it's not "built on top of",
+and we don't abstract it. If we did, your applications would face the same scalability issues as Firebase.
+
+Supabase simply makes Postgres easy to use - hopefully easier than any other database platform you've ever used.
+
+We plan to make Postgres the default database for every developer in the world. How do we do that? By making Postgres both easy
+(Phase 2: tooling) and scalable (Phase 3: Cloud-Native Postgres).
+
+### Phase 2: Postgres Tooling
+
+User-facing applications usually require tools beyond just a database and frontend framework:
+
+- **APIs:** to provide access to your database from untrusted systems.
+- **Authentication:** for users sign ups.
+- **File Storage:** for large images and media.
+
+Supabase makes all of this easy. Beyond the database we offer [Auth](/docs/guides/auth),
+RESTful and Realtime [APIs](/docs/guides/api), a [Storage](/docs/guides/storage)
+system for large files, and a bunch of other tools - all wrapped up into a simple-to-use Dashboard.
+
+
+
+And this is where Supabase really differentiates itself: by doing less. All of these features build on top of PostgreSQL's
+existing functionality.
+
+- **Row Level Security:** restrict user access to data and files using Postgres Policies.
+- **Realtime data streams:** subscribe to database changes using the logical replication stream.
+- **Function Hooks:** trigger external systems using Postgres triggers and our [async request extension](https://github.com/supabase/pg_net/).
+- **RESTful APIs:** query your database [tables](/docs/reference/javascript/select) and [functions](/docs/reference/javascript/rpc) over HTTP, using [PostgREST](https://postgrest.org).
+
+### Phase 3: Cloud-native PostgreSQL
+
+PostgreSQL was created over 30 years ago, and it's one of the safest and most reliable databases in the world.
+
+But modern developers are becoming accustomed to cloud-native services with several characteristics:
+
+- Automatic scaling.
+- Low latency anywhere in the world.
+- Billing based on usage.
+
+PostgreSQL is still catching up to the modern cloud environment in some areas. What does a Cloud-native PostgreSQL look like?
+
+- **Branching:** developers should be able to "fork" a database at any point. This is particularly important for Jamstack developers who run deployments for every Git branch.
+- **Scalable storage:** storage should grow and shrink without the user needing to provision more space themselves.
+- **Distributed:** An entire fleet of databases, distributed around the world, should feel like a single database (and even better if all nodes can accept read/write workloads).
+- **Ephemeral compute:** developers don't want to be charged for a database which isn't doing anything. Likewise - if they are running huge computation then the database should scale up seamlessly, and scale down to zero when it's unused.
+- **Snapshots and time-travel:** developers should be able to roll back to any point in time, or take a copy of their database with just a click of a button.
+
+This is the future of Supabase - a platform to power your transactional workloads: no matter how big or small; no matter the use-case.
+We're building a cloud-native Postgres platform.
+
+## Join us
+
+We have a track record of hiring open source maintainers, PostgREST is maintained by a
+[Supabase developer](/blog/2020/06/15/supabase-steve-chavez), one of our first hires over a year ago.
+We've recently added [another developer](https://www.postgresql.org/message-id/CABwTF4UZzYoHcaEGe2cESVn-e9dc3wzg%3Dmvx7Tz8qbKJ7p3UKA%40mail.gmail.com)
+with the explicit goal of working within the PostgreSQL community.
+
+If you want to help us build the future of cloud-native Postgres, join us:
+[https://about.supabase.com/careers/postgres-experts](https://about.supabase.com/careers/postgres-experts)
+
+## Get started
+
+- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
+- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
+- Follow us **[on Twitter](https://twitter.com/supabase)**
+- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
+- Become a **[sponsor](https://github.com/sponsors/supabase)**
diff --git a/www/_blog/2021-11-05-supabase-beta-october-2021.mdx b/www/_blog/2021-11-05-supabase-beta-october-2021.mdx
new file mode 100644
index 00000000000..75aa68f298b
--- /dev/null
+++ b/www/_blog/2021-11-05-supabase-beta-october-2021.mdx
@@ -0,0 +1,180 @@
+---
+title: Supabase Beta October 2021
+description: Three new Auth providers, multi-schema support, and we're gearing up for another Launch Week.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: 2021-oct/release-oct-2021.jpg
+thumb: 2021-oct/release-oct-2021-cover.jpg
+tags:
+ - release-notes
+date: '2021-11-07'
+toc_depth: 3
+---
+
+We released three new Auth providers, multi-schema support, and we're gearing up for another Launch Week.
+
+### Quick recap
+
+Watch a recap of this month's release.
+
+
+
+## Slack, Spotify, and MessageBird logins
+
+Thanks to [`@HarryET`](https://github.com/supabase/gotrue/pull/245) and our friends at [MessageBird](https://github.com/supabase/gotrue/pull/210)
+we have 3 new Auth providers this month:
+[Slack](https://supabase.com/docs/guides/auth/auth-slack),
+[Spotify](https://supabase.com/docs/guides/auth/auth-spotify), and
+[MessageBird](https://supabase.com/docs/guides/auth/auth-messagebird) phone logins.
+
+
+
+## Multi-schema support
+
+### Dashboard
+
+Browse data in any database schema using the Schema switcher in the Dashboard.
+
+
+
+### API
+
+You can access any schema with your API, after enabling access in the Dashboard.
+[Docs](https://supabase.com/docs/reference/javascript/initializing#api-schemas).
+
+
+
+## Fresh Docs and Guides
+
+We have a TON of new guides, with videos too.
+
+### Database Functions
+
+Learn about PostgreSQL Functions. [Docs](https://supabase.com/docs/guides/database/functions).
+
+
+
+### Auth Overview
+
+Learn about all the exciting features of Auth within Supabase. [Docs](https://supabase.com/docs/guides/auth/intro).
+
+
+
+### API Features
+
+Learn more about the power of PostgREST for RESTful APIs. [Docs](https://supabase.com/docs/guides/api#restful-api).
+
+
+
+### And more
+
+- Redwood Quickstart: [https://supabase.com/docs/guides/with-redwoodjs](https://supabase.com/docs/guides/with-redwoodjs)
+- Expanded Self-hosting: [https://supabase.com/docs/guides/hosting/overview](https://supabase.com/docs/guides/hosting/overview)
+- Expanded Auth Reference docs with [serverside functions](https://supabase.com/docs/reference/javascript/auth-api-deleteuser).
+- "Before you launch" checklist: [https://supabase.com/docs/going-into-prod](https://supabase.com/docs/going-into-prod)
+
+
+
+## Community
+
+There was a lot of activity this month.
+
+### Supabase at Jamstack conf
+
+Supabase attended the Jamstack conf. Watch us catch up with Matt, the cofounder of Netlify (minute 8).
+
+
+
+### Supabase at Next.js conf
+
+And [Jon](https://twitter.com/_dijonmusters) made a guest appearance at this year's amazing [Next.js Conf](https://nextjs.org/conf).
+
+
+
+### Community Highlights
+
+- Vue 3 | Workout Tracker App - John Komarnicki [video](https://www.youtube.com/watch?v=3tF0fGkd4ho)
+- Adalo + Supabase - Flywheel Media [video](https://www.youtube.com/watch?v=YGP1LXctLk4)
+- Nuxt 3 Beta + Supabase - BenCodeZen [video](https://www.youtube.com/watch?v=5vB120atiaU)
+- Made With Supabase (now on Nuxt 3) - Zernonia [site](https://www.madewithsupabase.com/)
+- Nuxt 3 + Tailwind + Supabase - Ekene Eze [video](https://www.youtube.com/watch?v=xbE11CfZpNQ)
+- SQL Functions - Răzvan Stătescu [article](https://dev.to/razvanstatescu/how-to-run-custom-sql-queries-using-functions-in-supabase-2nna)
+- `supabase-py v0.0.3` released - [repo](https://github.com/supabase-community/supabase-py/releases/tag/v0.0.3)
+- `nuxt-supabase v2.2.1` released - [repo](https://github.com/supabase-community/nuxt-supabase)
+- `vue-supabase v2.2.3` released - [repo](https://github.com/supabase-community/vue-supabase)
+
+### GitHub
+
+We hit 20K stars!! 21,268 to be exact: [github.com/supabase/supabase](http://github.com/supabase/supabase)
+
+
+
+Source: [repository.surf/supabase](https://repository.surf/supabase)
+
+Check out some of our other community stats in our latest [Series A Blog Post](/blog/2021/10/28/supabase-series-a).
+
+## Coming Next: Launch Week III
+
+We had Launch Week [numero uno](https://supabase.com/blog/2021/03/25/launch-week) in March, and the sequel "[Launch Week II: the SQL](https://supabase.com/blog/2021/07/22/supabase-launch-week-sql)" in July.
+
+Now we're going even bigger with the third installment: `Launch Week III: The Trilogy`. Join us on 29th November on our [Discord](https://discord.supabase.com).
+
+
+
+## Get started
+
+- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
+- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
+- Follow us **[on Twitter](https://twitter.com/supabase)**
+- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
+- Become a **[sponsor](https://github.com/sponsors/supabase)**
diff --git a/www/_blog/2021-11-26-supabase-how-we-launch.mdx b/www/_blog/2021-11-26-supabase-how-we-launch.mdx
new file mode 100644
index 00000000000..7e496abf694
--- /dev/null
+++ b/www/_blog/2021-11-26-supabase-how-we-launch.mdx
@@ -0,0 +1,119 @@
+---
+title: 'How we launch at Supabase'
+description: The history and methodology of Supabase Launch Week.
+author: ant_wilson
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: how-we-launch/how-we-launch-og.jpg
+thumb: how-we-launch/how-we-launch-thumb.jpg
+tags:
+ - tech
+date: '2021-11-26'
+toc_depth: 3
+---
+
+Next week is Supabase Launch Week. It's our third Launch Week this year, and is a key part of a Product-Led Growth strategy that has enabled us to increase the number of databases we manage 47% month-on-month for the last 18 months.
+
+We often get asked about how we're able to ship so relentlessly, and being an open source company we thought it appropriate to start "open sourcing" some of our methods around building and shipping. Our user base is constructed of companies and individuals who themselves are building for the web and marketing to enormous audiences. Hopefully they can learn some of our tricks and in turn contribute back to the community with their own launch strategies and tactics, helping us continuously learn and improve.
+
+Before I go into the nuts and bolts of what Launch Week is, and the exact processes we follow when executing one, it's probably useful if I explain how we landed on this methodology in the first place.
+
+
+
+### A brief history of growth at Supabase
+
+We started work on Supabase in January 2020. Our growth plan from the start included being accepted into YCombinator. Dev Tool companies who enter YC gain a huge advantage from day one. You're placed in a cohort of hundreds of other early-stage startups, the majority of whom are developing software, and have just been given a bunch of funding, making them ideal early customers! This, however, turned out to be only a small part of what YC ultimately gifted us.
+
+At the time we joined the batch, we had around 80 alpha users of varying levels of activeness. Our plan was to spend the batch iterating the product around these early alpha users, and to do a big public launch a week or so before Demo Day (an event where you pitch to a shiver of investors). Our plan was foiled however, when an early user shared our site on Hacker News. The post stayed on the home page for several days, and ended up being one of the most upvoted dev tools launches ever (second only to Stripe!). Overnight, the number of databases we were hosting increased ten-fold. Bugs, breakages and feature requests flooded in from every angle; a fantastic problem to have for a fledgling startup. Over the course of the next 2 months we worked hard on a few major items, including Supabase Auth, and migrating our entire stack between cloud providers, along with hundreds of other smaller fixes and incremental improvements - both to our product, and to our company.
+
+A few weeks before Demo Day, we announced Auth, and shouted about it as loudly as possible. We posted it everywhere, and recruited our recently onboarded squad of [Technical Angel Investors](https://supabase.com/company#investors) to help us boost our message on social media. The response was solid, and led to an increase in the rate of user acquisition, and activation/retention rates.
+
+Post YC can often be a sink or swim moment for companies. Throughout the batch, you have regular check-ins with world-class operators, your batch mates, and inspirational talks from founders several steps ahead. When you leave, the external pressure drops, and it's up to you to put the frameworks in place to maintain your rate of progress. You no longer have the likes of Michael Siebel asking you why it's taking you so long to get Auth out the door and in the hands of users. When faced with this problem we sat down and said, "why don't we just pretend that we're starting the batch again, and do our best to recreate the conditions of an accelerator internally, complete with our very own Demo Day?". We found the actual YC Demo Day is kind of an arbitrary deadline useful for motivating all kinds of internal initiatives, whether it's fundraising, growth, or product. So we said to the team, let's just choose an arbitrary date 3 months from now, and we'll ship _something_ huge.
+
+We went the whole hog. We had kick-off events, we invited external people to come in and talk to the team about their origin stories, and even had custom swag made up specific to this product cycle. The _something_, turned out to be [Supabase Beta](https://supabase.com/beta), an announcement that marked a huge advancement in the Stability, Performance, and Security of our hosted platform. This announcement resulted in a stark increase in the rate of developer sign-ups and activation. Our "fixed timeline, flexible scope" approach to launching products had proved successful with the team. And what's more, the build-up to launch, and the launch itself, was some of the most fun any of us had had. Our small team was flying high on adrenaline, and everyone could see for themselves the immediate and direct impact their work had on Supabase's viral adoption.
+
+The very next week, still high on adrenaline, we met for a retrospective. The debrief, however, quickly turned into a planning meeting, and the question was raised "what is the MOST ambitious thing we could hope to ship 3 months from now?". A few projects got kicked about until someone suggested, "why just have one launch? Why can't we aim to ship one major feature or announcement every day for a week?". It was quickly agreed that Launch Day would instead become Launch Week.
+
+During the last week of March 2021, we went on to ship [7 major features](/blog/2021/03/25/launch-week#friday-one-more-thing). We once again saw an immediate uptick in growth rate which helped solidify our strategy.
+
+More recently we ran "[Launch Week II: The SQL](/blog/2021/07/22/supabase-launch-week-sql)", where we bumped the versions of several key products in our stack, and added a [Community Day](https://supabase.com/blog/2021/07/26/supabase-community-day) with the aim of boosting visibility and support of various open source tools and projects that we rely on, along with products, frameworks, and tooling built by the rapidly expanding [Supabase Community](https://github.com/supabase-community/).
+
+We're now just a few days away from Launch Week III, and over time have incrementally improved upon many of the processes and tactics that help us maximize output whilst minimizing stress on the team. So let's get into some specifics about how we run a product cycle and the resulting Launch Week.
+
+### The Planning Meeting
+
+Spanning 12 different countries makes it challenging to find a time that works for everyone, but gathering together online is the first step.
+
+We always start the meeting by firing up a Google Jam Board and collectively constructing "The Supabase Universe", this is a giant brain dump of terms and concepts related to Supabase. What we're building, who it's for, who we're trying to hire, what our goals and metrics are. Literally everything that's anything to do with Supabase goes down on this virtual whiteboard. The purpose is to ensure everyone gets out of their daily mode of operation and loads up the business as a whole into their brains. Developers should be loading up marketing concepts, and the marketers should be thinking about engineering. If we're overly focused on one particular area (often engineering), then we risk setting a course in the wrong direction for the entire quarter. It's also a method of getting all the "obvious" stuff down on paper so you can move on and focus the creative efforts of everyone on new ideas; a technique borrowed from the creative industries.
+
+
+
+Once everyone is warmed up, we dive into the high-level goals and metrics. Are our metrics still relevant? And if so, which ones should we be aiming to boost and why? The more direct a connection between actions and metrics the better, so it's important to remind everyone of what the north star is before we start scheming on how to reach it.
+
+Then comes the main course - what are we going to build or do that's going to move the needle? List down as many ideas as possible, and go through a process of sorting and filtering as you go. Try not to go too deep on any particular idea, in-depth analysis and exploration can be done later in break out sessions, make sure you have someone responsible for pulling you out of these rabbit holes if the team starts to get drawn in to too much detail.
+
+For us, an essential part of this process is the idea that the scope is flexible - at this stage of ideation it's often impossible to tell whether an engineering project is going to take 2 or 102 days. We will always try our best to have it ready for Launch Week, but if not no worries, we'll shout about something else, and include it in the next one.
+
+Lastly we will give some discussion to hiring and any other business, and schedule any follow-up meetings or breakouts required.
+
+### The Kick Off Meeting
+
+After the breakouts we typically have a much clearer idea of what we want to aim for, and if the projects themselves are realistic. Our list at this point often sits around 12 items in length. Some projects will drop out and others will be introduced during the course of the next few months, which is ok. Each project typically has a lead assigned, and another couple of people will register their interest in helping out.
+
+For the kick-off, I always try and come up with some grotesquely garish branding (this is an internal project after all) and find some loose theme to roll with. The purpose of the meeting is to remind everyone of the goals, the timeline, and the current list of announcements we plan to make during the launch.
+
+
+
+### Time to Work
+
+Then it's time to get our heads down. One important point to make here is that the 3-month cycle doesn't necessarily replace more traditional project management methodologies. We leave it up to the project leads to decide how to run their project. Some teams opt for kanban boards, and stand-ups. Other projects run like open source repos, with RFCs, issue management, and fully async comms.
+
+Another key thing to mention here is that we very rarely hold back features until Launch Week. Actually, quite the opposite is true, we encourage everyone to ship features as early as possible. We announce features as they ship in our monthly Beta Update blog and newsletter - which is often limited to a blast radius containing existing users. Full write-ups, marketing copy, and broad Top-of-Funnel type marketing efforts will often happen during Launch Week to hype up these features. Actually, we've found that you can launch a new feature many times over and always manage to reach people who either forgot, ignored, or just plain missed it the first few times. We're so close to our own projects that we often overestimate the reach of our online marketing efforts.
+
+In the weeks leading up to Launch Week, we review more closely the list of items we want to Launch and start to plan for what supporting materials we'll need. There are some things such as press, which needs to be organized up to 3 weeks before you plan to Launch, so you better get started early on those items. Also being aware of which third parties are going to be involved is important. Maybe we're shipping an integration with some other tool or company, cross-company communication can be a blocker, so better to start early.
+
+
+
+### Pre-Launch Week
+
+One of our learnings from previous Launch Weeks was to no longer ship to prod on the day of the Launch itself :). We had a blast live-debugging prod issues on Discord last time, but this was not so conducive to getting enough sleep. Our Launch Weeks have become a marathon, so it's ideal to get all the major integrations done a week early. Also writing the content and getting someone to edit can take a couple of iterations. This all seems obvious written down here, but it took us a few iterations to start being more regimented.
+
+We have more regular check-ins throughout this week, and make sure everyone is on the same page. We have a process of "swarming" around sticky issues and blockers and a good amount of testing will be done by people who were not involved in the development of a given feature. Particularly around DX, which is an extremely high priority topic at Supabase.
+
+### Launch Week
+
+I can't think of many things more fun than executing on a Supabase Launch Week. It's the culmination of 3 months of epic work from a highly skilled team of folks distributed across every corner of the planet. The awesome thing is that, with most of the features we ship, the person who implemented the code will be the same person who writes the marketing content. This means that the content usually includes deep technical discussion. They're also probably the best person to decide which will be the most effective channels to market that particular feature. As an example, when we launched [ui.supabase.com](http://ui.supabase.com), we made sure to hit up all the front end and design channels, made sure it ranked on Product Hunt, and reached out to some friendly designers to help boost our message. This is very different from the approach we took to marketing our [file storage offering](https://supabase.com/blog/2021/03/30/supabase-storage). The technical design discussion of Storage is better suited to channels like Hacker News, and technical conference audiences who may be more interested in DX than UI components.
+
+When it comes to the day of each launch we've gotten into the habit of constructing a finely detailed schedule to follow. It will contain items such as:
+
+- 7:30am Twitter spaces reminder tweet
+- 7:55am Product Hunt goes live
+- 8:00am Blog post goes live
+- 8:05am Post launch tweet 1
+- 8:10am Share tweet with Angels
+- 8:15am Twitter spaces go live
+
+Of course, it's possible to run this all without such a fine-grained schedule, but the launches can get kind of hectic, so it's easier to not have to think - just do.
+
+### The Rest
+
+Despite being a ton of fun, it's inevitable that some team members will have pulled long days and nights to get their feature out the door, as well as pumping it on as many marketing channels as possible. Launching new things also includes managing support requests, bug fixes, responding to questions, and even managing PRs from the community excited to contribute to new repos or areas of the codebase. This is unsustainable without proper rest so each cycle ends with a good amount of downtime and maintenance mode. Having said that, the adrenaline of Launch Week often spills over into the following days and weeks, so it's not uncommon for members of the team to continue in Launch Mode for a while before taking some downtime.
+
+### The Retrospective
+
+Once the dust has settled, the **most** **important** phase of the entire process can begin. To skip the retro would be to rubbish the entire process, as we would never learn from mistakes or adapt to capitalize on new tactics discovered throughout the preceding weeks and months. We always make sure to cover what went well, what went badly, and what can be improved. This list is then read aloud again at the start of the next planning meeting. The process as it exists today is the product of 4 previous iterations, and is still far from its final form. Amongst other things, our team is growing fast, so it's yet to be seen if the same processes will extend to so many team members, and in which ways they will have to adapt. Lastly, we always make sure to discuss the question "Is Launch Week still relevant?", and "How would we know if we were approaching some local maxima in terms of process and productive output?".
+
+
+
+### Some Other Thoughts
+
+This "internal accelerator" model has worked well within Supabase as a 2-person team and is still proving effective now at 30, but there's no telling whether it would work as well in other organizations. I would be very keen to learn from those who also do something similar.
+
+In some ways, running Supabase is like launching many startups at the same time, we have to build and maintain many different parallel projects in order to match Firebase's incredible suite of products, which could be one reason why it lends itself so well to this acceleration model. And, in fact, being a Firebase alternative is only a small part of [what we want to achieve with Supabase](https://supabase.com/blog/2021/10/28/supabase-series-a), so we have many, many more initiatives to run as we grow.
+
+Running an accelerator model may also be why we've had success [hiring so many other founders](https://about.supabase.com/careers/founders). We're able to give a high degree of autonomy to individuals when it comes to managing projects and initiatives. If this kind of work environment sounds interesting to you, we have tons of [open roles](https://about.supabase.com/careers). We've already hired people who joined because they "couldn't stand to watch another Launch Week from the sidelines" and team members often quote experiencing their first Launch Week as one of the highlights of their Supabase journey so far. It clearly has benefits that extend beyond just growth and user activation.
+
+Make sure you follow us on [Twitter](https://twitter.com/supabase), join our [Discord](https://discord.supabase.com), or [sign up for Supabase](https://app.supabase.io) in order to keep up to date on all things Supabase.
+
+Supabase is the Open Source Firebase Alternative.
diff --git a/www/_blog/2021-11-26-supabase-launch-week-the-trilogy.mdx b/www/_blog/2021-11-26-supabase-launch-week-the-trilogy.mdx
new file mode 100644
index 00000000000..3946d79ce83
--- /dev/null
+++ b/www/_blog/2021-11-26-supabase-launch-week-the-trilogy.mdx
@@ -0,0 +1,113 @@
+---
+title: 'Supabase Launch Week III: Holiday Special'
+description: Tis the season to be shipping.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: launch-week-three/launch-week-three-og.jpg
+thumb: launch-week-three/launch-week-three-thumb.jpg
+tags:
+ - launch-week
+date: '2021-11-26'
+toc_depth: 2
+---
+
+In March, Supabase held a [Launch Week](/blog/2021/03/25/launch-week) where we launched a new product/feature every day for a week.
+
+In July we did [Launch Week II: The SQL](/blog/2021/07/22/supabase-launch-week-sql), with another week of feature releases.
+
+Santa's little hackers have been hard at work because we've got another five days of launches ready to go.
+
+## What to expect
+
+We don't want to spoil the surprise, so for now we'll give you a teaser of what to expect. Come back each day to see what we launch, or follow us on twitter to keep up to date: [@supabase](https://twitter.com/supabase) and follow the hashtag [#supalaunchweek](https://twitter.com/hashtag/supalaunchweek).
+
+## Monday: Community Day
+
+
+
+### **When?**
+
+Monday 29 November 2021: 7am PT
+
+### What?
+
+Last Launch Week we introduced the idea of Community Day - a day where we shine a spotlight on some of the open source tools that we use, and community contributions. If you liked that one, you're going to love this one.
+
+### Where?
+
+Read the [blog post](/blog/2021/11/29/community-day).
+
+Watch the Twitter Spaces recap on [YouTube](https://youtu.be/9zmaKt6evxw).
+
+## Tuesday: Dashboard Surprise
+
+
+
+### **When?**
+
+Tuesday 30 November 2021: 7am PT
+
+### What?
+
+We've released [Supabase Studio](https://github.com/supabase/supabase/tree/master/studio). The same Dashboard that you're using on our Platform is now available for Local Development and Self-Hosting.
+
+### Where?
+
+Read the [blog post](/blog/2021/11/30/supabase-studio).
+
+Watch the Twitter Spaces recap on [YouTube](https://youtu.be/n1QGq75ZzvE).
+
+## Wednesday: Realtime Updates
+
+
+
+### **When?**
+
+Wednesday 1 December 2021: 7am PT
+
+### What?
+
+We released Realtime Row Level Security.
+
+### Where?
+
+Read the [blog post](/blog/2021/12/01/realtime-row-level-security-in-postgresql).
+
+Watch the Twitter Spaces recap on [YouTube](https://youtu.be/4thVj8j19s).
+
+## Thursday: A new player enters the game
+
+
+
+### **When?**
+
+Thursday 2 December 2021.
+
+### What?
+
+We acquired [Logflare](https://logflare.app).
+
+### Where?
+
+Read the [blog post](/blog/2021/12/02/supabase-acquires-logflare).
+
+Watch the Twitter Spaces recap on [YouTube](https://youtu.be/4thVj8j19s).
+
+## Friday: (One more thing)
+
+
+
+### **When?**
+
+Friday 3 December 2021.
+
+### What?
+
+Let's be honest. It's never just one more thing. Today we announced five more things 🔥.
+
+### Where?
+
+Read the [blog post](/blog/2021/12/03/launch-week-three-friday-five-more-things).
+
diff --git a/www/_blog/2021-11-28-postgrest-9.mdx b/www/_blog/2021-11-28-postgrest-9.mdx
new file mode 100644
index 00000000000..1fec332bb9e
--- /dev/null
+++ b/www/_blog/2021-11-28-postgrest-9.mdx
@@ -0,0 +1,109 @@
+---
+title: 'PostgREST 9'
+description: New features and updates in PostgREST version 9.
+author: steve_chavez
+author_url: https://github.com/steve-chavez
+author_image_url: https://github.com/steve-chavez.png
+authorURL: https://github.com/steve-chavez
+image: postgrest-9/whats-new-in-postgrest-9-og.png
+thumb: postgrest-9/whats-new-in-postgrest-9-thumb.png
+tags:
+ - launch-week
+ - release-notes
+ - tech
+ - community
+date: '2021-11-27'
+toc_depth: 2
+---
+
+
+PostgREST turns your PostgreSQL database automatically into a RESTful API. Today, PostgREST 9 was [released](https://postgrest.org/en/v9.0/releases/v9.0.0.html). Let's take a look at some of the new features.
+
+## Resource embedding with Inner Joins
+
+PostgREST 9 brings a [much-requested feature](https://github.com/supabase/postgrest-js/issues/197): the ability to do `inner joins` when embedding a table.
+
+Here's an example with `supabase-js`:
+
+```js hideCopy
+const { data, error } = await supabase
+ .from('messages')
+ .select('*, users!inner(*)')
+ .eq('users.username', 'Jane')
+```
+
+With the new `!inner` keyword, you can now filter rows of the top-level table (`messages`) based on a filter (`eq`) of the embedded table (`users`).
+This works across all Supabase client libraries and you can use it with any of the available operators (`gt`, `in`, etc.)
+
+[Read more](https://postgrest.org/en/v9.0/releases/v9.0.0.html#resource-embedding-with-top-level-filtering).
+
+## Functions with unnamed parameters
+
+You can now make `POST` requests to functions with a single unnamed parameter. This is particularly useful for webhooks that send JSON payloads.
+
+For example, imagine you were using Postmark as an email provider and you wanted to save email bounces using their [bounce webhook](https://postmarkapp.com/developer/webhooks/bounce-webhook).
+Previously this wouldn't be possible with PostgREST, as every function required a named parameter.
+
+As of PostgREST 9, this is possible.
+Simply create a function inside your PostgreSQL database to receive the raw JSON:
+
+```sql hideCopy
+create function store_bounces(json)
+returns json
+language sql
+as $$
+ insert into bounces (webhook_id, email)
+ values (
+ ($1->>'ID')::bigint,
+ ($1->>'Email')::text
+ );
+
+ select '{ "status": 200 }'::json;
+$$;
+```
+
+And the webhook can send data directly to your database via an `rpc` call:
+
+```bash hideCopy
+POST https://.supabase.co/rest/v1/rpc/store_bounces HTTP/1.1
+Content-Type: application/json
+
+{
+ "RecordType": "Bounce",
+ "MessageStream": "outbound",
+ "ID": 4323372036854775807,
+ "Type": "HardBounce",
+ "MessageID": "883953f4-6105-42a2-a16a-77a8eac79483",
+ "Description": "The server was unable to deliver your message (ex: unknown user, mailbox not found).",
+ "Details": "Test bounce details",
+ "Email": "john@example.com",
+ "From": "sender@example.com",
+ "BouncedAt": "2019-11-05T16:33:54.9070259Z"
+}
+```
+
+[Read more](https://postgrest.org/en/v9.0/api.html#s-proc-single-unnamed).
+
+
+## PostgreSQL 14 compatibility
+
+If you've ever done your own custom `auth` functions using PostgREST [HTTP Context](https://postgrest.org/en/v8.0/api.html#accessing-request-headers-cookies-and-jwt-claims),
+note that a breaking change was necessary for PostgreSQL 14 Compatibility. You'll need to update them:
+
+
+| `From` | `To` |
+| --- | --- |
+| `current_setting('request.jwt.claim.custom-claim', true)` | `current_setting('request.jwt.claims', true)::json->>'custom-claim'` |
+| `current_setting('request.header.custom-header', true)` | `current_setting('request.headers', true)::json->>'custom-header'` |
+
+
+If you only use Supabase default `auth` functions(`auth.email()`, `auth.uid()`, `auth.role()`), then no action is required because we have updated the functions to handle these changes transparently.
+
+[Read more](https://postgrest.org/en/v9.0/releases/v9.0.0.html#postgresql-14-compatibility).
+
+## Release notes
+
+There are a lot more improvements released in PostgREST 9, including [support for Partitioned Tables](https://postgrest.org/en/v9.0/releases/v9.0.0.html#partitioned-tables),
+[improved doc](https://postgrest.org/en/v9.0/releases/v9.0.0.html#documentation-improvements), and [bug fixes](https://postgrest.org/en/v9.0/releases/v9.0.0.html#bug-fixes).
+
+You can see the full updates on the [PostgREST 9 release notes](https://postgrest.org/en/v9.0/releases/v9.0.0.html).
diff --git a/www/_blog/2021-11-28-whats-new-in-postgres-14.mdx b/www/_blog/2021-11-28-whats-new-in-postgres-14.mdx
new file mode 100644
index 00000000000..d5902d112e7
--- /dev/null
+++ b/www/_blog/2021-11-28-whats-new-in-postgres-14.mdx
@@ -0,0 +1,166 @@
+---
+title: 'New in PostgreSQL 14: What every developer should know'
+description: 'A quick look at some new features and functionality in PostgreSQL 14.'
+author: gurjeet
+author_url: https://github.com/gurjeet
+author_image_url: https://github.com/gurjeet.png
+authorURL: https://github.com/gurjeet
+image: whats-new-in-postgres-14/whats-new-in-postgres-14-og.png
+thumb: whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png
+tags:
+ - tech
+date: '2021-11-28'
+toc_depth: 3
+---
+
+Every web developer knows the importance of choosing a suitable database for building modern apps.
+Even though NoSQL, NewSQL, and other types of databases have received a great deal of buzz in the last few years,
+relational database management systems (or RDBMS) are still relevant for several critical business use cases and will likely do so in the foreseeable future.
+Among the many open-source relational databases available, [PostgreSQL](https://supabase.com/docs/guides/database/introduction) is a popular choice among developers.
+It was named [DBMS of the year in 2020](https://db-engines.com/en/blog_post/85) by
+DBEngines, and with every release of PostgreSQL new features are available making it easy for developers and administrators to run their apps.
+
+This blog will highlight some key features of the newly available PostgreSQL 14, which every developer can benefit from. So, let's dive right in.
+
+## Complex data type support
+
+### JSON subscripting
+
+PostgreSQL continues to add innovations for complex data types, making JSON data more accessible. In postgreSQL 14, developers can use subscripts to iterate through JSON key pairs and fetch corresponding values. For example, using this capability, nested JSON fields can be quickly traversed to retrieve values to reconstruct application objects.
+
+```sql hideCopy
+select (
+ '{ "PostgreSQL": { "release": 14 }}'::jsonb
+)['PostgreSQL']['release'];
+
+ jsonb
+-------
+ 14
+```
+
+### Working with disjointed data ranges
+
+In the real world, data ranges are pretty common. For example, if you have sensor readings going into a PostgreSQL database, you may want to define a range for
+low, medium, and high metrics. Before version 14, you could set data ranges for integers, numerics, timestamps, and other data types.
+However, these ranges had to be contiguous, and it required multiple insert records across the different ranges.
+In PostgreSQL 14, a single insert statement can be used to map data across multiple noncontiguous ranges. Let's check it out with an example.
+
+First, create an enum data type to capture low, medium, and high sensor reading levels.
+
+```sql hideCopy
+create type valid_levels as enum (
+ 'low', 'medium', 'high'
+);
+```
+
+To store sensor reading metric data, create a table consisting of the sensor description, the level and the range of timestamps when the sensor was at that level.
+
+```sql hideCopy
+create table sensor_range (
+ reading_id serial primary key,
+ metric_desc varchar(100),
+ metric_level valid_levels,
+ metric_ts tsmultirange
+);
+```
+
+Now, insert some data into the table. Note that, the insert statement below provides two time ranges that are not contiguous.
+
+```sql hideCopy
+insert into sensor_range (
+ metric_desc,
+ metric_level,
+ metric_ts
+)
+values (
+ 'Temperature',
+ 'high',
+ '{[2021-11-01 6:00, 2021-11-01 10:00],[2021-11-05 14:00, 2021-11-05 20:00]}'
+);
+
+insert into sensor_range (
+ metric_desc,
+ metric_level,
+ metric_ts
+)
+values (
+ 'Temperature',
+ 'low',
+ '{[2021-11-01 10:00, 2021-11-01 12:00],[2021-11-05 21:00, 2021-11-05 22:00]}'
+);
+```
+
+Query the data in the table to see the inserted data rows
+
+```sql hideCopy
+select *
+from sensor_range;
+```
+
+``` hideCopy
+| `reading_id` | `metric_desc` | `metric_level` | `metric_ts` |
+|--------------|---------------|----------------|-----------------------------------------------------------------------------|
+| 1 | Temperature | high | {[2021-11-01 6:00, 2021-11-01 10:00],[2021-11-05 14:00, 2021-11-05 20:00]} |
+| 2 | Temperature | low | {[2021-11-01 10:00, 2021-11-01 12:00],[2021-11-05 21:00, 2021-11-05 22:00]} |
+```
+
+## Improved performance and monitoring
+
+### Query pipelining
+
+If you're a developer accessing PostgreSQL using a high-level programming language, the database driver you're using is likely based on a C library called libpq. For example, suppose your application performs several write operations within a short period, or your network has a higher latency. In that case, you may want to fire off several queries over the same network connection simultaneously, so you don't have to wait for a reply after each query. Under the hood, libpq can send multiple queries to PostgreSQL while maintaining a queue of queries that are waiting for results. This queue consumes additional memory on both the client and server. Developers can now take advantage of PostgreSQL 14's client-side query pipeline mode using clients built on top of the latest libpq library to accelerate app performance.
+
+Aside from query pipelining, the latest PostgreSQL 14 release brings several other enhancements to query parallelism, including improved performance of parallel sequential scans, parallel query execution capabilities for Foreign Data Wrappers, and the ability to run parallel queries when refreshing materialized views. With this, your PostgreSQL server can now do more work for you at a lower cost.
+
+### Monitoring and troubleshooting queries
+
+Ask any database troubleshooting expert, and they will tell you that without a way to correlate data across different database components, investigating and monitoring query-related issues can quickly become a nightmare. When it comes to PostgreSQL, the SQL statement’s query_id can be used for this purpose, allowing database experts an easy way to identify workload patterns quickly, detect rogue run-away or slow queries, and common query-related issues. Before PostgreSQL 14, this information was only available using the pg_stat_statements [extension](https://supabase.com/docs/guides/database/extensions), which shows aggregate statistics about queries that have finished executing, but now this information is additionally available for live running queries with pg_stat_activity, in the EXPLAIN VERBOSE statement, and log files.
+An example of using query_id IN EXPLAIN (VERBOSE) statement
+
+Start by altering the system to enable the query_id
+
+```sql hideCopy
+alter system set compute_query_id = 'on';
+```
+
+Restart the PostgreSQL database for the alter system statement to take effect.
+
+Run the following query that selects schema and table names from the catalog tables
+
+```sql hideCopy
+explain (verbose, costs off)
+select schemaname, tablename
+from pg_tables, pg_sleep(5)
+where schemaname <> 'pg_catalog';
+```
+
+View the result of the EXPLAIN statement
+
+
+
+Notice that the query identifier is in the output:
+`Query Identifier: 4856400161806292488`
+
+## Enhanced security
+
+Security remains top of mind for every organization, and PostgreSQL 14 brings some critical enhancements in this area.
+
+Have you ever wanted to [manage database user access](https://supabase.com/docs/guides/auth/managing-user-data) so that only specific individuals have read-only access? For example, consider a situation where you would like to host some sample data online for a demo and not allow demo users to modify or delete data. With the latest PostgreSQL version 14, you can easily set that up using a single GRANT statement.
+
+```sql hideCopy
+grant pg_read_all_data to bobfries;
+```
+
+From an authentication perspective, if you're still managing passwords in the database without [third-party login providers](https://supabase.com/docs/guides/auth#third-party-logins),
+you may want to read this. Since version 10, PostgreSQL supports several different hashing mechanisms such as MD5 and SCRAM-SHA-256 to store user passwords on disk.
+However, to keep up with the [latest security weaknesses around MD5](https://en.wikipedia.org/wiki/MD5#Security) and meet regulatory compliance requirements,
+PostgreSQL 14 has made SCRAM-SHA-256 the default password management mechanism. So, if you are using old PostgreSQL client software,
+you may want to update it, to be able to connect to the newer versions of the database server.
+
+## It's only the tip of the iceberg
+
+Indeed, there's a lot more to explore in the latest PostgreSQL, and we've barely scratched the surface of what PostgreSQL 14 has to offer.
+There's no better way to experience some of these features than by trying them out for yourself.
+You can check out these new features within your Supabase project without having to perform a local installation.
+
+Explore the [Supabase dashboard now](https://app.supabase.io) and get started with your new project.
diff --git a/www/_blog/2021-11-29-community-day.mdx b/www/_blog/2021-11-29-community-day.mdx
new file mode 100644
index 00000000000..78fa60a3680
--- /dev/null
+++ b/www/_blog/2021-11-29-community-day.mdx
@@ -0,0 +1,136 @@
+---
+title: 'Community Day'
+description: Kicking off launch week by highlighting the communities around Supabase.
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: launch-week-three/community-day/supabase-oss.jpg
+thumb: launch-week-three/community-day/supabase-oss.jpg
+tags:
+ - launch-week
+ - community
+date: '2021-11-29'
+toc_depth: 2
+---
+
+Supabase combines existing open-source tools with our own open-source contributions to provide a delightful experience for developers. As part of this goal we hope to build a community of communities, bringing together developers from many different tools, as well as new developers looking to get involved with open source.
+
+To kick off launch week we want to showcase some of the communities that make up the Supabase community, highlight some of their updates, and celebrate everyone who contributes their time to the Supabase mission.
+
+So let's get cracking, we've got a lot to cover. 🚀
+
+## Open Source Spotlight: Kong API Gateway
+
+Supabase provides a whole bunch of features that are made up of a [collection of open-source tools](/docs/architecture). To orchestrate these different services and functionalities we use the [Kong API Gateway](https://github.com/Kong/kong).
+
+As a user of our hosted offering you don't really need to know all this, but we love showcasing the amazing open-source tools that we work with, and so we've invited [Vik Gamov](https://twitter.com/gAmUssA) to give you a little intro to [Kong](https://github.com/Kong/kong):
+
+
+
+## PostgreSQL 14 updates
+
+
+
+Every web developer knows the importance of choosing a suitable database for building modern apps.
+Even though NoSQL, NewSQL, and other types of databases have received a great deal of buzz in the last few years,
+relational database management systems (or RDBMS) are still relevant for several critical business use cases and will likely do so in the foreseeable future.
+Among the many open-source relational databases available, [PostgreSQL](/docs/guides/database/introduction) is a popular choice among developers.
+It was named [DBMS of the year in 2020](https://db-engines.com/en/blog_post/85) by
+DBEngines, and with every release of PostgreSQL new features are available making it easy for developers and administrators to run their apps.
+
+[Gurjeet](https://twitter.com/0xGurjeet), one of our Postgres engineers, has written up a [blogpost](/blog/2021/11/28/whats-new-in-postgres-14) with the most important updates the every dev should know.
+
+## PostgREST 9 updates
+
+
+
+We've had a lot of feedback on our Postgres APIs, and we've been hard at work with the [PostgREST team](https://github.com/orgs/PostgREST/people) to improve an already-incredible product.
+
+Some new features include
+
+- Inner Joins
+- Functions with unnamed parameters
+- PostgreSQL 14 compatibility
+
+From tomorrow, every Supabase project will be on PostgREST 9 (including existing projects).
+
+Read about some of the new features in PostgREST 9 [here](/blog/2021/11/28/postgrest-9).
+
+## New community partner: GitGuardian
+
+
+
+[As you (hopefully) know](/docs/learn/auth-deep-dive/auth-deep-dive-jwts#jwts-in-supabase), keeping your service role key secret is a crucial part of securing your database. But we also know that it can be difficult to make sure it stays secret as your team grows and you don't accidentally leak it. To help you with this, [we've partnered with GitGuardian](https://blog.gitguardian.com/the-detector-of-the-month-november-2021/).
+
+GitGuardian helps developers keep 250+ types of secrets out of source code. Their automated secrets detection and remediation solution secures every step of the development life cycle, helping you monitor your code for sensitive data. Read [their blog post](https://blog.gitguardian.com/the-detector-of-the-month-november-2021/) to learn more.
+
+## Auth updates
+
+
+
+The beauty of building in the open is that the community can get involved in adding new OAuth providers, which is exactly what [@TheHarryET](https://twitter.com/TheHarryET) and [MonsterDeveloper](https://github.com/MonsterDeveloper) have been doing. Thanks to them you can now provide sign-in with [Slack](/docs/guides/auth/auth-slack) as well as [Spotify](/docs/guides/auth/auth-spotify) to your users, as well as use [MessageBird](/docs/guides/auth/auth-messagebird) for phone auth as an alternative to the existing [Twilio](/docs/guides/auth/auth-twilio) integration.
+
+## SupaSquad updates
+
+The [SupaSquad](/docs/handbook/supasquad) is an official Supabase advocate program where community members help build and manage the Supabase community.
+
+Among many other awesome things, the SupaSquad has been absolutely on fire building [client libraries](/docs/reference/javascript/supabase-client) for all flavors of backends and environments.
+
+
+
+### Python client library updates
+
+- New maintainers [`@Dreinon`](https://github.com/dreinon), [`@anand2312`](https://github.com/anand2312), and [`@leynier`](https://github.com/leynier). 💚
+- `gotrue-py` rewritten and now at feature parity with `gotrue-js`.
+- `postgrest-py` now support synchronous operations as well instead of just asynchronous operations in the past. Also at feature parity with `postgrest-js`.
+- `supabase-py` is now `supabase` (e.g. you do `pip3 install supabase` instead of `pip3 install supabase-py`).
+- Storage is working for the Python client library but it's yet to be extracted out as a standalone lib.
+
+## New tutorials and integration guides
+
+Our own [Jon Meyers](https://twitter.com/_dijonmusters) and the broader community have been busy creating awesome tutorials and integration guides to help everyone build even more amazing things with Supabase:
+
+- Jon has added official guides for working with [Auth0](/docs/guides/integrations/auth0) and [Vercel](/docs/guides/integrations/vercel),
+- [Jonny Summers-Muir](https://twitter.com/JSummersMuir) has been busy paving the way for [Prisma](/docs/guides/integrations/prisma), and
+- [Aman Mittal](https://github.com/amandeepmittal) has hooked us up with a guide for [Draftbit](/docs/guides/integrations/draftbit)!
+
+And below are some of the community one's we've come across recently. If you've created one yourself, please notify us by tagging us in a Tweet!
+
+- [Supabase & Sveltekit - Build Twitter in 75 minutes](https://youtu.be/mPQyckogDYc)
+- [Supabase Auth With Next.Js 12 Middleware](https://jitsu.com/blog/supabase-nextjs-middleware#what-were-going-to-build)
+- [Vue 3 & Supabase | Workout Tracker App](https://www.youtube.com/watch?v=3tF0fGkd4ho)
+- [Use Supabase Auth with Vue.js 3](https://vueschool.io/articles/vuejs-tutorials/use-supabase-auth-with-vue-js-3/)
+- [Dynamic Jamstack with Stencil and Supabase](https://ionicframework.com/blog/dynamic-jamstack-with-stencil-and-supabase)
+
+## Developer stories
+
+Anytime we scroll through [madewithsupabase.com](https://www.madewithsupabase.com/) we're absolutely blown away by the awesome things y'all are building with Supabase.
+
+So we reached out to some of our users, requesting a short video to learn more and we were overwhelmed with your gracious submissions. We've started a user stories playlist and we are so excited to see many more of these stories in the future. 💚
+
+
+
+And with that, we officially declare Launch Week as open 🥳 Check back [here](/blog) every day this week to see what new things we are shipping. We can't wait to share them with you 🚀
+
+## Want even more Supabase in your life?
+
+
+
+We've got some stellar swag drops and behind the scenes footage for you on our new [TikTok page](https://www.tiktok.com/@supabase.com). Make sure to follow us there as we'll be giving away some swag randomly to 10 peeps who follow us during launch week!
diff --git a/www/_blog/2021-11-30-supabase-studio.mdx b/www/_blog/2021-11-30-supabase-studio.mdx
new file mode 100644
index 00000000000..0156764d1e5
--- /dev/null
+++ b/www/_blog/2021-11-30-supabase-studio.mdx
@@ -0,0 +1,111 @@
+---
+title: "Supabase Studio"
+description: "The same Dashboard that you're using on our Platform is now available for local development and Self-Hosting."
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: launch-week-three/studio/open-source-studio-og.png
+thumb: launch-week-three/studio/open-source-studio-thumb.png
+tags:
+ - launch-week
+ - frontend
+ - studio
+date: '2021-11-30'
+toc_depth: 2
+---
+
+Today we're releasing [Supabase Studio](https://github.com/supabase/supabase/tree/master/studio).
+The same Dashboard that you're using on our Platform is now available for [Local Development](https://supabase.com/docs/guides/local-development)
+and [Self-Hosting](https://supabase.com/docs/guides/hosting/overview).
+
+## Background
+
+Let's get the obvious question out of the way - why wasn't it already open source?
+
+When Ant and I started Supabase the codebase was one large monorepo which contained everything from the dashboard to cloud infrastructure code to experimental code.
+This is our preferred development setup - we like to keep all code in one place so that we have a single source of truth and tightly coupled CI workflows.
+
+The original Dashboard really wasn't much except a couple of buttons which allowed our Alpha users to start and stop a Supabase project - back then only a PostgreSQL connection string.
+
+Then time went on, and we started gaining traction - a lot faster than expected.
+The nice thing about building for developers is that they are very vocal about the features they want to see next.
+And so we kept shipping - a SQL editor, a Table view, User management, auto-generated Docs, and everything else you can find on the Dashboard today.
+
+We've been planning to make the Dashboard public for a long time now, starting with [Supabase UI](http://ui.supabase.com/),
+[`supabase/grid`](https://github.com/supabase/grid), and a standalone [PR](https://github.com/supabase/supabase/pull/2281) for Supabase Studio.
+But as feature requests kept rolling in it became a Sisyphean task to maintain separate code bases.
+
+After the last Launch Week, we decided to prioritize the Studio.
+
+## Approaches for managing shared codebases
+
+We investigated a few different approaches used in the open source world. There are three popular strategies that we found amongst OSS projects and some of our YC alum:
+
+- Maintain separate code bases. Pluck changes from one to another.
+- Keep two repos in sync using some mixture of git submodules or a tool like [copycat](https://github.com/atomix/copycat)
+- Use the same codebase, abstracting platform-specific code behind an API and feature flags.
+
+Our frontend [team](https://github.com/orgs/supabase/teams/frontend/members) experimented with the first two approaches where they plucked (injected, merged, and wrangled) code for our Platform.
+Time-to-production become a lot slower, an unacceptable outcome at Supabase.
+
+Eventually we decided to open source all the frontend code, a shared codebase for both the Platform and Self Hosting.
+
+
+
+Special shout out
+
+Sentry do a fantastic job of documenting their strategy for managing a shared codebase and served as a great model for Supabase.
+
+
+
+## Build in public
+
+For the past week, the dashboard you've been using on the Platform has been deployed from our [main repository](https://github.com/supabase/supabase/tree/master/studio).
+
+This fits one of our core philosophies at Supabase: do less. Less code to manage means less bugs. Fewer codebases means faster shipping.
+
+
+
+It also fits the development philosophy of every other part of Supabase: building in public, "warts and all".
+
+This is a huge step forward for the community. Supabase users can now spot a bug, fix it in the open source repository,
+and have it shipped to both the Platform and Self-Hosted environments - all in a few hours.
+
+## Technical details
+
+Let's jump into some of the technical implementation for Supabase Studio.
+
+### Tech stack
+
+Studio is a Javascript application with a few key pieces of technology:
+
+- [Next.js](https://nextjs.org/) - A frontend Javascript framework built with React.
+- [Tailwind](https://tailwindcss.com/) - A utility-first CSS framework.
+- [Supabase UI](https://ui.supabase.com/) - Our own component library.
+- [MobX](https://www.mobxjs.com/) - A state management library.
+- A host of other [useful libraries](https://github.com/supabase/supabase/blob/master/studio/package.json), including [Radix UI](https://www.radix-ui.com), [Lottiefiles](https://lottiefiles.com/), [react-grid-layout](https://github.com/react-grid-layout/react-grid-layout), and [zxcvbn](https://github.com/dropbox/zxcvbn).
+
+### What's included
+
+Studio is designed to work with existing deployments - either the local hosted, docker setup, or our CLI.
+It is not intended for managing the deployment and administration of projects - that's out of scope.
+
+The features exposed on Studio for existing deployments are limited to those which manage your database:
+
+- Table & SQL editors. (Saved queries are unavailable for now)
+- Database management: Policies, roles, extensions, replication.
+- API documentation.
+
+Over time we'll expose a lot more of the codebase in the self-hosted Dashboard, this was as much as we could do for this Launch Week!
+
+## How to contribute?
+
+Check out the full instructions in our [Studio Readme](https://github.com/supabase/supabase/tree/master/studio).
+
+### We are live and launched on Product Hunt
+
+Our new open source Studio is also on Product Hunt right now. If you like what you see, please give it an upvote and a review.
+
+[](https://www.producthunt.com/posts/open-source-postgresql-studio?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-open-source-postgresql-studio)
+
diff --git a/www/_blog/2021-12-01-realtime-row-level-security-in-postgresql.mdx b/www/_blog/2021-12-01-realtime-row-level-security-in-postgresql.mdx
new file mode 100644
index 00000000000..23a9549d971
--- /dev/null
+++ b/www/_blog/2021-12-01-realtime-row-level-security-in-postgresql.mdx
@@ -0,0 +1,186 @@
+---
+title: "Realtime Postgres RLS now available on Supabase"
+description: "Realtime database changes are now broadcast to authenticated users, respecting the same PostgreSQL policies that you use for Row Level Security."
+author: oli_rice
+author_url: https://github.com/olirice
+author_image_url: https://github.com/olirice.png
+authorURL: https://github.com/olirice
+image: launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-og.png
+thumb: launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-thumb.png
+tags:
+ - launch-week
+ - realtime
+ - security
+date: '2021-12-01'
+toc_depth: 3
+---
+
+Realtime is a server that listens to changes in your PostgreSQL database and broadcasts the changes to clients through a websocket connection.
+
+Today, we're announcing security improvements to Realtime, where database changes will be broadcast to authenticated users, respecting the same PostgreSQL policies that you use for Row Level Security.
+
+## Demo
+
+
+
+
+## Overview
+
+Since the first commit of Realtime server back in [September 2019](https://github.com/supabase/realtime/commit/175f649784147af80acfc9ff5be9d160285c76ea),
+we've worked hard to improve its usability and scalability.
+
+Until now, Realtime did not adhere to RLS policies and instead broadcast all database changes to all clients.
+The unsafe nature of this behavior is the reason why Realtime has been an opt-in feature, and a key reason why we are still in Beta.
+
+As more developers rely on Realtime to receive and send database changes in their apps and services,
+security has become a primary concern for us and others in the community who wish to build secure systems with Realtime.
+
+Supabase projects have supported Row Level Security (RLS) for API authorization since our [Auth launch](https://supabase.io/blog/2020/08/05/supabase-auth).
+In that time, it has quickly become the recommended way to implement authorization.
+
+As we were evaluating possible solutions to improve Realtime security, we looked to our Auth implementation as inspiration for a cohesive security system.
+
+Today, we're updating Realtime to respect PostgreSQL RLS policies, so you can define your security rules once and have them automatically apply everywhere!
+
+Before diving deeper into our Realtime RLS implementation, let's briefly cover how RLS works in PostgreSQL.
+
+## Row Level Security Primer
+
+When you need to control access to individual rows of data, PostgreSQL has you covered with [Row Level Security (RLS) policies](https://www.postgresql.org/docs/current/ddl-rowsecurity.html).
+An RLS policy is a snippet of SQL filtering which users have the authority to create/read/update/delete rows in a table.
+
+For example, the following policy would allow users to select their own rows in a todos table:
+
+```sql hideCopy
+create policy todo_select_policy
+ on todos for select
+ using ( auth.uid() = user_id );
+```
+
+which is equivalent to adding
+
+```sql hideCopy
+select *
+from todos
+where auth.uid() = todos.user_id; -- Policy is implicitly added.
+```
+
+to queries.
+
+Check out the [Row Level Security guide](https://supabase.com/docs/guides/auth/row-level-security) for more info on how to use RLS with your project.
+
+## Realtime Design
+
+Our Realtime server receives and decodes binary changes from PostgreSQL logical replication, converts those changes to JSON, and broadcasts them to all connected clients.
+
+### Challenge for RLS
+
+The challenge, when applying row level security to the replication stream is that the visibility of a row may be different for each user subscribed to a database table.
+
+We recognized that to fully secure Realtime in accordance with row level security, a row's visibility must be checked separately for each user on every change.
+However, this quickly becomes a performance bottleneck when the number of changes, or number of subscribers, is large.
+
+Since we can't control the number of subscribers or the number of changed records, we instead focused on making the security check for each user on every change as fast as possible.
+
+### Implementation Overview
+
+With these challenges in mind, we upstreamed the security responsibility to the database. Write Ahead Log Realtime Unified Security (WALRUS) exposes a PostgreSQL
+function that Realtime server invokes with database changes.
+
+### WALRUS Implementation
+
+[WALRUS](https://github.com/supabase/walrus) inspects each record in the replication change to:
+
+- Identify the source table (e.g. `public.notes`).
+- Identify the change's action (INSERT/UPDATE/DELETE/TRUNCATE*).
+- Query the `subscription` table to determine the connected users who are actively subscribed to the source table. The `subscription` table is kept up to date by the Realtime server and tracks all connected users and the tables they are currently subscribed to.
+- For each subscriber:
+ - Assume the identity of the subscriber.
+ - Query the source table to see if the record is visible to that subscriber.
+- Report the list of subscribers who are authorized to view the record back to Realtime server.
+
+*Realtime server does not broadcast TRUNCATE changes
+
+**Efficiently Query to Check Access**
+
+To maximize throughput, the query used to evaluate if a row is visible to a subscriber always queries using the tables primary key.
+
+For example:
+
+```sql hideCopy
+select exists(select 1 from some_table where id = 806);
+```
+
+When more than one subscriber exists, the query is wrapped in a [prepared statement](https://www.postgresql.org/docs/13/sql-prepare.html) to remove the cost of the PostgreSQL
+query planner on subsequent calls. The query planner time is frequently 2-3x execution time for simple queries, so this immediately multiplies throughput in the most common cases!
+
+```sql hideCopy
+"Planning Time: 0.099 ms"
+"Execution Time: 0.051 ms"
+```
+
+**Colocation**
+
+Colocating the security engine with subscriber data inside PostgreSQL allows us to avoid significant overhead when applying RLS policies.
+Namely, network round-trip latency and I/O bottlenecks are removed while connection overhead is reduced relative to testing each record's visibility by polling the database from a separate process.
+Instead, the SQL function only consumes a single connection and performs no network I/O.
+
+### Performance
+
+The throughput performance of the database server is best measured in terms of record processing time. As the number of subscribers to a table grows, the time required to process each record,
+and the resultant processing time also grows.
+
+
+
+
+
+| Subscribers | 1 | 5 | 10 | 25 | 50 | 100 | 250 | 500 | 1,000 | 2,000 | 5,000 | 10,000 |
+|------------------------|------|------|------|------|------|------|------|------|-------|-------|-------|--------|
+| Processing Time (ms) | 11.2 | 12.5 | 14.2 | 16.7 | 18.8 | 24.5 | 27.8 | 29.1 | 64.7 | 75.5 | 158.4 | 303.8 |
+
+
+
+## Best Practices for Performance
+
+To get the most out of Realtime row level security, follow these guidelines:
+
+### Disable for public tables
+
+If your data is insensitive or publicly available, such as stock prices listed under NASDAQ, then don't enable row level security!
+
+The fastest security policy is one that doesn't exist :)
+
+### Optimize your policies
+
+If you do need row level security, make sure that your policies are fast.
+
+Remember that your policy is executed *each* time a query touches the table that the policy is applied to. If your policy is slow, all access to that table will be slow.
+Avoid joins within RLS policies when you can, and make sure all filter conditions use an index.
+
+Additionally, keep in mind that if you use joins within an RLS policy, any RLS policies on the tables you're joining to will also be executed in turn, adding to the overall overhead.
+
+### Small primary keys
+
+Keep your primary keys small and efficient.
+
+Use single column primary keys with a fixed field size (integer, uuid, etc.) over text or multi-column indexes.
+
+## Next Steps
+
+Realtime RLS is available today on all existing and new Supabase projects. To get started, upgrade your Supabase JavaScript client to version v1.23.0
+and launch your new PostgreSQL database today: [database.new](https://database.new)
+
+## Credits
+
+Authored by:
+
+- [Oliver Rice](https://github.com/olirice)
+- [Wen Bo Xie](https://github.com/w3b6x9)
\ No newline at end of file
diff --git a/www/_blog/2021-12-02-supabase-acquires-logflare.mdx b/www/_blog/2021-12-02-supabase-acquires-logflare.mdx
new file mode 100644
index 00000000000..ed9f3d87044
--- /dev/null
+++ b/www/_blog/2021-12-02-supabase-acquires-logflare.mdx
@@ -0,0 +1,129 @@
+---
+title: 'Supabase acquires Logflare'
+description: "Today, we're ecstatic to announce that Logflare is joining Supabase."
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-og.png
+thumb: launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-thumb.png
+tags:
+ - launch-week
+ - logging
+date: '2021-12-02'
+toc_depth: 3
+---
+
+Back in May 2020, we [tweeted about](https://twitter.com/supabase/status/1265922290237071361?lang=bg) one of the most impressive products we had ever used: Logflare, a log ingestion platform.
+
+
+
+Today, we're ecstatic to announce that Logflare is joining Supabase.
+
+## Why logging?
+
+A log platform might seem like a strange acquisition for Supabase - after all, there are no "Firebase Logs".
+
+Logging is one of the most unappreciated parts of a tech stack, often an after-thought. But when leveraged correctly, logs give developers superpowers.
+
+### Debugging
+
+Logs are an integral part of the developer workflow. When you're programming in Javascript, or Rust, or Go, how often do you rely on the console output to inspect and fix errors? Database debuggers have a lot to learn from programmer tooling.
+
+We want to provide the best database developer experience in the world, and so we're making debugging a first-class citizen.
+
+### Observability
+
+Databases can be a black box when it comes to spotting errors, finding slow queries, and testing performance optimizations.
+
+The full Supabase stack is more than just a database. It includes various tools working together - APIs, Storage, Auth, and CDNs. A broad tech stack needs a unified measurement system to give a birds-eye view of everything happening within your Supabase project.
+
+This is especially true for our enterprise customers, who need to know that their servers are not just operating, but optimized with alerting the instant anything goes wrong.
+
+### Analytics
+
+While it's not immediately apparent, logs are analytics! Especially when a developer can correlate log entries, and enrich them with database data.
+
+Imagine tracing one of your user's network requests from the browser to a database query. Perhaps you'd like to know which of your users are making the most API requests, or downloading the most files, or spending the most time connected to the application?
+
+With granular logs, this becomes possible and paves the way for an incredible developer experience: managing your API versioning, predicting growth, and managing billing costs.
+
+## Why Logflare?
+
+Since that first tweet in May 2020, our platform has generated billions of log entries. During that time, Logflare has been a staple product in our day-to-day operations. There are a few reasons why Logflare is such a great match for Supabase.
+
+- Chase! The founder of Logflare, [Chase](https://twitter.com/chasers), is an accomplished founder, incredibly product-focused, and an all-around mensch. With over 10 years of experience in data aggregation, Chase is the type of talented person that every team dreams of working with.
+- Elixir. Logflare is built with Elixir, the same as our Realtime Engine. We love Elixir at Supabase, and it's nice to have it power another key part of the Supabase stack.
+- Real-time. Logflare isn't just for querying logs, it displays what's happening in realtime, allowing you to debug your systems live.
+- Branding. Who doesn't love the vivid green with dark mode? 😎
+
+
+
+## Why is Logflare joining Supabase?
+
+
+
+ I really like how Supabase is taking an existing, proven, piece of technology and making it more
+ accessible for more users. A lot of people already use Postgres, but they don't take advantage
+ of powerful features built into the database. Supabase is exposing these features more
+ prominently, making them more accessible to more developers with technology, and educating
+ people on how to leverage these features for a better experience for end users.
+
+
+ With Logflare, we've been trying to do this exact thing for analytics oriented databases. We've
+ started with BigQuery. Logflare makes it easier to stream inserts with by automatically adapting
+ the underlying schema for you. We make it easier to inspect and query your stream. And with
+ Logflare Endpoints we're starting to make it easier to operationalize analytics by allowing
+ people to build APIs from SQL statements. With Endpoints developers can enhance user facing
+ applications without setting up traditionally tedious and brittle data pipelines. We've started
+ with BigQuery but will soon be supporting other backends optimized for various analytics use
+ cases.
+
+
+
+## Supabase + Logs
+
+We still have a lot of technical work to integrate Logflare into Supabase, with plans of fully supporting the existing Vercel and Cloudflare integrations.
+
+In just the past 10 days, we've been working on a few of the new Dashboard features, which you'll be able to see very soon.
+
+Over the next few weeks, we plan to release these features (once we have a chance to polish them up), and you'll be able to query your logs with your favorite language - SQL 😀.
+
+
+
+
+## Open source
+
+Right now, Logflare works natively with Big Query. But as our track record has proven, we're 100% committed to open source. We're working on the future of a fully open-source version of Logflare, with support for various storage engines.
+
+## Next steps
+
+If you're an existing Logflare user, we'll be migrating everything to Supabase in the coming months. We'll work closely with you to ensure that the transition is seamless, and introduce the same [pricing levels](https://logflare.app/pricing) that Logflare offers today.
+
+We've worked with Chase on a list of potential questions you might have about the transition. If you have any concerns or questions, you can reach out to support@supabase.io.
+
+
diff --git a/www/_blog/2021-12-03-launch-week-three-friday-five-more-things.mdx b/www/_blog/2021-12-03-launch-week-three-friday-five-more-things.mdx
new file mode 100644
index 00000000000..3df2ccbfa70
--- /dev/null
+++ b/www/_blog/2021-12-03-launch-week-three-friday-five-more-things.mdx
@@ -0,0 +1,104 @@
+---
+title: 'Five more things'
+description: It's never just one more thing!
+author: ant_wilson
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: launch-week-three/five-more-things/five-more-things-og.png
+thumb: launch-week-three/five-more-things/five-more-things-thumb.png
+tags:
+ - launch-week
+ - graphql
+ - CDN
+ - functions
+date: '2021-12-03'
+toc_depth: 3
+---
+
+## Open source GraphQL PostgreSQL Extension
+
+Today we're open sourcing [pg_graphql](https://github.com/supabase/pg_graphql), a work-in-progress native PostgreSQL extension adding GraphQL support. The extension keeps schema generation, query parsing, and resolvers all neatly contained on your database server requiring no external services.
+
+`pg_graphql` inspects an existing PostgreSQL schema and reflects a GraphQL schema with resolvers that are:
+
+- performant
+- always up-to-date
+- compliant with best practices
+- serverless
+- open source
+
+Interested? Read more about the technical implementation here.
+
+
+
+## Supabase CDN
+
+Today we are launching Supabase CDN for all projects. All requests are routed through global network of more than 250 cities.
+
+Assets stored in Supabase Storage benefit the most from this feature since they have a default cache time of 1 hour. They load an order of magnitude faster, usually in just tens of ms! After the initial request, the asset will be cached at the edge and doesn't hit your Supabase server. This frees up more resources in your project to handle other requests.
+
+Our Postgrest, Gotrue and Realtime APIs are also faster since SSL is terminated at the edge. This is a brief overview of some of our other performance enhancements we have enabled under the hood.
+
+### TLS 1.3
+
+Usually, negotiating a new SSL connection requires at least 3 round trips between the client and the server. This leads to a degraded experience for users with high latencies. TLS1.3 reduces the number of roundtrips to negotiate an SSL connection from 3 to 2. It also supports Zero Round Trip Time (0-RTT) session resumption. This lets repeat users to resume a connection without any additional roundtrips!
+
+### HTTP/3
+
+HTTP/3 or HTTP over QUIC is the successor to HTTP/2. This protocol is based on UDP instead of TCP. HTTP/3 is faster than HTTP/2 (conditions apply), is more secure, future proof.
+
+### Brotli
+
+Brotli is a new compression algorithm that performs better than gzip. All text based responses from Supabase (including the massive amount of Javascript required to render websites these days) are compressed with Brotli.
+
+We can also ensure a higher degree of reliability of your Supabase APIs with a CDN by defending against Denial of Service Attacks and bots.
+
+
+
+## (Yet another) Supabase Functions update
+
+It's been four months since our [last Functions update](https://supabase.com/blog/2021/07/30/supabase-functions-updates) and (as it's becoming a tradition at the end of Launch Week) we have another update for you.
+
+Unfortunately we're still not in a position to release anything. There are a few reasons for this - mainly it's because we've been hyper focused on a couple major milestones:
+
+Since our last Functions update we've [raised our Series A,](https://supabase.com/blog/2021/10/28/supabase-series-a) [acquired a company](https://supabase.com/blog/2021/12/02/supabase-acquires-logflare), built [Realtime Row Level Security](https://supabase.com/blog/2021/12/01/realtime-row-level-security-in-postgresql), [open sourced the dashboard](https://supabase.com/blog/2021/11/30/supabase-studio), built a GraphQL extension for PostgreSQL, and added four Auth providers, all while growing the community, supporting open-source tools, and delivering a few other things that the community felt was important.
+
+That being said, we *have* been working on Functions, iterating through different designs to figure out what's going to have the biggest impact for Supabase developers. So today we are going to open up our ideas and designs through our [RFC repo](https://github.com/supabase/rfcs) (request for comments).
+
+There are two important RFCs related to functions:
+
+- [[RFC: 0004]: Functions](https://github.com/supabase/rfcs/blob/rfc/functions/rfc/0004-functions.md) - Outlines various options for implementing Supabase Functions.
+- [[RFC: 0005]: Functions with containers](https://github.com/supabase/rfcs/pull/5) - Outlines our design of Functions with containers, the implementation that we are heavily leaning towards.
+
+
+
+## Free Supabase egghead.io course
+
+
+
+We've partnered with the fine folks at [egghead.io](http://egghead.io) to bring you a free, in-depth course where you'll learn how to ["Build a SaaS product with Next.js, Supabase and Stripe"](https://egghead.io/courses/build-a-saas-product-with-next-js-supabase-and-stripe-61f2bc20).
+
+You will learn how to build a subscription-based billing project from scratch, and by the end of the course, have something deployed to production that can make you very real money!
+
+[Check it out](https://egghead.io/courses/build-a-saas-product-with-next-js-supabase-and-stripe-61f2bc20) entirely free on egghead, and build something that can generate some income, while you enjoy your holidays!
+
+
+
+## Kicking off the Holiday Hackdays
+
+
+
+While not everyone will be celebrating the holidays this December, we can all be united in celebrating open-source software, and to do so we're kicking off the "Holiday Hackdays" (loosely inspired by the [12 Pubs of Christmas](https://www.irelandbeforeyoudie.com/12-pubs-of-christmas-rules-tips-everything-you-need-for-a-great-night/) only a bit healthier).
+
+Starting today at 7am PT we'll be hacking together for the next 10 days until 23:59pm PT on Sunday December 12th. And because we've launched [row-level security for our Realtime API](https://supabase.com/blog/2021/12/01/realtime-row-level-security-in-postgresql) earlier this week, we'd love for you to use it in your Hackathon project. May it be to build a [Santa Tracker](https://www.freecodecamp.org/news/create-your-own-santa-tracker-with-gatsby-and-react-leaflet/) or that secure family chat app to bring all your relatives together for the festive season, be creative and most importantly have fun 🥳
+
+[As always](https://supabase.com/blog/2021/10/14/hacktoberfest-hackathon-winners-2021#the-prizes), we'll have some extremely limited edition swag to give away that can only be won by participating in the Hackathon!
+
+The Supabase team will be participating as well, for example [Jon](https://twitter.com/_dijonmusters) and Thor, inspired by [Egghead's "Holiday Course Release Extravaganza"](https://egghead.io/20-days), will be building an Advent Calendar for all the [awesome community content](https://supabase.com/blog/2021/11/29/community-day#new-tutorials-and-integration-guides) you've been creating. Get ready for a cool open-source project which will be using a lot of the hottest Supabase features! To make sure you don't miss this one, follow us on [Twitter](https://twitter.com/supabase) and subscribe to our [YouTube channel](https://www.youtube.com/supabase). We'll see you there.
+
+Find the full hackathon details and rules in the [blog post](https://supabase.com/blog/2021/12/03/supabase-holiday-hackdays-hackathon).
+
+That's it, that's another Launch Week wrapped. See you at the next one, or in the meantime on Discord, and until then, happy hacking!
+
+
\ No newline at end of file
diff --git a/www/_blog/2021-12-03-pg-graphql.mdx b/www/_blog/2021-12-03-pg-graphql.mdx
new file mode 100644
index 00000000000..54352d67423
--- /dev/null
+++ b/www/_blog/2021-12-03-pg-graphql.mdx
@@ -0,0 +1,199 @@
+---
+title: 'pg_graphql: A GraphQL extension for PostgreSQL'
+description: GraphQL support is in development for PostgreSQL + Supabase.
+author: oli_rice
+author_url: https://github.com/olirice
+author_image_url: https://github.com/olirice.png
+authorURL: https://github.com/olirice
+image: launch-week-three/five-more-things/supabase-pg-graphql-og.png
+thumb: launch-week-three/five-more-things/supabase-pg-graphql-thumb.png
+tags:
+ - launch-week
+ - community
+ - graphql
+date: '2021-12-03'
+toc_depth: 3
+---
+
+Today we're open sourcing [`pg_graphql`](https://github.com/supabase/pg_graphql), a work-in-progress native PostgreSQL extension adding GraphQL support. The extension keeps schema generation, query parsing, and resolvers all neatly contained on your database server requiring no external services.
+
+`pg_graphql` inspects an existing PostgreSQL schema and reflects a GraphQL schema with resolvers that are:
+
+- performant
+- always up-to-date
+- compliant with best practices
+- serverless
+- open source
+
+Interested? You're [3 commands away](https://supabase.github.io/pg_graphql/quickstart/) from a live [GraphiQL](https://graphql-dotnet.github.io/docs/getting-started/graphiql/) demo.
+
+
+## Motivation
+
+The Supabase stack is centered around PostgreSQL as the single source of truth. All data, configuration, and security are housed in the database so any GraphQL solution needed to be equivalently SQL-centric.
+
+With that in mind, we took a look at the landscape and considered two excellent technologies, [Graphile](https://www.graphile.org/postgraphile/), and [Hasura](https://hasura.io/).
+
+| Requirements | Graphile | Hasura |
+|--------------------------|----------|--------|
+| Open Source | ✅ | ✅ |
+| Reflected GraphQL Schema | ✅ | ✅ |
+| Reflected Resolvers | ✅ | ✅ |
+| Always up-to-date | ✅ | ✅ |
+| Performant | ✅ | ✅ |
+
+We found both options to be largely viable for the core feature set.
+
+Which left us with one final hang-up: we host free-tier projects on VMs with 1 GB of memory. After tallying the resources reserved for PostgreSQL, PostgREST, Kong, GoTrue, and a handful of smaller services, we were left with a total memory budget of ... 0 MB 😬. Unsurprisingly, our pathological memory target disqualified any option that required launching another process in those VMs.
+
+For that reason, we decided to invest in a lightweight alternative that runs in the database, and can be exposed over HTTP using the existing [PostgREST](https://supabase.com/docs/guides/api) deployments' [RPC functionality.](https://postgrest.org/en/v8.0/api.html#stored-procedures)
+
+By our most conservative estimate, that reduces the platform's memory requirements by 525 TB/hours every month, saving 💰 and 🌳.
+
+## Design
+
+As a native PostgreSQL extension, `pg_graphl` is written in a combination of C and SQL. Each GraphQL query is parsed, validated, and transpiled to SQL, all within the database.
+
+Each GraphQL request is resolved by a single SQL statement. That SQL statement aggregates requested data as a JSON document to return to the caller. This approach results in blazing fast response times, avoids the [N+1 query problem](https://medium.com/the-marcy-lab-school/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a), and hits the theoretical minimum achievable network IO overhead of any GraphQL to SQL resolver. No special permissions are required for the PostgreSQL role executing queries, so `pg_graphql` is fully compatible with your existing [row level security policies](/docs/guides/auth/row-level-security).
+
+Embedding the GraphQL server directly in the database allows us to leverage PostgreSQL's built-in solutions for common challenges:
+
+Caching → `PREPARE STATEMENT`
+
+Errors → `RAISE EXCEPTION`
+
+Bad Data → `ROLLBACK`
+
+Authorization → `CREATE POLICY`
+
+Similarly, `pg_graphql` benefits from PostgreSQL's strong [ACID](https://database.guide/what-is-acid-in-databases/) guarantees and can expose them through its API.
+
+Ever wanted to execute multiple operations in a single transaction? Each request is managed in a single transaction so with a multi-operation GraphQL request and `pg_graphql`, that behavior falls out for free!
+
+### Schema Reflection
+
+As a limited example of how the reflection engine works, here's how it converts a single table into a full GraphQL schema.
+
+```sql hideCopy
+# schema.sql
+create table account(
+ id serial primary key,
+ email varchar(255) not null,
+ created_at timestamp not null,
+ updated_at timestamp not null
+);
+```
+
+Translates into
+
+```graphql hideCopy
+# schema.graphql
+scalar Cursor
+scalar DateTime
+scalar JSON
+scalar UUID
+scalar BigInt
+
+type PageInfo {
+ hasNextPage: Boolean!
+ hasPreviousPage: Boolean!
+ startCursor: String!
+ endCursor: String!
+}
+
+type Query {
+ account(nodeId: ID!): Account
+ allAccounts(
+ after: Cursor,
+ before: Cursor,
+ first: Int,
+ last: Int
+ ): AccountConnection
+}
+
+type Account {
+ nodeId: ID!
+ id: String!
+ email: String!
+ createdAt: DateTime!
+ updatedAt: DateTime!
+}
+
+type AccountEdge {
+ cursor: String!
+ node: Account
+}
+
+type AccountConnection {
+ totalCount: Int!
+ pageInfo: PageInfo!
+ edges: [AccountEdge]
+}
+```
+
+Where `Query` type's `account` field selects a single account by its globally unique `ID` and `allAccounts` enables pagination via the [relay connections specification](https://relay.dev/graphql/connections.htm). Under the SQL hood, iterating through pages is handled using keyset pagination giving consistent retrieval times on every page.
+
+For a more complete examples with relationships, enums, and more exotic types check out the [reflection doc](https://supabase.github.io/pg_graphql/reflection).
+
+### API
+
+`pg_graphql`'s public API is a single SQL function that returns JSON.
+
+```sql hideCopy
+gql.resolve(
+ stmt text, -- the graphql query/mutation
+ variables jsonb default '{}'::jsonb, -- key value pairs
+)
+ returns jsonb
+```
+
+For example, a GraphQL query selecting the `id` field for a collection of type `Book` would look like this:
+
+```sql hideCopy
+gqldb= select gql.resolve($$
+
+query {
+ allBooks {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+}
+
+$$);
+
+ resolve
+----------------------------------------------------------------------
+{"data": {"allBooks": {"edges": [{"node": {"id": 1}}]}}, "errors": []}
+```
+
+We're opting to expose the function over HTTP through PostgREST but you could also connect to the PostgreSQL database and call the function directly from your server code in any programming language.
+
+## Performance
+
+When it comes to APIs, performance counts. Here are some figures from [Apache Bench](https://www.tutorialspoint.com/apache_bench/apache_bench_quick_guide.htm) showing 2,205 requests/second on a 4 core machine with 16 GB of memory.
+
+```markdown hideCopy
+Concurrency Level: 8
+Time taken for tests: 3.628 seconds
+Complete requests: 8000
+Failed requests: 0
+Total transferred: 1768000 bytes
+Total body sent: 1928000
+HTML transferred: 368000 bytes
+Requests per second: 2205.21 [#/sec] (mean)
+Time per request: 3.628 [ms] (mean)
+Time per request: 0.453 [ms] (mean, across all concurrent requests)
+Transfer rate: 475.93 [Kbytes/sec] received
+```
+
+Full steps to reproduce this output are available in [the docs](https://supabase.github.io/pg_graphql).
+
+## Open Source
+
+`pg_graphql` is [open source software](https://github.com/supabase/pg_graphql/). As always, Issues and PRs are welcome.
+
+
+[Try `pg_graphql`](https://supabase.github.io/pg_graphql/quickstart/) today to see a live [GraphiQL](https://graphql-dotnet.github.io/docs/getting-started/graphiql/) demo.
diff --git a/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx b/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx
new file mode 100644
index 00000000000..fb8990ba27b
--- /dev/null
+++ b/www/_blog/2021-12-03-supabase-holiday-hackdays-hackathon.mdx
@@ -0,0 +1,135 @@
+---
+title: 'Kicking off the Holiday Hackdays'
+description: Build cool stuff and celebrate open-source software with us during the Holiday Hackdays!
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: launch-week-three/holiday-hackdays-og.png
+thumb: launch-week-three/holiday-hackdays-og.png
+tags:
+ - hackathon
+ - community
+date: '2021-12-03'
+toc_depth: 3
+---
+
+While not everyone will be celebrating the holidays this December, we can all be united in celebrating open-source software, and to do so we're kicking off the "Holiday Hackdays" (loosely inspired by the [12 Pubs of Christmas](https://www.irelandbeforeyoudie.com/12-pubs-of-christmas-rules-tips-everything-you-need-for-a-great-night/), only a bit healthier).
+
+Starting today at 7am PT we'll be hacking together for the next 10 days until 23:59pm PT on Sunday December 12th. And because we've launched [row-level security for our Realtime API](https://supabase.com/blog/2021/12/01/realtime-row-level-security-in-postgresql) earlier this week, we'd love for you to use it in your Hackathon project. May it be to build a [Santa Tracker](https://www.freecodecamp.org/news/create-your-own-santa-tracker-with-gatsby-and-react-leaflet/) or that secure family chat app to bring all your relatives together for the festive season, be creative and most importantly have fun 🥳
+
+[As always](https://supabase.com/blog/2021/10/14/hacktoberfest-hackathon-winners-2021#the-prizes), we'll have some extremely limited edition swag to give away that can only be won by participating in the Hackathon!
+
+The Supabase team will be participating as well, for example [Jon](https://twitter.com/_dijonmusters) and I, inspired by [Egghead's "Holiday Course Release Extravaganza"](https://egghead.io/20-days), will be building an Advent Calendar for all the [awesome community content](https://supabase.com/blog/2021/11/29/community-day#new-tutorials-and-integration-guides) you've been creating. Get ready for a cool open-source project which will be using a lot of the hottest Supabase features! To make sure you don't miss this one, follow us on [Twitter](https://twitter.com/supabase) and subscribe to our [YouTube channel](https://www.youtube.com/supabase). We'll see you there.
+
+## Details
+
+### Timeline
+
+- **Friday Dec 3rd at 07:00am PT:** Last day of Launch Week. Join us on [Twitter Spaces](https://twitter.com/i/spaces/1eaKbNDPEOYKX?s=20) for the kickoff announcement.
+- Build your project during the next 10 days and hang out with the community [on Discord](https://discord.gg/bnncdqgBSS).
+- **Sunday Dec 12th at 11:59pm PT:** Submission deadline
+- Judges Deliberate (Monday)
+- We'll be contacting and announcing the winners [on Twitter](https://twitter.com/supabase) throughout the week after.
+
+
+
+### Prize categories
+
+There are multiple chances to win, there will be prizes for:
+
+- Most impressive usage of the Realtime API features
+- Most fun / holiday themed project
+
+There will be a winner and a runner-up prize for each category.
+
+### Submission
+
+Submit your project via [madewithsupabase.com/holiday-hackdays](https://www.madewithsupabase.com/holiday-hackdays)
+
+You will be asked to send a link to a GitHub (or similar) repo, in the README you should include:
+
+- link to hosted demo (if applicable)
+- list of team members github handles (and twitter if they have one)
+- any demo videos, instructions, or memes
+- a brief description of how you used Supabase:
+ - to store data?
+ - realtime?
+ - auth?
+ - storage?
+- any other info you want the judges to know (motivations/ideas/process)
+- _optional_ team photo
+
+### Judging & announcement of winners
+
+The Supabase team will excitedly review what you've built. They will be looking for a few things, including:
+
+- creativity/inventiveness
+- functions correctly/smoothly
+- visually pleasing
+- technically impressive
+- use of Supabase features
+ - deep usage of a single feature or
+ - broad usage are both ok
+- FUN! 😃
+
+We'll be contacting and announcing winners [on Twitter](https://twitter.com/supabase) throughout the week after submission closes.
+
+ {' '}
+
+### Rules
+
+- Team size 1-5 (all team members on winning teams will receive a prize)
+- You cannot be in multiple teams
+- One submission per team
+- All design elements, code, etc. for your project/feature must be created **during** the event
+- All entries must be Open Source (link to source code required in entry)
+- Must use Supabase in some capacity
+- Can be any language or framework
+- You must submit before the deadline (no late entries)
+- You can continue to make updates to your project after the submission deadline, but there is no guarantee that the judges will see additions made after the submission time.
+
+### Community & help
+
+Hang out with the Supabase team and community on Discord:
+
+- Text channel: hackathon
+- Audio channel: hackathon
+
+If you need help or advice when building, find other people to join your team, or if you just want to chill and watch people build, come and join us!
+
+Join our Discord: [discord.gg/bnncdqgBSS](https://discord.gg/bnncdqgBSS)
+
+
+
+### Resources & Guides
+
+Here's a collection of resources that will help you get started building with Supabase:
+
+- Need some inspiration? [See what folks built last time](/blog/2021/08/09/hackathon-winners)!
+- [Examples and Resources](/docs/guides/examples)
+- [Supabase Crash Course](https://www.youtube.com/watch?v=7uKQBl9uZ00) [video]
+- [Flutter Quickstart Guide](/docs/guides/with-flutter)
+- [Nextjs Quickstart Guide](/docs/guides/with-nextjs)
+- [Using Supabase inside Replit](/blog/2021/03/11/using-supabase-replit)
+- [Full Stack Development with Next.js and Supabase – The Complete Guide](https://www.freecodecamp.org/news/the-complete-guide-to-full-stack-development-with-supabas/)
+- [Auth Deep Dive - Learn everything there is to know about Supabase Auth](/docs/learn/auth-deep-dive/auth-deep-dive-jwts) [videos]
+- [Send SMS notifications using Twilio](https://www.twilio.com/blog/send-sms-notifications-supabase-users-node-js-twilio-messaging)
+- [How to Integrate Supabase in Your Ionic App](https://www.youtube.com/watch?v=pl9XfIWutKE) [video]
+- [Building a Slack clone with authentication and realtime data syncing using Supabase](https://www.youtube.com/watch?v=LUMxJ4w-MUU) [video]
+- [Creating Protected Routes In NextJS With Supabase](https://aboutmonica.com/blog/creating-protected-routes-in-next-js-with-supabase)
+
+### Additional Info
+
+- Any intellectual property developed during the hackathon will belong to the team that developed it. We expect that each team will have an agreement between themselves regarding the IP, but this is not required
+- By making a submission you grant Supabase permission to use screenshots, code-snippets and/or links to your project or content of your README on our twitter, blog, website, email updates, and in the Supabase discord server. Supabase does not make any claims over your IP.
diff --git a/www/_blog/2021-12-15-beta-november-2021-launch-week-recap.mdx b/www/_blog/2021-12-15-beta-november-2021-launch-week-recap.mdx
new file mode 100644
index 00000000000..61ffb6a548d
--- /dev/null
+++ b/www/_blog/2021-12-15-beta-november-2021-launch-week-recap.mdx
@@ -0,0 +1,119 @@
+---
+title: 'Supabase Beta November 2021: Launch Week Recap'
+description: We wrapped up November with Supabase's third Launch Week. Here's all the awesome stuff that got shipped ...
+author: ant_wilson
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: 2021-nov/release-nov-2021.jpg
+thumb: 2021-nov/release-nov-2021-cover.jpg
+tags:
+ - release-notes
+date: '2021-12-15'
+toc_depth: 3
+---
+
+We wrapped up November with Supabase's third Launch Week. It also happens to be 12 months since we moved from alpha to beta.
+
+Here's all the awesome stuff that got shipped during Launch Week...
+
+## Supabase Studio
+
+We [open sourced the Dashboard](/blog/2021/11/30/supabase-studio) - it's now included in Self-Hosting, and the community are now able to contribute,
+which is going to help us move even faster! Expect many more updates to the dashboard over the coming weeks and months! [Read the code for yourself.](https://github.com/supabase/supabase/tree/master/studio)
+
+
+
+## We acquired Logflare
+
+We were early Logflare users, and found it to be one of the most impressive products we'd ever used. So impressive in fact, that we wanted to offer it's capabilities to our entire user base.
+You'll now find fully searchable Supabase API and database logs within the dashboard, and we're also in the process of open sourcing the codebase. [Read more about the acquisition](/blog/2021/12/02/supabase-acquires-logflare).
+
+
+
+## Realtime Row Level Security
+
+[Security rules now work for Realtime](/blog/2021/12/01/realtime-row-level-security-in-postgresql).
+All of your row level security policies now work with the realtime API, so you can limit streams and subscriptions on a per user basis (or any configuration you want!).
+
+
+
+
+## GraphQL is coming to Supabase
+
+We heard you! And built a Postgres extension for [querying your database with GraphQL](/blog/2021/12/03/pg-graphql).
+This means that each GraphQL request is resolved by a single SQL statement and hits the theoretical minimum achievable network IO overhead of any GraphQL to SQL resolver.
+
+
+
+## Supabase now runs on PostgreSQL 14
+
+One of the most exciting things to happen in databases this year was the release of PG 14.
+Which is now the default database used on our hosted platform. Read more here about [why we're so excited about it](/blog/2021/11/28/whats-new-in-postgres-14).
+
+
+
+
+## PostgREST 9.0
+
+PostgREST is the tool we use to introspect your schema and make your database available over a RESTful API.
+We also sponsor and help maintain this amazing open source project. Version 9.0 was just released and has also been rolled out to all new and existing Supabase projects on our hosted platform.
+[Check out the blog post](/blog/2021/11/28/postgrest-9) by Steve Chavez, the maintainer of PostgREST.
+
+
+
+## Building a SaaS?
+
+We have [a course for that](https://egghead.io/courses/build-a-saas-product-with-next-js-supabase-and-stripe-61f2bc20).
+You'll learn how to combine Next.js, Stripe, and Supabase to launch your business in no time at all.
+It's honestly mind blowing how quickly you can get products out the door with this stack. Oh and it's free.
+
+
+
+## New Storage CDN
+
+Serving your files in no time - Get eye wateringly fast load times for your media files. [Read all about the benefits](/blog/2021/12/03/launch-week-three-friday-five-more-things#supabase-cdn).
+
+
+
+## How we Launch
+
+We "open sourced" our launch methodology - Learn about how we plan, execute, and retrospect launch weeks internally. [Read the post](/blog/2021/11/26/supabase-how-we-launch).
+supabase monthly growth
+
+
+
+## Community
+
+### Highlights
+
+- Community Day [blog](/blog/2021/11/29/community-day#new-tutorials-and-integration-guides)
+- The SupaSquad has been busy [blog](/blog/2021/11/29/community-day#supasquad-updates)
+- 10 startups on what they're building with Supabase [video](https://www.youtube.com/watch?v=QAm1x7KaLq4&list=PL5S4mPUpp4OuzQN-a_FY3OZQuYo4NmXvb&t=3s)
+- New official integration guides [blog](https://supabase.com/blog/2021/11/29/community-day#new-tutorials-and-integration-guides)
+- Add Supabase in Teta [video](https://www.youtube.com/watch?v=lt-Vebxk-Mk)
+- Auth flow with Remix and Supabase [video](https://www.youtube.com/watch?v=-KiH8feOHSc)
+- Discovering Supabase [video](https://www.youtube.com/watch?v=WToGeMIdoSY)
+- Next.js with Magic Links [blog](https://dev.to/dailydevtips1/authenticating-nextjs-with-supabase-auth-magic-links-363e)
+- Next.js + Auth0 + Supabase [blog](https://auth0.com/blog/using-nextjs-and-auth0-with-supabase/)
+
+### TikTok
+
+Supabase is [now on TikTok](https://www.tiktok.com/@supabase.com?) - Watch us ship to some questionable beats.
+
+
+
+
+### GitHub
+
+We hit 25K stars!! [github.com/supabase/supabase](http://github.com/supabase/supabase)
+
+
+
+## Get started
+
+- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
+- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
+- Follow us **[on Twitter](https://twitter.com/supabase)**
+- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
+- Become a **[sponsor](https://github.com/sponsors/supabase)**
\ No newline at end of file
diff --git a/www/_blog/2021-12-17-holiday-hackdays-winners-2021.mdx b/www/_blog/2021-12-17-holiday-hackdays-winners-2021.mdx
new file mode 100644
index 00000000000..e85c0afda5e
--- /dev/null
+++ b/www/_blog/2021-12-17-holiday-hackdays-winners-2021.mdx
@@ -0,0 +1,122 @@
+---
+title: 'Holiday Hackdays Winners 2021'
+description: Celebrating many amazing projects submitted to our Holiday Hackdays Hackathon.
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: hackathon-winners/holiday-hackdays/holiday-hackdays-winners-og.png
+thumb: hackathon-winners/holiday-hackdays/holiday-hackdays-winners-og.png
+tags:
+ - community
+ - hackathon
+date: '2021-12-17'
+toc_depth: 2
+---
+
+To cool down from [our latest launch week](/blog/2021/12/15/beta-november-2021-launch-week-recap) we (virtually) [sat down with y'all](https://youtu.be/TijBVcV4jXw) and started hacking, and once again we absolutely loved your hackathon submissions and are excited to send some extremely limited swag your way!
+
+As always, it was challenging to pick the winners from all the great submissions! You can see all the amazing projects submitted on [madewithsupabase.com](https://www.madewithsupabase.com/holiday-hackdays). And now, without further ado, let's look at some of our favourites in more detail:
+
+## Best Overall Project
+
+### Winner
+
+[Swappy.one](https://github.com/zernonia/swappy-one) - by [@zernonia](https://twitter.com/zernonia)
+
+Zernonia is one of our [SupaSquad](https://supabase.com/docs/handbook/supasquad) members and continuously blows our minds with his creativity for the open-source projects he creates. For example, he's also the mastermind behind [madewithsupabase.com](https://www.madewithsupabase.com/), one of our favourite resources to see what y'all are building.
+
+Now he can add a gold tee to his collection, and we're starting to run out of swag ideas to show our appreciation! (Send us some ideas on [Twitter](https://twitter.com/supabase)!)
+
+[](https://github.com/zernonia/swappy-one)
+
+### Runner Up
+
+[Chivel](https://github.com/lalit2005/chivel) - by [@lalitcodes](https://twitter.com/lalitcodes) and [@ChapagainAshik](https://twitter.com/ChapagainAshik)
+
+Chivel is a tool to quickly generate a landing page for your YouTube channel. For example check out this snazzy page that they've generated for the Supabase channel: [supabase.chivel.tk](https://supabase.chivel.tk/)!
+
+A great idea that deserves some silver tees!
+
+[](https://github.com/lalit2005/chivel)
+
+## Best Realtime Project
+
+### Winner
+
+[rtPoll](https://github.com/emilioschepis/rtpoll) - by [@emilioschepis](https://twitter.com/emilioschepis) & brother Federico.
+
+Brothers Emilio and Federico built a platform to quickly create polls and share them around. Seeing poll results is great, but you know what's even better? Exactly, seeing poll results in realtime!
+
+[](https://github.com/emilioschepis/rtpoll)
+
+### Runner Up
+
+[e2ee-chat](https://github.com/arnu515/supabase-e2ee-chat) - by [@arnu5152](https://twitter.com/arnu5152)
+
+A chat app is a fairly obvious use case for realtime syncing, but this project caught our eye because the chat is end-to-end encrypted!
+
+[](https://github.com/arnu515/supabase-e2ee-chat)
+
+## Best Christmas Themed
+
+### Winner
+
+[Santa Banter](https://github.com/Keoooo/santa-banter) - by [@AndyKeogh](https://twitter.com/AndyKeogh)
+
+Not only do we love a good rhyme, but we also love Christmas themed jokes, so Andy's Santa Banter checks all the boxes. Head over there now to submit your best jokes!
+
+[](https://github.com/Keoooo/santa-banter)
+
+### Runner Up
+
+[Holiday Sweater](https://github.com/Morel-Tech/ugly_sweater_app) - by [@mtwichel](https://twitter.com/mtwichel)
+
+Ugly sweaters are an integral part of the Christmas Holidays. With Marcus' awesome Flutter app you can now vote on your favourite sweaters from around the globe!
+
+[](https://github.com/Morel-Tech/ugly_sweater_app)
+
+## Most Visually Pleasing
+
+### Winner
+
+[the get list](https://github.com/glowdex/wishlist) - by [@glowdexapp](https://github.com/glowdexapp)
+
+This visually stunning website allows you to create a wishlist to share with your friends so they don't need to wreck their brains for gift ideas. Here, have a look at what I want this Christmas: [thegetlist.co/list/thorwebdev](https://www.thegetlist.co/list/thorwebdev).
+
+[](https://github.com/glowdex/wishlist)
+
+### Runner Up
+
+[card creator](https://github.com/maggie-j-liu/card-creator) - by [maggie-j-liu](https://github.com/maggie-j-liu), [Arash](https://github.com/arashnrim), [@eiilla11](https://twitter.com/eiilla11), and [@_pranavnt](https://twitter.com/_pranavnt)
+
+This team of high school hackers just keeps knocking it out of the park again. In our [Hacktoberfest Hackathon](https://supabase.com/blog/2021/10/14/hacktoberfest-hackathon-winners-2021#most-spookyfun) they already made it onto the podium. This time around they built this stunning greeting card platform that lets you send well wishes to your friends around the globe in no time. We love it!
+
+[](https://youtu.be/Yx4N2bONA44)
+
+## The Prizes
+
+As is now tradition with Supabase Hackathons, the winners will receive an extremely limited edition gold medal shirt.
+
+
+
+And the runner uppers will receive the same shirt but in silver. These shirts are limited to winners of the hackathon and will never be produced again. Keep them safe like your favourite NFTs!
+
+## Hang out with us and the community
+
+If you want to join the community and build with us, find other people using Supabase, or if you just want to chill and watch people build, come and join us in Discord!
+
+[Join our Discord](https://discord.supabase.com)
+
+
+
+### Get Started Guides
+
+If you're inspired to build, check out some of the latest resources:
+
+- [Build a SaaS product with Next.js, Supabase and Stripe](https://egghead.io/courses/build-a-saas-product-with-next-js-supabase-and-stripe-61f2bc20)
+- [Supabase & Sveltekit - Build Twitter in 75 minutes](https://youtu.be/mPQyckogDYc)
+- [Supabase Auth With Next.Js 12 Middleware](https://jitsu.com/blog/supabase-nextjs-middleware#what-were-going-to-build)
+- [Vue 3 & Supabase | Workout Tracker App](https://www.youtube.com/watch?v=3tF0fGkd4ho)
+- [Use Supabase Auth with Vue.js 3](https://vueschool.io/articles/vuejs-tutorials/use-supabase-auth-with-vue-js-3/)
+- [Dynamic Jamstack with Stencil and Supabase](https://ionicframework.com/blog/dynamic-jamstack-with-stencil-and-supabase)
diff --git a/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx b/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx
new file mode 100644
index 00000000000..e78eaacbbcd
--- /dev/null
+++ b/www/_blog/2022-01-20-product-hunt-golden-kitty-awards-2021.mdx
@@ -0,0 +1,44 @@
+---
+title: 'Golden Kitty Awards Ceremony Watch Party with Supabase'
+description: Hang out with us while watching the Product Hunt Golden Kitty Awards Ceremony
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: product-hunt-golden-kitty-awards-2021.png
+thumb: product-hunt-golden-kitty-awards-2021-thumb.png
+tags:
+ - community
+date: '2022-01-20'
+toc_depth: 2
+---
+
+Last week [Supabase UI](https://ui.supabase.com/), our open-source UI component library inspired by Tailwind and AntDesign, was nominated for the Product Hunt Golden Kitty Awards.
+
+
+ — Supabase (@supabase) January 13, 2022
+
+
+Thanks to your contributions and upvotes, Supabase UI has made it to the finals, and to celebrate we'd like to invite you all to hang out with us on Discord (at least whoever manages to stay up) to watch the Awards Ceremony on Thursday Jan 27th at 9am PT (Thursday 5pm GMT, Friday 1am SG).
+
+## How to join
+
+[](https://www.producthunt.com/posts/supabase-ui)
+
+1. [Upvote Supabase UI](https://www.producthunt.com/posts/supabase-ui) (if you haven't already).
+2. Register for the [Golden Kitty Awards Ceremony 2021](https://app.experiencewelcome.com/events/rPurvb/stages/epflG6).
+3. Join us [on Discord](https://discord.supabase.com/) in the "hangout" channel.
+4. Have fun and win Product Hunt & SupaSWAG \o/
+
+Join our Discord: [discord.supabase.com](https://discord.supabase.com/)
+
+
diff --git a/www/_blog/2022-01-20-supabase-beta-december-2021.mdx b/www/_blog/2022-01-20-supabase-beta-december-2021.mdx
new file mode 100644
index 00000000000..f6aab395c74
--- /dev/null
+++ b/www/_blog/2022-01-20-supabase-beta-december-2021.mdx
@@ -0,0 +1,156 @@
+---
+title: Supabase Beta December 2021
+description: New crypto extension, Postgres videos, and a bunch of cool integrations.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: 2021-dec/release-dec-2021.png
+thumb: 2021-dec/release-dec-2021-cover.png
+tags:
+ - release-notes
+date: '2022-01-20'
+toc_depth: 3
+---
+
+Happy 2022. We're looking forward to a year of shipping product and helping our users build great things!
+
+Here's a bunch of stuff we shipped throughout December...
+
+## Hackathon Winners
+
+We had a ton of awesome projects [submitted for our Holiday Hackdays](/blog/2021/12/17/holiday-hackdays-winners-2021), all of the submissions are open source so come and check out the code for some of our top picks!
+
+[](/blog/2021/12/17/holiday-hackdays-winners-2021)
+
+## New crypto extension - pg_crypto
+
+We just added pg_sodium as an extension inside all postgres instances.
+Which means you can easily do encryption, decryption, hashing, and cryptographic signing from within your postgres functions and queries.
+Enable it from the Database > Extensions tab in the [Supabase Dashboard](https://app.supabase.io).
+
+[](https://app.supabase.io)
+
+## PostgreSQL Videos
+
+### Call Postgres functions from JavaScript with RPC
+
+Jon Meyers walks you through how to write more complex queries and logic in your database, and invoke it via the API.
+
+
+
+### Call any API using PostgreSQL functions
+
+We recently added the ability to call any external HTTP endpoint from your postgres functions. Jon shows you how!
+
+
+
+### Create PostgreSQL Functions with Supabase
+
+Triggers allow you to execute SQL in response to any table changes. Learn how to write PostgreSQL triggers with Jon!
+
+
+
+### Hiring
+
+We're Hiring - for a ton of new roles across engineering, marketing, and HR. We hire fully remotely, and you'll get to work alongside some incredible people, on one of the fastest growing open source companies. [See which roles we're hiring for](https://about.supabase.com/careers).
+
+[](https://about.supabase.com/careers)
+
+## Community
+
+There was a lot of activity this month.
+
+### Learn With Jason
+
+Let Jason and Jon show you how to build an app with Next.js and Supabase on top of Netlify!
+
+
+
+### Divjoy integration
+
+Divjoy announced their [Supabase Integration](https://divjoy.com/?database=supabase) - The React codebase generator allows you to choose your stack, choose your template, and generate your codebase.
+
+
+
+### n8n + Supabase
+
+[n8n](https://n8n.io/) added a Supabase node.
+
+
+
+### Python Upgrades
+
+The Community released a whole bunch of updated Python libs including: supabase v0.0.4 - gotrue v0.3.0 - realtime v0.0.4 - storage3 v0.1.0
+
+See the full list of [community supported libs](https://github.com/supabase-community/).
+
+[](https://github.com/supabase-community/)
+
+### Twitter
+
+We're having a 24/7*365 meme-fest on [Twitter](https://twitter.com/supabase)
+
+
+
+### TikTok
+
+Check us out on [TikTok](https://www.tiktok.com/@supabase.com?fromUrl=%2Fsupabase.com&lang=en)
+
+[](https://www.tiktok.com/@supabase.com?fromUrl=%2Fsupabase.com&lang=en)
+
+### Swag Store
+
+A reminder that we have a [Supabase Swag Store](https://store.supabase.com)
+
+[](https://store.supabase.com)
+
+### GitHub
+
+We hit 26K stars!!: [github.com/supabase/supabase](http://github.com/supabase/supabase)
+
+
+
+Source: [repository.surf/supabase](https://repository.surf/supabase)
+
+Check out some of our other community stats in our latest [Series A Blog Post](/blog/2021/10/28/supabase-series-a).
+
+## Get started
+
+- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
+- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
+- Follow us **[on Twitter](https://twitter.com/supabase)**
+- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
+- Become a **[sponsor](https://github.com/sponsors/supabase)**
diff --git a/www/_blog/2022-02-22-supabase-beta-january-2022.mdx b/www/_blog/2022-02-22-supabase-beta-january-2022.mdx
new file mode 100644
index 00000000000..f267e55d393
--- /dev/null
+++ b/www/_blog/2022-02-22-supabase-beta-january-2022.mdx
@@ -0,0 +1,207 @@
+---
+title: Supabase Beta January 2022
+description: New auth providers, SMS providers, and new videos.
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: 2022-january/thumb.jpg
+thumb: 2022-january/thumb.jpg
+tags:
+ - release-notes
+date: '2022-02-22'
+toc_depth: 3
+---
+
+This month's beta update is more stacked than the Superbowl (\*Supa-bowl) halftime show. Here’s all of the highlights from January...
+
+## New OAuth providers
+
+
+
+We’re continually amazed by how quickly new auth providers are being added into Supabase, and last month, 2 more have been added.
+
+### Notion
+
+Added by [zernonia](https://github.com/zernonia).
+You may already know him as the maintainer of [madewithsupabase.com](https://www.madewithsupabase.com/).
+
+### LinkedIn
+
+Added by [riderx](https://github.com/riderx).
+You may already be familiar with Martin from his podcast [Indie Makers](https://podcasts.apple.com/us/podcast/indie-makers/id1488437972).
+
+## New SMS providers
+
+
+
+Along with the new 0Auth providers above, last month saw the addition of two more SMS phone providers to allow you to authenticate users via an SMS OTP (One-Time Password) token.
+
+### Vonage
+
+**[Vonage](https://www.vonage.com/)** is a US-based cloud communications provider.
+Added by [devkiran](https://github.com/devkiran) (from [BoxyHQ](https://twitter.com/BoxyHQ)).
+
+### Textlocal
+
+We are now fulfilling a popular request with this Indian-compliant SMS provider, [Textlocal](https://www.textlocal.com/).
+Also added by [devkiran](https://github.com/devkiran).
+
+### Other SMS providers
+
+Just a reminder, we also support [Twilio](https://supabase.com/docs/guides/auth/auth-twilio) and [MessageBird](https://supabase.com/docs/guides/auth/auth-messagebird).
+
+On a final note, we are hiring for an [Auth Engineer](https://about.supabase.com/careers/auth-engineers).
+
+## Query logs with SQL
+
+Supabase logs are more powerful with the [newly added SQL querying](https://github.com/supabase/supabase/pull/4734).
+
+We added [timestamp filtering](https://github.com/supabase/supabase/pull/4904), and you’ll notice our usage charts have [more time spans available](https://github.com/supabase/supabase/pull/4732).
+
+We’re enabling developers to quickly diagnose issues with their projects with powerful logging and observability tools and we have a lot more to come.
+
+## GraphQL v0.1.0
+
+
+
+Last month we released [`pg_graphql`](https://github.com/supabase/pg_graphql) v0.1.0, which includes [Comment Directives](https://supabase.github.io/pg_graphql/configuration/#comment-directives).
+
+We haven’t released GraphQL onto the platform yet because we it's still under heavy development. You can expect availability in the next few months.
+
+Example
+
+```sql
+create table account(
+ id serial primary key
+);
+
+comment on table public.account is
+e'@graphql({ "name": "AccountHolder" })';
+```
+
+Result
+
+```jsx
+// Renames "Account" to "AccountHolder"
+type AccountHolder {
+ id: Int!
+}
+```
+
+## New examples
+
+### Remix Auth
+
+It’s all anyone seems to be [talking about](https://twitter.com/jkup/status/1456360115205033989). We genuinely love what [Remix](https://remix.run/) are doing, so it’s only right that we show off how Remix and Supabase work well together.
+
+Check out the new [Remix Auth example](https://github.com/supabase/supabase/tree/master/examples/remix-auth), and let us know what you think.
+
+### Expo Todo List
+
+Our React Native example has been correctly updated to be an Expo example.
+[Check it out here](https://github.com/supabase/supabase/tree/master/examples/expo-todo-list).
+
+## Video: API requests with Function Hooks
+
+There's no stopping [Jon Meyers](https://jonmeyers.io/videos)! He’s back with an in-depth video on how to easily [automate API requests](https://www.youtube.com/watch?v=codAs9-NeHM&feature=emb_title) using our very own Function Hooks.
+
+You'll learn how to listen to _any_ database change, then send those changes [in a payload](https://supabase.com/blog/2021/07/30/supabase-functions-updates#hook-payload) via HTTP request.
+
+
+
+## Set your own support ticket priority
+
+
+As with any platform, there can be the occasional glitch.
+
+The Supabase Dashboard includes a dedicated support form that goes straight to our support inbox. This support form includes your project information and,
+since we all want to see your issues solved, we thought it would make sense that _you_ could set the priority of your support tickets.
+
+This change has drastically improved response times for urgent support tickets.
+The form includes extra “urgent” levels for the PRO and Pay As You Go projects.
+
+And, as part of our continued commitment to Support, we are hiring [Support Engineers](https://about.supabase.com/careers/support-and-qa).
+
+## Community
+
+As always, the community has been amazing during the month of February.
+
+### Supabase + Snaplet
+
+Are you maintaining multiple environments? Snaplet helps you copy a production database and clone it into different environments.
+
+Check out the [Supabase clone environments](https://docs.snaplet.dev/tutorials/supabase-clone-environments) tutorial on the Snaplet docs.
+
+
+
+### Supabase + Retool
+
+Retool has put together a brilliant 10 minute admin panel setup using Supabase with Retool.
+
+
+
+### Learn with Jason
+
+Jason Lengstorf caught up with our very own [Jon Meyers](https://jonmeyers.io/) on his awesome show, [Learn with Jason](https://www.youtube.com/watch?v=8vqY1KT4TLU), to talk about building an app [with Supabase and NextJS](https://supabase.com/docs/guides/with-nextjs).
+
+
+
+### New article highlights
+
+- Arctype published a new guide showing how to connect to your Supabase database. [Link](https://arctype.com/postgres/connect/supabase-postgres)
+- Marmalabs built a Supabase adapter for react-admin, the frontend framework for building admin applications on top of REST/GraphQL services. [Link](https://github.com/marmelab/ra-supabase)
+- HotGlue created a guide showing how easy it is to integrate Salesforce and Supabase. [Link](https://www.notion.so/Supabase-and-hotglue-article-9e7f5583d27c419490ee7d536d6d269d)
+
+### PostgREST
+
+One of Supabase’s key tools that allow a lot of our functionality has had some updates.
+
+- `pg_listen` was removed in favor of PostgREST’s built-in schema reloading.
+- PostgREST database connection pool size gets scaled with instance size for better performance for certain workload shapes.
+
+## Coming Next: Launch Week IV
+
+Preparation for Launch Week 4 is underway!
+
+Of course, we can’t tell you what will happen (perhaps because we don’t know ourselves yet), but you can always speculate in the community [Discord server](https://discord.supabase.com/), or even [tweet us your predictions](https://twitter.com/supabase).
+
+## Get started
+
+- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
+- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
+- Follow us **[on Twitter](https://twitter.com/supabase)**
+- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
+- Become a **[sponsor](https://github.com/sponsors/supabase)**
diff --git a/www/_blog/2022-03-08-audit.mdx b/www/_blog/2022-03-08-audit.mdx
new file mode 100644
index 00000000000..f067d7f8df5
--- /dev/null
+++ b/www/_blog/2022-03-08-audit.mdx
@@ -0,0 +1,356 @@
+---
+title: Postgres Auditing in 150 lines of SQL
+description: PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL.
+author: oli_rice
+author_url: https://github.com/olirice
+author_image_url: https://github.com/olirice.png
+authorURL: https://github.com/olirice
+image: supa-audit/postgres_auditing_in_150_lines_of_SQL.png
+thumb: supa-audit/postgres_auditing_in_150_lines_of_SQL.png
+tags:
+ - postgres
+date: '2022-03-08'
+toc_depth: 3
+---
+
+Data auditing is a system that tracks changes to tables' contents over time.
+PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL.
+
+Auditing is particularly useful for historical analysis. To demonstrate, imagine you have a `users` table that tracks when a user is online.
+You might add a `status` column which can have one of two values: `online` and `offline`. How would you track how long a user is online for throughout an entire month?
+An auditing system would track every change with timestamps, and so you can measure the difference between each timestamp and sum them up for the entire month.
+
+The goals of our auditing solution are:
+
+- low maintenance
+- easy to use
+- fast to query
+
+To demonstrate what we're working towards, the following example shows what we'll have at the end of the blog post:
+
+```sql
+-- create a table
+create table public.members(
+ id int primary key,
+ name text not null
+);
+
+-- Enable auditing on the new table
+select audit.enable_tracking('public.members');
+```
+
+Produce some records to audit
+
+```sql
+-- create a new record
+insert into public.members(id, name) values (1, 'foo');
+
+-- edit the record
+update public.members set name = 'bar' where id = 1;
+
+-- delete the record
+delete from public.members;
+```
+
+Review the audit log
+
+```sql
+select * from audit.record_history
+```
+
+```markdown
+id | record_id | old_record_id | op | ts | table_oid | table_schema | table_name | record | old_record
+----+--------------------------------------+--------------------------------------+--------+-------------------------------------+-----------+--------------+------------+--------------------------+--------------------------
+2 | 1ecd5ff0-1b6b-5bc2-ad80-1cb19769c081 | | INSERT | Mon Feb 28 18:13:52.698511 2022 PST | 16452 | public | members | {"id": 1, "name": "foo"} |
+3 | 1ecd5ff0-1b6b-5bc2-ad80-1cb19769c081 | 1ecd5ff0-1b6b-5bc2-ad80-1cb19769c081 | UPDATE | Mon Feb 28 18:13:52.698511 2022 PST | 16452 | public | members | {"id": 1, "name": "bar"} | {"id": 1, "name": "foo"}
+4 | | 1ecd5ff0-1b6b-5bc2-ad80-1cb19769c081 | DELETE | Mon Feb 28 18:13:52.698511 2022 PST | 16452 | public | members | | {"id": 1, "name": "bar"}
+(3 rows)
+```
+
+Notice that our `record_id` and `old_record_id` stayed constant as we updated the row so we can easily query for a single row's history over time!
+
+## Lets get building
+
+### Namespace
+
+To quote a tenet from [the zen of python](https://www.python.org/dev/peps/pep-0020/):
+
+> Namespaces are one honking great idea -- let's do more of those!
+
+So first things first, we'll create a separate schema named `audit` to house our auditing entities.
+
+```sql
+create schema if not exists audit;
+```
+
+### Storage
+
+Next, we need a table to track inserts, updates and deletes.
+
+Classically, an audit table's schema mirrors the table being audited and appends some metadata columns like the commit's timestamp. That solution has a few maintenance challenges:
+
+- enabling auditing on a table requires a database migration
+- when the source table's schema changes, the audit table's schema must also change
+
+So instead, we'll lean on PostgreSQL's schema-less [`JSONB` data type](https://www.postgresql.org/docs/current/datatype-json.html) to store each record's data in a single column.
+That approach has the added benefit of allowing us to store multiple tables' audit history in a single audit table.
+
+```sql
+create table audit.record_version(
+ id bigserial primary key,
+ -- auditing metadata
+ record_id uuid, -- identifies a new record by it's table + primary key
+ old_record_id uuid, -- ^
+ op varchar(8) not null, -- INSERT/UPDATE/DELETE/TRUNCATE
+ ts timestamptz not null default now(),
+ -- table identifiers
+ table_oid oid not null, -- pg internal id for a table
+ table_schema name not null, -- audited table's schema name e.g. 'public'
+ table_name name not null, -- audited table's table name e.g. 'account'
+ -- record data
+ record jsonb, -- contents of the new record
+ old_record jsonb -- previous record contents (for UPDATE/DELETE)
+);
+```
+
+
+ Postgres version compatibility
+
+ The table above uses PostgreSQL's built-in{' '}
+ uuid functionality , which
+ is available from version 14. For backwards compatibility you can use the uuid-ossp extension.
+
+
+ create extension if not exists "uuid-ossp";
+
+
+
+### Query Patterns
+
+An audit log doesn't do us much good if its too slow to query! There are 2 query patterns we think are table stakes (😉) for an audit system:
+
+**Changes to a Table in a Time Range**
+
+For time slices, we need an index on the `ts` column. Since the table is append-only and the `ts` column is populated by insertion date, our values for `ts` are naturally in ascending order.
+
+PostgreSQL's builtin [BRIN index](https://www.postgresql.org/docs/current/brin-intro.html) can leverage that correlation between value and physical location to produce an index that, at scale, is many hundreds of times smaller than the default (BTREE index) with faster lookup times.
+
+```sql
+-- index ts for time range filtering
+create index record_version_ts
+ on audit.record_version
+ using brin(ts);
+```
+
+For table filtering, we've included a `table_oid` column which tracks PostgreSQL's internal numeric table identifier. We can add an index to this column instead of the `table_schema` and `table_name` columns, minimizing the index size and offering better performance.
+
+```sql
+-- index table_oid for table filtering
+create index record_version_table_oid
+ on audit.record_version
+ using btree(table_oid);
+```
+
+**Changes to a Record Over Time**
+
+One of the downsides to storing each row's data as `jsonb` is that filtering based on a column's value becomes very inefficient. If we want to look up a row's history quickly, we need to extract and index a unique identifier for each row.
+
+For the globally unique identifier, we'll use the following structure
+
+```
+[table_oid, primary_key_value_1, primary_key_value_2, ...]
+```
+
+and hash that array as a UUID v5 to get an efficiently indexable UUID type to identify the row that is robust to data changes.
+
+We'll use one utility function to lookup a record's primary key column names:
+
+```sql
+create or replace function audit.primary_key_columns(entity_oid oid)
+ returns text[]
+ stable
+ security definer
+ language sql
+as $$
+ -- Looks up the names of a table's primary key columns
+ select
+ coalesce(
+ array_agg(pa.attname::text order by pa.attnum),
+ array[]::text[]
+ ) column_names
+ from
+ pg_index pi
+ join pg_attribute pa
+ on pi.indrelid = pa.attrelid
+ and pa.attnum = any(pi.indkey)
+ where
+ indrelid = $1
+ and indisprimary
+$$;
+```
+
+and another to consume the `table_oid` and primary key, converting the result into the record's UUID.
+
+```sql
+create or replace function audit.to_record_id(
+ entity_oid oid,
+ pkey_cols text[],
+ rec jsonb
+)
+ returns uuid
+ stable
+ language sql
+as $$
+ select
+ case
+ when rec is null then null
+ -- if no primary key exists, use a random uuid
+ when pkey_cols = array[]::text[] then uuid_generate_v4()
+ else (
+ select
+ uuid_generate_v5(
+ 'fd62bc3d-8d6e-43c2-919c-802ba3762271',
+ (
+ jsonb_build_array(to_jsonb($1))
+ || jsonb_agg($3 ->> key_)
+ )::text
+ )
+ from
+ unnest($2) x(key_)
+ )
+ end
+$$;
+```
+
+Finally, we index the `record_id` and `old_record_id` columns that contain these unique identifiers for fast querying.
+
+```sql
+-- index record_id for fast searching
+create index record_version_record_id
+ on audit.record_version(record_id)
+ where record_id is not null;
+
+-- index old_record_id for fast searching
+create index record_version_old_record_id
+ on audit.record_version(record_id)
+ where old_record_id is not null;
+```
+
+### Enrollment
+
+Okay, so we have a home for our audit data that we're confident it can be queried efficiently. Now how do we populate it?
+
+We need the audit table to populate without end-users making any changes to their transactions. So we'll set up a [trigger](https://www.postgresql.org/docs/current/sql-createtrigger.html) to fire when the data changes. In this case, we'll fire the trigger once for every inserted/updated/deleted row.
+
+```sql
+create or replace function audit.insert_update_delete_trigger()
+ returns trigger
+ security definer
+ language plpgsql
+as $$
+declare
+ pkey_cols text[] = audit.primary_key_columns(TG_RELID);
+ record_jsonb jsonb = to_jsonb(new);
+ record_id uuid = audit.to_record_id(TG_RELID, pkey_cols, record_jsonb);
+ old_record_jsonb jsonb = to_jsonb(old);
+ old_record_id uuid = audit.to_record_id(TG_RELID, pkey_cols, old_record_jsonb);
+begin
+
+ insert into audit.record_version(
+ record_id,
+ old_record_id,
+ op,
+ table_oid,
+ table_schema,
+ table_name,
+ record,
+ old_record
+ )
+ select
+ record_id,
+ old_record_id,
+ TG_OP,
+ TG_RELID,
+ TG_TABLE_SCHEMA,
+ TG_TABLE_NAME,
+ record_jsonb,
+ old_record_jsonb;
+
+ return coalesce(new, old);
+end;
+$$;
+```
+
+## Public API
+
+Finally, we'll wrap up the trigger creation and removal process behind a clean, idempotent, user facing API.
+
+The API we'll expose for enabling auditing on a table is
+
+```sql
+select audit.enable_tracking('.'::regclass);
+```
+
+and for disabling tracking
+
+```sql
+select audit.disable_tracking('.'::regclass);
+```
+
+Under the hood, those functions register our auditing trigger against the requested table.
+
+```sql
+create or replace function audit.enable_tracking(regclass)
+ returns void
+ volatile
+ security definer
+ language plpgsql
+as $$
+declare
+ statement_row text = format('
+ create trigger audit_i_u_d
+ before insert or update or delete
+ on %I
+ for each row
+ execute procedure audit.insert_update_delete_trigger();',
+ $1
+ );
+
+ pkey_cols text[] = audit.primary_key_columns($1);
+begin
+ if pkey_cols = array[]::text[] then
+ raise exception 'Table % can not be audited because it has no primary key', $1;
+ end if;
+
+ if not exists(select 1 from pg_trigger where tgrelid = $1 and tgname = 'audit_i_u_d') then
+ execute statement_row;
+ end if;
+end;
+$$;
+
+create or replace function audit.disable_tracking(regclass)
+ returns void
+ volatile
+ security definer
+ language plpgsql
+as $$
+declare
+ statement_row text = format(
+ 'drop trigger if exists audit_i_u_d on %I;',
+ $1
+ );
+begin
+ execute statement_row;
+end;
+$$;
+```
+
+And we're done with 2 lines of code to spare!
+
+### Performance
+
+Auditing tables always reduces throughput of inserts, updates, and deletes. In cases where throughput is less than 1000 writes per second the overhead is typically negligible. For tables with a higher write frequency, consider logging changes outside of SQL with a tool like [pgAudit](https://www.pgaudit.org/).
+
+### Do I really expect you to copy/paste all that?
+
+Nope, for a turnkey solution to auditing in PostgreSQL, we've packaged this script into an extension with some extra goodies like `TRUNCATE` support. Check it out at https://github.com/supabase/supa_audit.
diff --git a/www/_blog/2022-03-25-should-i-open-source-my-company.mdx b/www/_blog/2022-03-25-should-i-open-source-my-company.mdx
new file mode 100644
index 00000000000..4cd07fccb99
--- /dev/null
+++ b/www/_blog/2022-03-25-should-i-open-source-my-company.mdx
@@ -0,0 +1,122 @@
+---
+title: 'Should I Open Source my Company?'
+description: The unexpected upsides of building in public
+author: ant_wilson
+author_url: https://github.com/awalias
+author_image_url: https://github.com/awalias.png
+authorURL: https://github.com/awalias
+image: open-source/open-source-thumb.png
+thumb: open-source/open-source-thumb.png
+tags:
+ - open-source
+ - community
+ - supabase
+ - hiring
+date: '2022-03-25'
+toc_depth: 3
+---
+
+Supabase has been open source from day one. This is one of the best decisions we've made. It didn't feel like a difficult decision at the time, since [kiwicopple](http://github.com/kiwicopple) and I are long time users and advocates of great open projects like PostgreSQL, Python, Bitcoin, React, [... insert long list]. Open-sourcing Supabase ended up surprising us in many ways. Many people imagine that maintaining your business in public might be burdensome - but the opposite is true. There are many unexpected upsides that have made building Supabase - the product and the company - easier.
+
+While some of this advice comes from our lens as a Dev Tools or PaaS company, most of it will apply to any software company.
+
+When we discuss open source business models with other founders, there are three complaints that come up again and again. These are:
+
+- People might criticize my messy/bad/unfinished code
+- Hackers will find and exploit security holes
+- Competitors will steal my Intellectual Property
+
+We'll cover each of these in detail and follow up with some of the surprising benefits we discovered building Supabase, namely how open source:
+
+- Solves your dev talent problem
+- Improves your product (massively)
+- Will carry us to Utopia
+
+Let's dive in.
+
+## But my code is bad
+
+This is just ego. The person who spends the most time thinking about you is you, and the person who spends the most time stressing over your bad code is you as well. If someone else is spending time stressing over your bad or messy code, then it's likely you've hit upon something worth pursuing. The folk story of the [Stone Soup](https://en.wikipedia.org/wiki/Stone_Soup) applies here. If you share good ideas with the community they will adopt and improve on them with you. The community will help refactor and replace any bad code, and they might even introduce new code quality guidelines to your project, improving the process for everyone who comes after. Toxic community members who complain about bad code instead of making suggestions to improve it are not the people you want in your community anyway.
+
+All open source contributors have a graveyard of old projects. What's cool about this is that people looking to build something similar have a library of ideas and approaches to learn from. They may take inspiration from your approach to certain problems. At the very least, they won't be wasting time making your same mistakes. Don't worry about old projects ruining your reputation. At best people will find them useful. At worse they won't get noticed anyway.
+
+
+
+## Getting to secure
+
+One of the biggest fears running a hosted solution where the code is publicly available is malicious actors will read your code, discover exploits, and hack your services. In our experience, [Linus's law](https://en.wikipedia.org/wiki/Linus%27s_law) of "given enough eyeballs, all bugs are shallow" also applies to security issues. Since the very early days of Supabase we have had (often anonymous) security researchers active in our code and platform, helping us find potential issues. If you're offering a software as a service, make simple instructions available at [/.well-known/security.txt](https://supabase.com/.well-known/security.txt) to let the good guys know how to disclose potential issues to you.
+
+The premier example of how open source projects can be more secure than proprietary code bases is Bitcoin. In [his 2015 talk](https://www.youtube.com/watch?v=810aKcfM__Q) Andreas M. Antonopoulos describes how closed source banking systems have the software equivalent of weak immune systems, because huge security holes can be obfuscated for long periods of time, and when eventually exploited can have enormous detrimental effects. On the flip side of this is an open source protocol like Bitcoin, where any security holes are there for all to see. Exploits are found early and often, and then patched. Remember that successful software companies can take more than a decade to build. Over a long time period, open source systems will tend towards a more secure state over secretive, proprietary systems, especially in a time when hiring talented security engineers is extremely competitive.
+
+
+
+## Beating the competition
+
+In software ideas are cheap. Value is almost always created in execution of ideas. When you share your ideas with the world, it frees up your brain to focus on things that matter most. Instead of spending time worrying about which contractors or partners have access to your code base, you can focus on iterating faster. You'll probably be surprised how the open source community responds to your openness.
+
+### Grow a community of experts
+
+In order to build a successful company, you'll have to execute well and grow your customer base over a long period of time, let's say 10 years. In this Ultra Marathon, any advantages gained by competitors peeking at your code base are unlikely to be material over that 10 year period. It's likely that you'll have to iterate on, and refactor your code base many times over during that period. Building a team and a community that is the best in the world at iterating on *your* solution is how you will win in the long term.
+
+### Winning in the market
+
+If you're in a market with a huge (and growing) TAM, that is *really* worth pursuing, it's unlikely to be a winner takes all situation. The first lesson is to find a segment of users you can “wow” and then iterate like crazy. Every second you focus on your competitors is time you could be focused on improving your product or your team. If a competitor forks your open source project, and is able to out-ship you, then I would argue that you were bound to lose that particular race anyway.
+
+On top of all this, IP and patents in software are notoriously difficult to enforce. It will save you time, money, and mental energy if you're not worrying about trying to protect your software ideas with lawyers. You can protect your business much better by becoming the best in the world at implementing your software ideas.
+
+
+
+### Late stage
+
+Once your project reaches significant scale, you might find yourself in a situation like Elastic, or Mongo, where large cloud providers are offering your product with a superior distribution model.
+
+Firstly, if you're just starting out, the biggest problem facing you right now is getting to that point. If you become so successful that AWS is deciding to take resources away from one of it's many billion dollar product lines to compete with you in hosting your product, you're doing something *very* right.
+
+Secondly, and more constructively, you should prepare for this eventuality by finding areas where you can outcompete anyone. Most cloud providers are notoriously bad at Developer Experience for example, so take advantage of that and make DX one of your core competencies. If after 6 years, Google tries to steal your lunch, you should have a brand, a team, and a community, that have spent the last few years preparing for a David versus Goliath-type fight. Make sure you're not blindsided by something like this by planning for it from the beginning. You have enough time and focus on your side to construct a winning strategy.
+
+### Stop worrying
+
+In general if a competitor is looking to you for ideas, then good luck to them. They'll always be a step behind you, and expending more energy than you are by worrying about their competition. Especially in the early stages, when resource is scarce.
+
+---
+
+Now that we've addressed some of the common objections, let's move on to some of the surprising benefits.
+
+## Hiring developers
+
+One of the biggest complaints of startups - no matter the size - is how hard it is to hire developers. Sourcing is hard, assessing developers is hard, convincing them of the quality of their future colleagues is hard. Being open source can solve your developer hiring problems!
+
+### Sourcing openly
+
+All developers benefit from open-source, and many developers look to pay those benefits forward by contributing to open source projects they find interesting. Maybe they contribute because of a good community, maybe they're trying to learn a new technology, or enjoy solving hard technical problems in new and novel codebases. If you lower the barriers to contribute code to your open source project, there's a good chance great developers will find your project. They might contribute in issue discussions, solve bugs, identify problems, or review PRs. Every contributor may not be open to work, but many will be attracted by the prospect of working on open source code as part of their full time gig. It's a huge advantage open source companies have over closed sourced ones. At Supabase we didn't start doing outbound recruitment until after we already hired 32 developers, and been operating for more than 2 years. Open source has been, and will continue to be, our primary source of finding new (and incredible) talent. Being a remote and async company, we find having an open source hiring strategy means candidates are self selecting for these skills, which makes our job of screening for them much easier.
+
+
+
+### No, I won't take home your take home test
+
+One of the biggest complaints developers make while looking for their next gig is having to solve LeetCode problems or do take-home tests in the interview process. They are time-consuming, arduous, and often don't represent the type of work they'll be doing on the job. However, if someone contributes to your repo you already have:
+
+- examples of how the person communicates with team/community members asynchronously and in a remote setting.
+- examples of *real world* code contribution.
+
+And the candidate gets to see all this from the company side as well! Does this team value code quality? Do they communicate effectively? Do they make good technical decisions?
+
+People who have been hired at Supabase through our repos have made themselves indispensable. Many of them drove the development of existing repos, and even started new client libraries and SDKs. And not one of them were ever required to solve a LeetCode problem over Zoom.
+
+## But does it integrate with Excel?
+
+When building a startup, you might find that you only really have the time to solve your biggest problems. In order to move fast, you need to focus on what 80% of the user base is asking for. The features requested by the minority are prone to getting indefinitely shunted. When your systems are open source however, these users have the ability to contribute the features themselves, expanding the usefulness of your software - sometimes to new use cases that you didn't even know existed. This happens most often with integrations and adaptors. Users might want an Azure or Vercel integration, and if someone else can provide the development resources to make those connections, then everyone using your project benefits as a result.
+
+## It's 2022. Where are the flying cars?
+
+In a world with no open source, technology companies everywhere are re-inventing the wheel, on loop... forever. To combat this at Supabase, we don't just open source our new projects. We always try to support existing open source projects, before inventing new ones.
+
+Think about each of the automotive companies today. Writing proprietary functions, to build proprietary UI elements, on proprietary windowing libraries, running inside proprietary operating systems, using proprietary drivers, to display an error message that you'll probably never see! What a waste of developer time and effort!
+
+I won't evangelize too much here... I think this meme summarizes my feelings on the subject...
+
+
+
+## More evidence please
+
+Next week is Supabase Launch Week. It's the culmination of everything the team and community have spent the last 3 months working on. If you're not convinced by my arguments above, I believe the rate at which the Supabase community is progressing, in such a short time, speaks to all the benefits of running an open source company. See the [Launch Week 4 post](/blog/2022/03/25/supabase-launch-week-four) for all the details. And visit [our GitHub](https://github.com/supabase) if you want to get involved.
diff --git a/www/_blog/2022-03-25-supabase-launch-week-four.mdx b/www/_blog/2022-03-25-supabase-launch-week-four.mdx
new file mode 100644
index 00000000000..d195270a60c
--- /dev/null
+++ b/www/_blog/2022-03-25-supabase-launch-week-four.mdx
@@ -0,0 +1,178 @@
+---
+title: 'Supabase Launch Week IV'
+description: 'Launch Week 4: One new feature every day for an entire week. Starting Monday 28th March.'
+author: paul_copplestone
+author_url: https://github.com/kiwicopple
+author_image_url: https://github.com/kiwicopple.png
+authorURL: https://github.com/kiwicopple
+image: launch-week-4/friday-before/launchweek-4-promo-cal.png
+thumb: launch-week-4/friday-before/launchweek-4-promo.png
+tags:
+ - launch-week
+date: '2022-03-25'
+toc_depth: 2
+---
+
+By now you probably know the drill. Supabase Launch Week: we launch one thing, or sometimes a couple,
+every day for an entire week.
+
+If this is your first Launch Week, check out our previous Launch Weeks for a taste of what's to come:
+
+- [Launch Week I](/blog/2021/03/25/launch-week)
+- [Launch Week II: The SQL](/blog/2021/07/22/supabase-launch-week-sql)
+- [Launch Week III: The Trilogy](/blog/2021/11/26/supabase-launch-week-the-trilogy)
+
+## What to expect
+
+Launch Week Four has something for everybody.
+
+We don't want to spoil the surprise, so for now we'll give you a teaser for each day.
+Come back each day to see what we launch, or follow us on twitter ([@supabase](https://twitter.com/supabase))
+to keep updated by following the hashtag [#SupaLaunchWeek](https://twitter.com/hashtag/SupaLaunchWeek).
+
+## Pre-launch party
+
+Watch us as we kick off Launch Week, shipping this blog post.
+
+
+
+## Monday: Community Day
+
+
+
+### What?
+
+All for one, and one for all. It has become a tradition to kick off Launch Week with Community Day -
+a day where we shine a spotlight on some of the the open source tools that we use and community contributions.
+This Community Day is going to be our biggest one yet.
+Have a look at the [#SupaLaunchWeek hashtag on Twitter](https://twitter.com/hashtag/SupaLaunchWeek?src=hashtag_click)
+to see some of the awesome guests that will be joining us.
+
+[Launch Week IV: Community Day.](/blog/2022/03/28/community-day)
+
+### When?
+
+Monday 28 March 2022: 9am PT
+
+### Where?
+
+- Read the [blogpost](/blog/2022/03/28/community-day).
+- Listen back to the [Twitter Spaces](https://twitter.com/i/spaces/1mnxedEZzVPJX).
+- Watch the [recording](https://youtu.be/D0gIgjozOzc).
+
+## Tuesday: Something for the Frontend team
+
+
+
+### What?
+
+If Postgres could talk it would sing “I am the WALRUS ”.
+Since last Launch Week we've been busy shipping. Tune in on Tuesday to learn about a brand new way to fetch your data.
+
+[GraphQL is now available in Supabase!](/blog/2022/03/29/graphql-now-available)
+
+### When?
+
+Tuesday 29 March 2022: 9am PT
+
+### Where?
+
+- Read the [blog post](/blog/2022/03/29/graphql-now-available).
+- Listen back to the [Twitter Spaces](https://twitter.com/i/spaces/1dRKZlAQPaVJB).
+- Watch live on [YouTube](https://youtu.be/fApxu_U_hdw).
+
+## Wednesday: Something for the Enterprise
+
+
+
+### What?
+
+Tune in to ~~Channel~~ Launch Week Four News updates to hear about some classy Enterprise updates.
+100% of the time, it works every time.
+
+[Introducing Supabase Enterprise](/blog/2022/03/30/supabase-enterprise).
+
+### When?
+
+Wednesday 30 March 2022: 9am PT
+
+### Where?
+
+- Read the [blog post](/blog/2022/03/30/supabase-enterprise).
+- Listen back to the [Twitter Spaces](https://twitter.com/i/spaces/1dRKZlAdaawJB).
+- Watch live on [YouTube](https://youtu.be/UZrl1cwzTDg).
+
+## Thursday: Something for the Fullstack team
+
+
+
+### What?
+
+This one's gonna be hotter than the Human Torch 🔥, more scalable than Mister Fantastic, more rock solid than The Thing,~
+~and the latency will be harder to find than Invisible Woman.
+
+[Edge Functions are now available in Supabase](/blog/2022/03/31/supabase-edge-functions)
+
+### When?
+
+Wednesday 31 March 2022: 9am PT
+
+### Where?
+
+- Read the [blog post](/blog/2022/03/31/supabase-edge-functions).
+- Listen back to the [Twitter Spaces](https://twitter.com/i/spaces/1dRKZlAdaawJB).
+- Watch live on [YouTube](https://youtu.be/fApxu_U_hdw).
+
+## Friday: Something for everybody
+
+
+
+### What?
+
+Absolutely, definitely not an April Fool's joke. Friday is reserved for “one more thing(s)” -
+a secret announcement of some sort. There's always too much to ship in a week, so let's be honest -
+it's never really just _one_ more thing.
+
+
+### When?
+
+Friday 1 April 2022: 9am PT
+
+### Where?
+
+- [Supabrew - Never Code Thirsty](/blog/2022/04/01/supabrew)
+- [Supabase Realtime, with Multiplayer Features](/blog/2022/04/01/supabase-realtime-with-multiplayer-features)
+
+
+## Wrap-up Hackathon: Bring the func(🕺)
+
+
+
+### What
+
+Finally, we're continuing our tradition of wrapping up Launch Week by rolling into a 10-day virtual Hackathon.
+As always, you'll have the chance to win extremely limited Supabase Swag,
+and you'll be able to play around with the new features we're about to launch.
+
+We're also delighted to be partnering with [the future forest company](https://thefutureforestcompany.com/)
+to plant a tree for every project that is being submitted for the Hackathon.
+So let's build some cool open-source projects and a forest at the same time!
+
+### When
+
+Friday 1 April 2022: 9:00am PT - Sunday 9 April 11:59pm PT
+
+### Where
+
+We're extremely excited to see what you'll build and can't wait to dive into your submissions on
+[madewithsupabase.com](https://www.madewithsupabase.com/).
+
+Check out the blog post - [Hackathon: Bring the Func](/blog/2022/04/01/hackathon-bring-the-func).
diff --git a/www/_blog/2022-03-28-community-day.mdx b/www/_blog/2022-03-28-community-day.mdx
new file mode 100644
index 00000000000..58cecc1cf79
--- /dev/null
+++ b/www/_blog/2022-03-28-community-day.mdx
@@ -0,0 +1,227 @@
+---
+title: 'Community Day'
+description: Kicking off Launch Week IV with contributors, partners, and friends.
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: launch-week-4/community-day/community-day-thumb.png
+thumb: launch-week-4/community-day/community-day-thumb.png
+tags:
+ - launch-week
+ - community
+date: '2022-03-28'
+toc_depth: 3
+---
+
+Supabase combines existing open-source tools with our own open-source contributions to provide a delightful experience for all developers. As part of this, we’re building a community of communities, bringing together developers from many different backgrounds, as well as new developers looking to get involved with open source.
+
+To kick off launch week, as it is now tradition, we’re showcasing some of the communities and contributors that make up the Supabase community, highlighting their awesome work, and celebrating everyone who contributes their time to the Supabase mission. 💚
+
+## Launch Week IV - what to expect
+
+Supabase Launch Week was born out of [YC Demo Day](https://www.ycombinator.com/demoday), a looming deadline towards the end of each Y Combinator batch. A deadline that forces you to deliver a lot of complex functionality in a short amount of time.
+
+With Launch Week, we replicate Demo Day conditions, but for a whole week! This is the secret formula that works for us:
+
+- The Friday before, we publish a blog post about a topic of interest (e.g. [How we launch at Supabase](https://supabase.com/blog/2021/11/26/supabase-how-we-launch), or this time around we [explore whether you should open source your company](https://supabase.com/blog/2022/03/25/should-i-open-source-my-company) — hint: we think you most likely should!) as well as an [overview blogpost](https://supabase.com/blog/2022/03/25/supabase-launch-week-four) with tons of memes and hints to what we’re shipping each day.
+- Monday is Community Day, where we rally many of the awesome contributors and partners together and showcase awesome things around Supabase and open-source. This is also the time to watch out for the [#SupaLaunchWeek hashtag on Twitter](https://twitter.com/hashtag/SupaLaunchWeek?src=hashtag_click) as we arm our guest speakers, [Angels](https://supabase.com/blog/2021/03/25/angels-of-supabase), and [SupaSquad](https://supabase.com/docs/handbook/supasquad) with free swag codes.
+- Tuesday, Wednesday, and Thursday are the big feature launches.
+- Friday has become the feature kitchen sink, as we ship too many things to fit into one week. It’s our “One more thing(s)” day.
+- And last but not least, coming out of Launch Week, we roll into a 10 day virtual hackathon with the community submitting tons of awesome projects to [madewithsupabase.com](https://www.madewithsupabase.com/), which, once upon a time, was a hackathon project itself. I know, quite the inception kinda stuff - so cool!
+
+We repeat this roughly on a quarterly cadence, and I’ll tell ya, it becomes positively addictive. So strap in, and join us for a week of Fun(🕺).
+
+## Supabase is now a GitHub secret scanning partner
+
+
+
+GitHub secret scanning protects users by searching repositories for known types of secrets. By identifying and flagging these secrets, GitHub’s scans help prevent data leaks and fraud.
+
+[We have partnered with GitHub](https://github.blog/changelog/2022-03-28-supabase-is-now-a-github-secret-scanning-partner/) to scan for Supabase service role API keys, which allow full access to the database. If they detect any keys with `service_role` privileges being pushed to GitHub, they will forward the API key to us, so that we can automatically revoke the detected secrets and notify you - protecting your data against malicious actors.
+
+## PostgREST 10 Pre-Release
+
+
+
+PostgREST v10 is not wrapped up yet, however a pre-release with the [latest features and fixes](https://postgrest.org/en/latest/releases/latest.html) is already available for Supabase users. v10 is mostly focused on improving availability and includes improvements to the API (and therefore [supabase-js](https://github.com/supabase/supabase-js)) too.
+
+### Composite Types fields and Array Type elements
+
+In prior versions, [computed columns](https://github.com/supabase/supabase/discussions/2825#discussioncomment-1167121) were required to access composite types fields or
+array elements. This is no longer the case. You can now use the usual arrow operators (`->`) to do this. Assuming you have:
+
+```sql
+create type full_name as (
+ first_name text,
+ middle_names text[],
+ first_surname text,
+ second_surname text,
+ reign_name text
+);
+
+create table famous_people (
+ name full_name,
+ occupation text
+);
+```
+
+You can query for the `full_name` fields and just an element of its `middle_names` array with:
+
+```jsx
+const { data, error } = await supabase
+ .from('users')
+ .select(
+ `
+ name->first_name,
+ name->middle_names->0,
+ name->first_surname,
+ occupation`
+ )
+ .eq('name->reign_name', 'Edward VIII')
+
+console.log(data)
+// {
+// "first_name": "Edward",
+// "middle_names": "Albert",
+// "first_surname": "David",
+// "occupation": "King of the United Kingdom"
+// }
+```
+
+### Improved error messages
+
+For better typing, PostgREST is committing to a standard form for all its errors. It follows the PostgreSQL format with the `message`, `detail`, `hint` and `code` fields, these will always show (with `null` as a default) in every error response. For more details you can check the [Errors page](https://postgrest.org/en/latest/errors.html).
+
+### Improved availability
+
+Linux's [EMFILE](https://blog.izs.me/2013/07/wtf-is-emfile-and-why-does-it-happen-to-me/) ("Too many open files") affected PostgREST when it was under heavy load,
+sometimes making it unresponsive and in need of a manual restart. This is no longer the case and it will now recover from EMFILE.
+
+Additionally, PostgREST now has [liveness and readiness checks](https://postgrest.org/en/latest/admin.html#health-check) which allows the Supabase infrastructure team to check its state to help it recover if necessary.
+
+### Upcoming
+
+When finished, PostgREST v10 will also include the ability to `limit` updates and deletes affected rows plus some other goodies for mutations.
+
+## Auth updates
+
+### New OAuth providers
+
+
+
+The beauty of open source is that anyone can contribute to make the project even better. This is especially true for supabase-auth as we get contributions and ideas for new oauth providers every month! This launch week, we’ve had 4 new OAuth provider contributions:
+
+- [Keycloak](https://supabase.com/docs/guides/auth/auth-keycloak) ([@fspijkerman](https://github.com/fspijkerman))
+- [Notion](https://supabase.com/docs/guides/auth/auth-notion) ([@zernonia](https://github.com/zernonia))
+- [Zoom](https://supabase.com/docs/guides/auth/auth-zoom) ([@devkiran](https://github.com/devkiran))
+- [WorkOS](https://supabase.com/docs/guides/auth/auth-workos) ([@bnjmnt4n](https://github.com/bnjmnt4n))
+
+### New Phone providers
+
+
+
+We’ve also added 2 new phone providers from the same contributor:
+
+- [Vonage](https://supabase.com/docs/guides/auth/auth-vonage) ([@devkiran](https://github.com/devkiran))
+- [TextLocal](https://github.com/supabase/gotrue/pull/342) ([@devkiran](https://github.com/devkiran))
+
+If you haven’t tried out phone auth yet, check out [this blog post](https://supabase.com/blog/2021/07/28/supabase-auth-passwordless-sms-login) to get started!
+
+### Send OTP via Email
+
+We’ve added support for sending an OTP via email instead of url links. All you have to do is to add `{{ .Token }}` in your email templates. You can use the `verifyOTP` method to verify the otp sent.
+
+
+
+### Server-side auth for Next.js and Nuxt (SvelteKit and Remix coming soon)
+
+
+
+While server-side auth has always been possible, we’ve heard from many of you that auth can be tough, especially when doing server-side rendering (SSR) or using the new Next.js middleware capabilities.
+
+That’s why we’ve built the [supabase-auth-helpers](https://github.com/supabase-community/supabase-auth-helpers), a collection of framework-specific auth utilities that make working with Supabase Auth a pleasant experience, no matter what framework you’re using.
+
+We’ve started with Next.js, and we’re working on helpers for Remix, and SvelteKit, so make sure to star and watch the repo!
+
+We’ve also worked with our friends at Vercel to update our https://github.com/vercel/nextjs-subscription-payments example to use the new auth helpers.
+
+In parallel, our friends at [NuxtLabs](https://nuxtlabs.com/) have developed [Supabase helpers for Nuxt 3](https://github.com/nuxt-community/supabase-module), and it’s a damn nice DX. [Check it out](https://supabase.nuxtjs.org/)!
+
+As always, all of this is open-source. Feedback, feature requests, and contributions are very welcome!
+
+## Open Source Spotlight: Charm.sh
+
+[Charm.sh](http://Charm.sh) builds open-source tools that make the command line glamorous. If you use the [Supabase CLI](https://supabase.com/docs/reference/cli/about) you’ve probably come across some of their features already, and we plan to utilise more of them in the future to improve our CLI experience further.
+
+For our community day open source spotlight feature, we’re delighted to have [Bashbunni](https://twitter.com/bash_bunni) give us an overview of what’s possible with Charm:
+
+
+
+## New courses and learning materials
+
+### Ionic Quickstart Guides
+
+
+
+The awesome folks at [Ionic](https://twitter.com/Ionicframework) have put together some quickstart guides for [Angular](https://supabase.com/docs/guides/with-ionic-angular), [React](https://supabase.com/docs/guides/with-ionic-react), and [Vue](https://supabase.com/docs/guides/with-ionic-vue). These guides walk you through building an app which allows users to login and update some basic profile details.
+
+### Everything Svelte
+
+
+
+From the good folks at Everything Svelte, this course teaches you everything you need to know to build to a custom full stack web application. They start from scratch (no starter files!) then take it one step at a time, building the frontend *and* backend. This course explores topics like authentication, accepting payments, relational databases, testing, and automatic deployment.
+
+Head over to [everythingsvelte.com](https://www.everythingsvelte.com/) and sign up to get notified when the course launches later in spring!
+
+### Level Up Tutorials
+
+
+
+Excited to see what all the fuss is about with this new framework called Remix? Played with Remix and wanna go deeper integrating Supabase? We’ve got you covered! Jon has been working with Scott Tolinski over at [Level Up Tutorials](https://leveluptutorials.com/) to create the perfect guide for building a fullstack, authenticated, realtime application using Remix and Supabase.
+
+This goes much deeper than your basic “hello world” or “todo: app, showing how to use loaders and actions in Remix to synchronize complex state between multiple clients. The course uses Row Level Security to implement access policies within the database, and shows how cookies can be used to query Supabase from the server-side.
+
+Join us for the [official course drop party on YouTube](https://www.youtube.com/watch?v=rntEMgaenHs) where we will be doing a Q&A about Supabase, Remix and what will be covered in the course.
+
+Can’t make the event? Chuck your name on the [mailing list](https://jonmeyers.io/subscribe/remix) and we’ll let you know when the course is live (and maybe even send out some exclusive discounts! 🤫)
+
+### Egghead tutorials featuring SupaSquad
+
+
+
+After a flood of positive feedback on Jon’s “[Build a SaaS product with Next.js, Supabase and Stripe](https://egghead.io/courses/build-a-saas-product-with-next-js-supabase-and-stripe-61f2bc20)” [Egghead.io](http://Egghead.io) course, we’re doubling down with Egghead this year, partnering with them to build more tailored pathways for learning Supabase.
+
+We’ll be working with our fabulous [SupaSquad](https://supabase.com/docs/handbook/supasquad) to identify the right instructors for all the different topics we’re looking to cover. If you’re interested in becoming an instructor for Supabase on Egghead, fill in the [form to join](https://supabase.com/docs/handbook/supasquad#how-to-join) the SupaSquad.
+
+Also, do let us know what topics you’d like to learn about [on Twitter](https://twitter.com/supabase).
+
+## Launching the Supabase Partner Gallery
+
+
+
+We’ve been blown away by the amazing integrations that developers and companies have been building on top of Supabase. To keep track of all the things that work with Supabase, we’re launching a partner gallery which allows you to browse integrations and experts. Check it out at [supabase.com/partners](https://supabase.com/partners).
+
+If you’ve built an integration that works with Supabase or have experience working with Supabase and want to offer your services to others, we’d love to hear from you: [supabase.com/partners/#become-a-partner](https://supabase.com/partners/#become-a-partner)
+
+Of course the code for our partner gallery is also open source, and we’ve even split it out into a separate example repository which is a neat showcase of how to use [Postgres Full Text Search](https://supabase.com/docs/guides/database/full-text-search). It’s super powerful, it’s like a search engine within Postgres!
+
+## Hackathon
+
+On Friday, 1st of April, at the end of Launch Week, we’ll be rolling into another one of our 10-day virtual Hackathons. As always, you’ll have the chance to win extremely limited Supabase Swag, and you’ll be able to play around with the new features we’re about to launch.
+
+We’re extremely excited to see what you’ll build and can’t wait to dive into your submissions on [madewithsupabase.com](https://www.madewithsupabase.com/).
+
+We’re also delighted to be partnering with [the Future Forest Company](https://thefutureforestcompany.com/) to plant a tree for every project that is being submitted for the Hackathon. Let’s build some cool open-source projects and start a forest at the same time!
+
+## Let’s get launching 🚀
+
+And with that, we officially declare Launch Week as open! Check back [here](/blog/2022/03/25/supabase-launch-week-four) every day this week to see what new things we are shipping. We can't wait to share them with you!
diff --git a/www/_blog/2022-03-29-graphql-now-available.mdx b/www/_blog/2022-03-29-graphql-now-available.mdx
new file mode 100644
index 00000000000..dc2e53fa8ff
--- /dev/null
+++ b/www/_blog/2022-03-29-graphql-now-available.mdx
@@ -0,0 +1,324 @@
+---
+title: 'GraphQL is now available in Supabase'
+description: GraphQL support is now in general availability on the Supabase platform via our open source PostgreSQL extension, pg_graphql (beta).
+author: oli_rice,dthyresson
+image: launch-week-4/tuesday-graphql/graphql-thumb-og.png
+thumb: launch-week-4/tuesday-graphql/graphql-thumb.png
+tags:
+ - launch-week
+ - graphql
+date: '2022-03-29'
+toc_depth: 3
+---
+
+GraphQL support is now in general availability on the Supabase platform via our [open source](https://github.com/supabase/pg_graphql/) PostgreSQL extension,
+[`pg_graphql](https://supabase.github.io/pg_graphql/) (beta)`.
+
+
+
+`pg_graphql` enables you to query existing PostgreSQL databases using GraphQL, either from within SQL or over HTTP:
+
+From SQL:
+
+```sql
+select graphql.resolve($$
+ {
+ accountCollection(first: 1) {
+ edges {
+ node {
+ id
+ firstName
+ address {
+ countryCode
+ }
+ }
+ }
+ }
+ }
+$$);
+```
+
+or over HTTP:
+
+```bash
+curl -X POST https://.supabase.co/graphql/v1 \
+ -H 'apiKey: '\
+ -H 'Content-Type: application/json' \
+ --data-raw '
+ {
+ "query":"{ accountCollection(first: 3) { edges { node { id } } } }"
+ }'
+```
+
+## Schema Reflection
+
+GraphQL types and fields are reflected from the SQL schema:
+
+- Tables become types
+- Columns become fields
+- Foreign keys become relations
+
+For example:
+
+```sql
+create table "Account"(
+ "id" serial primary key,
+ "email" varchar(255) not null,
+ "createdAt" timestamp not null,
+ "updatedAt" timestamp not null
+);
+
+-- Rebuild the GraphQL Schema Cache
+select graphql.rebuild_schema();
+```
+
+Translates to the GraphQL base type
+
+```graphql
+type Account {
+ id: Int!
+ email: String!
+ createdAt: DateTime!
+ updatedAt: DateTime!
+}
+```
+
+And exposes bulk CRUD operations on the `Query` and `Mutation` types, complete with relay style keyset pagination, filters, and ordering and (optional) name inflection.
+
+```graphql
+type Query {
+ accountCollection(
+ first: Int
+ last: Int
+ before: Cursor
+ after: Cursor
+ filter: AccountFilter
+ orderBy: [AccountOrderBy!]
+ ): AccountConnection
+}
+
+type Mutation {
+ insertIntoAccountCollection(
+ objects: [AccountInsertInput!]!
+ ): AccountInsertResponse
+
+ updateAccountCollection(
+ set: AccountUpdateInput!
+ filter: AccountFilter
+ atMost: Int! = 1
+ ): AccountUpdateResponse!
+
+ deleteFromAccountCollection(
+ filter: AccountFilter
+ atMost: Int! = 1
+ ): AccountDeleteResponse!
+```
+
+For a complete example with relationships, check out the [reflection docs](https://supabase.github.io/pg_graphql/reflection/).
+
+## Security
+
+An advantage to embedding GraphQL directly in the database is that we can lean on PostgreSQL's built-in primitives for authentication and authorization.
+
+### Authentication
+
+The GraphQL types exposed by `pg_graphql` are filtered according to the SQL role's [INSERT/UPDATE/DELETE permissions](https://www.postgresql.org/docs/current/sql-grant.html).
+At Supabase, each API request is resolved in the database using the role in the request's JWT.
+
+Anonymous users receive the `anon` role, and logged in users get the `authenticated` role. In either case, pg_graphql resolves requests according to the SQL permissions.
+The [introspection schema](https://graphql.org/learn/introspection/) is similarly filtered to limit exposed types and fields to those that the user has permission to access.
+That means we can serve multiple GraphQL schemas for users of differing privilege levels from a single endpoint!
+
+### Authorization
+
+Another nice side effect of making PostgreSQL do the heavy lifting is that GraphQL queries respect your existing
+[row level security policies](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) right out-of-the-box. No additional configuration required.
+
+## Performance
+
+Each [free tier database](https://supabase.com/pricing) on the Supabase platform runs on a dedicated AWS t4g.micro instance with 2 vCPUs and 1 GB of memory.
+To squeeze the most out of that limited hardware we had to make a few significant optimizations:
+
+**GraphQL queries are always transpiled into exactly one SQL query**
+
+The SQL queries select and aggregate requested data into the shape of the GraphQL JSON response.
+In addition to solving the [N+1 query problem](https://medium.com/the-marcy-lab-school/what-is-the-n-1-problem-in-graphql-dd4921cb3c1a), a common issue with GraphQL resolvers,
+GraphQL queries requiring multiple joins typically produce significantly less IO due to reduced data duplication.
+
+For example, when selecting all comments for a blog post:
+
+```sql
+select
+ blog_posts.title,
+ comments.body as comment_body
+from
+ blog_posts
+join
+ comments on blog_posts.id = comments.blog_post_id
+```
+
+a SQL response would duplicate all data from the `blog_posts` table (title).
+
+```markdown
+| title | comment_body |
+| ---------- | ------------------------------ |
+| F1sRt P0$T | this guy gets it! |
+| F1sRt P0$T | you should re-write it in rust |
+| F1sRt P0$T | 10% off daily vitamin http:... |
+```
+
+Compared to the equivalent GraphQL response.
+
+```json
+{
+ "blogPostCollection": {
+ "edges": {
+ "node":
+ "title": "F1sRt P0$T"
+ "commentCollection": {
+ "edges": [
+ "node": {
+ "body": "this guy gets it!"
+ },
+ "node": {
+ "body": "you should re-write it in rust"
+ },
+ "node": {
+ "body": "10% off daily vitamin http:..."
+ }
+ ]
+ }
+ }
+ }
+ }
+}
+```
+
+Which has no duplication of data.
+
+The difference in payload size is negligible in this case, but as the number of 1-to-many joins grows, data duplication in the SQL response grows geometrically.
+
+**Queries are cached as [prepared statements](https://www.postgresql.org/docs/current/sql-prepare.html)**
+
+After a GraphQL query is transpiled to SQL, it is added to the prepared statement cache so subsequent requests with the same structure (think pagination) can skip the transpilation step.
+
+Using prepared statements also allows PostgreSQL to skip the overhead of computing a query plan. For small, on-index, queries,
+the query planning step can take several times as long as the query's execution time, so the saving is significant at scale.
+
+**All operations are bulk**
+
+Finally, all reflected query and mutation fields support bulk operations to nudge users towards consuming the API efficiently.
+Batching similar operations reduces network round-trips and time spent in the database.
+
+**Result**
+
+As a result of these optimizations, the throughput of a “hello world” equivalent query on Supabase free-tier hardware is:
+
+- 377.4 requests/second through the API (mean)
+- 656.2 queries/second through SQL (single connection, mean)
+
+## Getting Started
+
+
+⚠️ GraphQL (Beta) is only available on Supabase projects created after 28th March 2022 and self-hosted setups.
+
+
+
+To enable GraphQL in your Supabase instance, enable `pg_graphql` from the dashboard.
+
+
+
+
+
+Or create the extension in your database
+
+```sql
+create extension pg_graphql;
+```
+
+And we're done!
+
+The GraphQL endpoint is available at: `https://.supabase.co/graphql/v1`
+
+## Example app: Build a HN clone with Postgres and GraphQL
+
+
+
+We're excited to have worked with [The Guild](https://www.the-guild.dev) to show you [how to use](https://supabase-graphql-example.vercel.app/about) `pg_graphql`
+and their tools to build a [HackerNews clone](https://supabase-graphql-example.vercel.app/).
+
+The [demo application](https://supabase-graphql-example.vercel.app/) showcases:
+
+- **CRUD (Query + Mutation Operations).**
+ Data is fetched from the GraphQL layer auto-generated via `pg_graphql`.
+- **Cursor Based Pagination.**
+ `pg_graphql` generates standardized pagination types and fields as defined by the GraphQL Cursor Connections Specification.
+- **Authorization / RLS.**
+ GraphQL requests made include Supabase authorization headers so that Row Level Security on the Postgres layer ensures that viewers can only access what they are allowed to — and authenticated users can only update what they should.
+- **Code generation.**
+ Introspect your GraphQL schema and operations to generates the types for full backend to frontend type-safety.
+- **Postgres Triggers and Functions.**
+ Recalculate the feed scoring each time someone votes.
+- **Supabase UI.**
+ Use Auth widget straight out the box to handle logins and access tokens.
+
+
+
+Now instead of using the Supabase PostgREST API to query your database ...
+
+```jsx
+// using Supabase PostgREST
+
+const { data, error } = await supabase
+ .from('profile')
+ .select('id, username, bio, avatarUrl, website')
+```
+
+... all data fetching and updates are done using the same GraphQL operations you know and love! 🤯
+
+```
+// using GraphQL
+
+query ProfilesQuery {
+ profileCollection {
+ edges {
+ node {
+ id
+ username
+ bio
+ avatarUrl
+ website
+ }
+ }
+ }
+}
+```
+
+🎁 Get the code on GitHub here: [github.com/supabase-community/supabase-graphql-example](https://github.com/supabase-community/supabase-graphql-example)
+
+## Supabase + The Guild
+
+
+
+This is just the start of what we hope to be a close collaboration with the Guild, whose expertise of the GraphQL ecosystem will guide the development of Supabase's GraphQL features.
+The Guild and Supabase share a similar approach to open source - we both favor collaboration and composability, making collaboration easy and productive.
+
+Be sure to visit [The Guild](https://www.the-guild.dev) and [follow them](https://twitter.com/TheGuildDev) to stay informed of the latest developments in GraphQL.
+
+## Limitations & Roadmap
+
+Our first general availability release of `pg_graphql` supports:
+
+- Full CRUD on table columns with scalar types
+- Read only support for array types
+- Extending types with [computed fields](https://supabase.github.io/pg_graphql/computed_fields/)
+- Configuration with [SQL comments](https://supabase.github.io/pg_graphql/configuration/)
+
+In the near term, we plan to fully support array and json/b types. Longer term, we intend to support views and custom mutations from user defined functions.
+
+Didn't see the feature you're interested in? [Let us know](https://github.com/supabase/pg_graphql/issues)
diff --git a/www/_blog/2022-03-30-supabase-enterprise.mdx b/www/_blog/2022-03-30-supabase-enterprise.mdx
new file mode 100644
index 00000000000..568afd907ad
--- /dev/null
+++ b/www/_blog/2022-03-30-supabase-enterprise.mdx
@@ -0,0 +1,278 @@
+---
+title: 'Introducing Supabase Enterprise'
+description: 'Today we are releasing Supabase Enterprise, a suite of features to scale your project.'
+author: rory_wilding,paul_copplestone
+image: launch-week-4/enterprise-day/enterprise-thumb.png
+thumb: launch-week-4/enterprise-day/enterprise-thumb.png
+tags:
+ - launch-week
+ - enterprise
+date: '2022-03-30'
+toc_depth: 3
+---
+
+As our platform continues its rapid adoption within the developer community, we're seeing a growing segment of users building business-critical applications that require enterprise-grade resilience.
+
+
+
+## Enterprise features for everybody
+
+Some features are too good to limit to large customers, so today we're introducing a few enterprise features into the Pro tier.
+
+### Spend caps
+
+
+
+
+
+To simplify pricing, we've merged the “Pro” and “Pay as you go” tiers and introduced monthly spend caps to avoid nasty billing surprises.
+These changes are to keep Supabase pricing [predictable, transparent, and developer friendly](/blog/2021/03/29/pricing).
+
+When you upgrade to the Pro Tier, spend caps are turned on by default, limiting your per-project costs to $25 per month.
+We're also retaining our soft limits while we manage the transition to granular spend-caps, so your service will continue to run even if your usage exceeds $25 (we'll contact you directly when you go over the limit). Right now there is a global project spend-cap, and in the future you'll have full control with configurable spend-caps on a “per-feature” basis.
+
+### Database Add-ons
+
+
+
+
+
+Today we're releasing self-serve Database Add-ons.
+
+What do you do when your project hits production and your userbase is sky-rocketing?
+Many developers have been asking to scale their projects on-demand. Database Add-ons give everyone this control.
+
+Today, Database Add-ons are available for a small set of customers. We will progressively release this for everyone by the end of next week (Friday 8th April).
+
+### New Log Explorer
+
+
+
+
+
+
+Today we're releasing a brand new [Log Explorer](/docs/guides/platform/logs) in the Supabase Dashboard.
+As big advocates of SQL, we've done what any good Postgres fanatics would do - we're giving you the ability to query your logs using SQL.
+And if you're new to SQL, we have plenty of templates included.
+This is just one of the exciting features we are releasing through our [Logflare acquisition](/blog/2021/12/02/supabase-acquires-logflare).
+Log history is available to every Supabase project:
+
+- Free Tier: 7 days of log history
+- Pro Tier: 30 days of log history
+- Enterprise Tier: 90 days of log history
+
+### Elixir Livebooks
+
+Today we're releasing [Elixir Livebooks for Monitoring](https://github.com/supabase/livebooks), starting with built-in monitoring for PgBouncer, a Postgres connection pooler.
+
+
+
+While our default PgBouncer settings work for 98% of our customers, sometimes they require customization for unique load patterns.
+For example, Supabase is popular with web3 projects where traffic can be very unpredictable - especially when you partner with Snoop Dogg.
+When [sound.xyz](http://sound.xyz) dropped [an NFT with Snoop](https://www.sound.xyz/snoopdogg/death-row-mix-vol-1), we customized their pooler to handle significant load.
+Their database handled over 9,000 simultaneously connections from Vercel's serverless API.
+
+
+ In our MVP, we started with a serverless stack to simplify DevOps. Supabase made it dead simple to get PgBouncer and Postgres running so we could focus on the product.
+
+ As we started hitting scale, they've been crucial to supporting our drops. When Snoop Dogg debuted on Sound, Supabase was able to help us provision our data store to handle the load.
+
+
+ As we rearchitect our backend stack towards scaled microservices, we can be confident that managing Postgres won't be a bottleneck.
+
+
+ Supabase takes out the mental effort from our back-end infrastructure so we can focus on our
+ customers needs.
+
+
+
+If you want to monitor your own PgBouncer connections you can easily [spin up a Livebook](https://github.com/supabase/livebooks) on a free [Fly.io](http://fly.io) instance.
+
+## Enterprise Features
+
+With the release of our new Enterprise Tier, we're announcing a tonne of new features for Enterprise customers.
+
+### Point-in-Time Recovery
+
+
+
+Disaster Recovery is a critical process for any company, even for the most fault-tolerant products. What happens when you accidentally delete that database column
+because of a clumsy `where` clause? Even with Supabase's daily backups, a day's worth of data can be lost if disaster strikes at the most inopportune time.
+
+Every Enterprise project on the Supabase platform has access to Point-in-Time Recovery (PITR), allowing projects to recover from a snapshot mere seconds after a disaster.
+Supabase PITR is powered by [WAL-G](https://github.com/wal-g/wal-g), an open source archival and restoration tool.
+
+### Prometheus Endpoints
+
+
+
+If you run critical infrastructure you likely use Prometheus to monitor your metrics. We've now exposed a Prometheus compatible endpoint for our Enterprise customers.
+This allows them to scrape Supabase metrics into their own metrics infrastructure for real-time monitoring and alerting. This makes monitoring Supabase as easy as building with Supabase.
+
+If you want access to the Prometheus Endpoint, [contact the Supabase Enterprise team](/contact/enterprise) today and we'll get you setup.
+
+### SLAs & Enterprise Support
+
+
+
+For our enterprise customers we know that service level agreements and support response times are also critical features. We continue to treat support as an
+important priority for all tiers, though enterprise users require confidence that our response times meet their business needs. We now offer faster response times for Enterprise customers,
+alongside Priority and Priority Plus support packages for those who need more comprehensive support. You can find further details around our SLAs & support
+[in our documentation](/docs/company/sla).
+
+### Enterprise Pricing
+
+
+
+If you need more information on our Enterprise tier, Pricing, SLAs, Support packages, or want to learn more about how Supabase can meet your scaling needs just
+[contact us](/contact/enterprise).
+
+## Coming soon
+
+We have a lot more Enterprise features under development, available to early-access customers:
+
+### SOC2
+
+We are actively working towards our SOC2 Type II certification by monitoring and patching alerts raised by our security monitoring platform.
+SOC2 covers a wide spectrum of potential security areas and achieving SOC2 would also ease compliance with other major certifications like ISO-27001 and HIPAA.
+
+### Log ingestion
+
+Supabase is now ingesting over 4 billion log events every week, just from the Postgres instances we host on the platform.
+Soon you'll be able to ingest logs and analytics from anywhere directly into your Supabase project.
+
+### Foreign Data Wrappers
+
+Ingesting your logs is one thing, but what about querying them directly from your PostgreSQL database? What if you can figure out how many API requests one of your users made last month?
+Or how many gigabytes of video a user streamed from [Supabase Storage](/storage)? Watch this space!
+
+### Materialized Views
+
+Querying huge datasets can be time-consuming, especially when you are aggregating billions of rows of historical logs. Supabase will make this simple with auto-updating views,
+saved to disk for increased performance. These views update periodically at a cadence that you decide. You'll even be able to fetch these views with your
+[Supabase API](/docs/guides/api)!
+
+## Next steps
+
+Get started today with all of our Enterprise Features on [app.supabase.io](https://app.supabase.io), or [contact the Supabase Enterprise team](/contact/enterprise)
+if you want to access our Enterprise features.
diff --git a/www/_blog/2022-03-31-supabase-edge-functions.mdx b/www/_blog/2022-03-31-supabase-edge-functions.mdx
new file mode 100644
index 00000000000..3f40ac2e2d4
--- /dev/null
+++ b/www/_blog/2022-03-31-supabase-edge-functions.mdx
@@ -0,0 +1,141 @@
+---
+title: Edge Functions are now available in Supabase
+description: Today we're launching Edge Functions. Edge Functions let you execute Typescript code close to your users, no matter where they're located.
+author: inian
+image: launch-week-4/thursday-functions/functions-thumb.png
+thumb: launch-week-4/thursday-functions/functions-thumb.png
+tags:
+ - launch-week
+ - functions
+date: '2022-03-31'
+toc_depth: 3
+---
+
+Today we're launching one of our [most](https://twitter.com/lau_cazanove/status/1506530181946691592) [requested](https://twitter.com/edgarasben/status/1506653203458363393) and [highly-](https://twitter.com/runjep/status/1507462077216088069)[anticipated](https://twitter.com/marcopolotwo/status/1506431782362632195) [features](https://github.com/supabase/supabase/discussions/4269) — Edge Functions. Edge Functions let you execute Typescript code close to your users, no matter where they're located.
+
+Edge Functions are executed on the secure-by-default [Deno runtime](https://deno.land/), and deployed around the world in seconds using Deno's [hosted Deno Deploy offering](https://deno.com/deploy). However, as a user of Supabase Edge Functions, you don't need to know or worry about any of that; we handle all the gnarly details, delivering a seamless experience that allows you to focus on your business logic.
+
+## Choosing a platform
+
+Serverless compute options can be broken down into two broad categories:
+
+- Containers as a Service (e.g. Google Cloud Run, Fly.io)
+- Functions as a Service (e.g. AWS Lambda, Cloudflare Workers, Fastly Compute @ Edge, Suborbital)
+
+Additionally, there are self-hosted offerings within each category as well (e.g. Firecracker sort-of for the former, OpenFaaS for the latter).
+
+Our first critical decision was to choose Functions as a Service (”FaaS”) over Containers and other alternatives. While Containers can allow for more flexible workloads, authoring and maintaining Functions allows for a substantially simpler developer experience-something Supabase has always focused on. As a Supabase user, all you need to think about is the business logic you wanted to write a Function for in the first place; you don't need to think about optimizing docker image builds, updating your system dependencies, etc.
+
+Additionally, while a lot of work has been invested in improving container start-up times, Functions generally still enjoy significantly faster start-ups.
+
+Our next major decision was to choose global deployments instead of a deploying to a specific geographical region.
+
+Launching Functions in a single region (e.g. close to your database) can present a lot of advantages if there are a lot of database operations being executed within your business logic.
+
+However, Supabase already offers a flexible solution for that - [Database Functions](https://supabase.com/docs/guides/database/functions)! As such, for Supabase [Edge] Functions, we decided to deploy far-and-wide so that they are as close to your end-users as possible. You can even invoke a Database Function from an Edge Function, allowing you to enjoy the best of both worlds.
+
+## The Deno runtime
+
+Deno is a modern Typescript and JavaScript runtime created with first-class support for web technologies. Here some of the reasons why we're excited about Deno:
+
+### Open-source
+
+_Deno Deploy_ is Deno's hosted service and, although it is proprietary, the Deno CLI is open source. This means that the open source offering from Deno maintains feature-parity with the proprietary service. If you use Deno to develop functions locally, its behavior will be the same as when deployed on the edge, unlocking an incredible developer experience. We couldn't achieve a similarly seamless experience with e.g. AWS Lambda, no matter how much we tried.
+
+Deno even goes a step further than maintaining feature-parity, releasing all new APIs to open-source **first** before rolling them out to their hosted offering. This ensures that you can always develop and test bleeding-edge functionality locally, with all the tools you're used to and familiar with, before deploying to a hosted cloud environment.
+
+### Batteries included
+
+Deno comes with all the tools needed for a modern, productive developer experience, so you can spend less time searching through third party modules, and more time being productive. Out of the box, it includes support for Typescript, ES modules, and provides [test runners](https://deno.land/manual/testing), [formatters](https://deno.land/manual/tools/formatter), [linters](https://deno.land/manual/tools/linter), [bundlers](https://deno.land/manual/tools/bundler) and a package manager.
+
+### Secure by default
+
+Like modern web browsers, the Deno runtime executes your code in a secure sandbox by default. Functions cannot access environment variables, network or filesystem unless they are explicitly allowed. Supply chain attacks have been a daunting problem in the Node ecosystem and Deno mitigates many of these attacks by having a security-first model.
+
+## The Supa-Deno platform
+
+When a request comes in to an Edge Function you deploy on Supabase, it first lands at a “Relay”. The [Relay](https://github.com/supabase/functions-relay) acts as an API gateway, authenticating the JWT, and providing some additional functionality like logging and rate-limiting. Upon receiving the incoming request, the Relay retrieves the metadata for your Function, and uses it to construct a unique identifier (”Deployment ID”) for the Function. This Deployment ID then gets passed over to the Deno Deploy platform, which takes care of invoking your Function securely, and passing your output back to the Relay, which in turn passes it back to your end-user.
+
+If a user's request comes in for your Function before it has been cached by the Deno Deploy platform (a ”cold start”), it reaches out to Supabase to retrieve your Functions code, and any associated permissions and secrets. Even though this might sound like a lot of work, we've worked to ensure that these cold starts are still pretty spiffy.
+
+
+
+The primary goal of this architecture is to reduce the amount of work done in the hot path (marked in purple above). Each component in the hot path is globally distributed so that Edge Functions start up and respond to your users' requests fast.
+
+### Region: Earth 🌎
+
+Supabase Edge Functions are deployed to one region - Earth (and we're exploring Mars as an additional region 👽). Edge Functions are deployed to over 30 data centers in a matter of seconds, ensuring fast response times no matter where your users are located.
+
+[Database Functions](https://supabase.com/docs/guides/database/functions) (also served via our [REST and GraphQL APIs](https://supabase.com/docs/guides/api)) are colocated with your Postgres database, making them ideal for DB-intensive operations. These APIs can also be called seamlessly from your Supabase Edge Functions, making for a powerful combination.
+
+### Scale to zero
+
+Functions scale down to zero and you only pay for what you use. This makes them great for an extremely wide variety of workloads-whether you're starting out with extremely sporadic usage, or bursty request patterns, or using them consistently and heavily.
+
+## A fun and efficient Developer Experience
+
+Delivering a phenomenal Developer Experience is something we care about a lot at Supabase. In the serverless functions space, we've found that local development and testing, coupled with fast deploys are critical.
+
+We've [extended the Supabase CLI](https://supabase.com/docs/guides/local-development) to optimize the Edge Functions DX along these two dimensions. You get live-reloading, and a local Deno environment that matches the production environment, making for a great local iteration environment.
+
+
+
+
+
+Once you've tested your Function locally (or gone straight to production cos you live _on the edge_ ... get it?) it takes just seconds to deploy a new function and see the logs streaming in your Dashboard—ensuring a tight iteration loop with your production environment.
+
+
+
+
+
+Our observability pipeline has been built [using Logflare](https://supabase.com/blog/2021/12/02/supabase-acquires-logflare). Structured logs from your Edge Functions get sent to Logflare, which also processes them into metrics. Your Supabase Dashboard is able to reach out to Logflare endpoints, and with some of the [(not so) secret sauce](https://supabase.com/blog/2021/11/30/supabase-studio) from our front-end team, you get responsive charts and logs for your Edge Functions.
+
+
+new —> deploy —> invoke —> logs
+
+To round off the end-to-end experience, `supabase-js` now works in Deno, making it easy to interact with the rest of your Supabase project from within your Edge Functions. Your project's URLs, API keys, and database connection strings are made available as environment variables within your Function to make this even easier. And if you want to interact with third-party APIs which require a secret key, such as Stripe, you can easily and securely make these available to your Function as environment variables via the Supabase CLI. To get an idea for what is possible, check out our examples page [here](https://github.com/supabase/supabase/tree/master/examples/edge-functions).
+
+## Quickstart
+
+
+
+Can't wait to get started? Develop, test, and deploy your first Supabase Edge Function in less than 7 minutes with our [Quickstart Video Tutorial](https://youtu.be/rzglqRdZUQE)!
+Check the [Edge Functions Docs](https://supabase.com/docs/guides/functions) for the steps.
+
+## Example apps: Mobile payments with React Native and Flutter
+
+When researching use-cases with all of you, [processing payments](https://github.com/supabase/supabase/discussions/4269#discussioncomment-1748067) was being pointed out the most, so naturally, to support the launch, we've created example apps in collaboration with Stripe for [React Native](https://github.com/supabase-community/expo-stripe-payments-with-supabase-functions) and [Flutter](https://github.com/supabase-community/flutter-stripe-payments-with-supabase-functions), to allow you to get started and earn money even faster.
+
+
+
+## Can I host static sites
+
+Even though Deno supports [rendering `jsx` and `tsx` files](https://deno.land/manual/jsx_dom/jsx), we don't plan on becoming a website hosting provider with Edge Functions. For now, Edge Functions can only be invoked via the `POST` method. Offering secure and fast web hosting with a good developer experience is a hard problem to solve and there are [other](https://www.netlify.com/) [fantastic](https://vercel.com/) [providers](https://pages.cloudflare.com/) which do exactly that.
+
+From our experience launching Supabase Storage last year, becoming a hosting provider is not something you want to take lightly. Malicious folks will upload their phishing sites whenever they get a chance and this can quickly spiral out of control, causing you to land on the denylist in the [Safe Browsing dataset](https://safebrowsing.google.com/). Even though we removed the project within minutes after being notified, various ISPs had already cached the information from the Safe browsing dataset and were “helping” their users by restricting access to the Supabase domain. This isn't something we're planning to repeat. But as always, we'd love to hear your use cases and feature requests, we're just one [GitHub discussion](https://github.com/supabase/supabase/discussions) away!
+
+## Roadmap
+
+These are some of the features that are on our roadmap for functions.
+
+- Cron functions to trigger your function on a schedule
+- Studio support and self hosting multiple functions
+- Optimizing cold start times
+- Wasm is a great fit for running functions and companies like [Suborbital](https://suborbital.dev/) are leading the charge by making it easy to write functions that run in a Wasm-based runtime. Deno supports Wasm natively and we plan on allowing users to write their functions in languages that compile down to Wasm like Rust.
+- We can expose Deno's permission model so that you can lock down your functions further by restricting outbound connections to specific domains.
+- To invoke functions, you need a valid JWT signed by your project's JWT secret. We plan on making this verification optional. This enables more use cases like hooking up Supabase functions to Stripe webhooks where the function manages it's own authentication.
+
+Give us a shout with your feedback and excited to see what you build in the hackathon!
diff --git a/www/_blog/2022-04-01-hackathon-bring-the-func.mdx b/www/_blog/2022-04-01-hackathon-bring-the-func.mdx
new file mode 100644
index 00000000000..9fcb351b8c1
--- /dev/null
+++ b/www/_blog/2022-04-01-hackathon-bring-the-func.mdx
@@ -0,0 +1,140 @@
+---
+title: 'Hackathon: Bring the Func(🕺)'
+description: Build open-source projects with our latest features, win limited edition swag and plant a tree!
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: launch-week-4/friday-hackathon/hackathon-fun-og.png
+thumb: launch-week-4/friday-hackathon/hackathon-fun-og.png
+tags:
+ - hackathon
+ - community
+date: '2022-04-01T16:00:00'
+toc_depth: 3
+---
+
+We can’t believe that it’s already a wrap on our [fourth launch week](https://supabase.com/blog/2022/03/25/supabase-launch-week-four)! To keep the party and excitement going, and as [is now tradition](https://supabase.com/blog/2022/03/28/community-day#launch-week-iv---what-to-expect), starting at 9am PT today we'll be hacking together for the next 10 days until 23:59pm PT on Sunday April 10th. And because we’ve launched [GraphQL support](https://supabase.com/blog/2022/03/29/graphql-now-available) and [Supabase Edge Functions](https://supabase.com/blog/2022/03/30/supabase-enterprise), these will be the major themes and therefore categories for the hackathon.
+
+For some inspiration, check out [TheGuildDev](https://twitter.com/TheGuildDev)’s [GraphQL HackerNews clone](https://supabase-graphql-example.vercel.app/), and [Tyler’s](https://twitter.com/dshukertjr) [Flutter](https://github.com/supabase-community/flutter-stripe-payments-with-supabase-functions) and [Thor’s](https://twitter.com/thorwebdev) [React Native](https://github.com/supabase-community/expo-stripe-payments-with-supabase-functions) apps with Supabase Edge Functions, or have a browse through [madewithsupabase.com](http://madewithsupabase.com)!
+
+As always, we'll have some extremely limited edition swag to give away that can only be won by participating in the Hackathon!
+
+
+
+We’re absolutely stoked to see what amazing things y’all will build and submit to [madewithsupabase.com](https://www.madewithsupabase.com/bring-the-func).
+
+Finally, we're delighted to be partnering with [the Future Forest Company](https://thefutureforestcompany.com/) to plant a tree for every project that is being submitted for the Hackathon. Let’s build some cool open-source projects and start the SupaForest at the same time!
+
+## Details
+
+### Timeline
+
+- **Friday April 1st at 08:30am PT:** Last day of Launch Week. Join us on [Twitter Spaces](https://twitter.com/i/spaces/1BdxYwWBzeDGX) for the kickoff announcement.
+- Build your project during the next 10 days and hang out with the community [on Discord](https://discord.gg/bnncdqgBSS).
+- **Sunday April 10th at 11:59pm PT:** Submission deadline
+- Judges Deliberate (Monday)
+- We'll be contacting and announcing the winners [on Twitter](https://twitter.com/supabase) throughout the week after.
+
+
+
+### Prize categories
+
+There are multiple chances to win, there will be prizes for:
+
+- Most impressive GraphQL project (must use [pg_graphql](https://supabase.com/blog/2022/03/29/graphql-now-available#getting-started))
+- Most interesting usage of [Edge Functions]()
+- Most fun / visually pleasing (get creative)
+
+There will be a winner and a runner-up prize for each category. And for each project submitted we'll plant a tree and provide you with a certificate via [the future forest company](https://thefutureforestcompany.com/) to include in your project.
+
+### Submission
+
+Submit your project via [madewithsupabase.com/bring-the-func](https://www.madewithsupabase.com/bring-the-func)
+
+You will be asked to send a link to a GitHub (or similar) repo, in the README you should include:
+
+- link to hosted demo (if applicable)
+- list of team members github handles (and twitter if they have one)
+- any demo videos, instructions, or memes
+- a brief description of how you used Supabase:
+ - to serve data via REST or GraphQL?
+ - Realtime?
+ - Auth?
+ - Storage?
+ - Functions on the edge?
+- any other info you want the judges to know (motivations/ideas/process)
+- _optional_ team photo
+- _optional_ a meme
+
+### Judging & announcement of winners
+
+The Supabase team will excitedly review what you've built. They will be looking for a few things, including:
+
+- creativity/inventiveness
+- functions correctly/smoothly
+- visually pleasing
+- technically impressive
+- use of Supabase features
+ - deep usage of a single feature or
+ - broad usage are both ok
+- FUN! 😃
+
+We'll be contacting and announcing winners [on Twitter](https://twitter.com/supabase) throughout the week after submission closes.
+
+ {' '}
+
+### Rules
+
+- Team size 1-5 (all team members on winning teams will receive a prize)
+- You cannot be in multiple teams
+- One submission per team
+- All design elements, code, etc. for your project/feature must be created **during** the event
+- All entries must be Open Source (link to source code required in entry)
+- Must use Supabase in some capacity
+- Can be any language or framework
+- You must submit before the deadline (no late entries)
+- You can continue to make updates to your project after the submission deadline, but there is no guarantee that the judges will see additions made after the submission time.
+
+### Community & help
+
+Hang out with the Supabase team and community on Discord:
+
+- Text channel: hackathon
+- Audio channel: hackathon
+
+If you need help or advice when building, find other people to join your team, or if you just want to chill and watch people build, come and join us!
+
+Join our Discord: [discord.supabase.com](https://discord.supabase.com)
+
+
+
+### Resources & Guides
+
+Here's a collection of resources that will help you get started building with Supabase:
+
+- Getting started with [GraphQL on Supabase](https://supabase.com/blog/2022/03/29/graphql-now-available#getting-started)
+- [GraphQL HackerNews clone](https://supabase-graphql-example.vercel.app/)
+- [Edge Functions Guide](https://supabase.com/docs/guides/functions)
+- [Edge Functions Quickstart video](https://youtu.be/rzglqRdZUQE)
+- [Supabase CLI local development guide](https://supabase.com/docs/guides/local-development)
+- [Edge Functions examples](https://github.com/supabase/supabase/tree/master/examples/edge-functions)
+
+### Additional Info
+
+- Any intellectual property developed during the hackathon will belong to the team that developed it. We expect that each team will have an agreement between themselves regarding the IP, but this is not required
+- By making a submission you grant Supabase permission to use screenshots, code-snippets and/or links to your project or content of your README on our twitter, blog, website, email updates, and in the Supabase discord server. Supabase does not make any claims over your IP.
diff --git a/www/_blog/2022-04-01-supabase-realtime-with-multiplayer-features.mdx b/www/_blog/2022-04-01-supabase-realtime-with-multiplayer-features.mdx
new file mode 100644
index 00000000000..e86f6423582
--- /dev/null
+++ b/www/_blog/2022-04-01-supabase-realtime-with-multiplayer-features.mdx
@@ -0,0 +1,79 @@
+---
+title: Supabase Realtime, with Multiplayer Features
+description: Today we're announced Realtime, with multiplayer features. Realtime enables broadcast, presence, and listening to database changes delivered over WebSockets.
+author: wenbo_xie
+image: launch-week-4/friday-realtime/multiplayer-realtime-thumb.png
+thumb: launch-week-4/friday-realtime/multiplayer-realtime-thumb.png
+tags:
+ - launch-week
+ - realtime
+date: '2022-04-01T22:30:00'
+toc_depth: 3
+---
+
+Today is the 1st of April, or April Fool's Day, but I like to think of today as Supabase Realtime Day where we announce and demo the next version of Realtime.
+
+Here's the next version of Realtime, with multiplayer features.
+
+
+
+We've made quite a few iterations on Realtime in the past. The first major version of Realtime listened to a single database by streaming changes from PostgreSQL's Write-Ahead Log and sending them to clients via WebSockets. The second major version introduced better security via WALRUS (Write Ahead Log Realtime Unified Security) which adheres to a database's RLS policies to determine authorized clients. However, this version continues to be single tenant as it can only poll one database at a time.
+
+The next and third major version, announced today on new Supabase Realtime Day, introduces multi-tenancy to listen to many databases. Additionally, this new version introduces a distributed cluster of nodes, which introduces better resource utilization, fault-tolerance, and lower latencies that directly translates to better performance for developers. We're fortunate to have built Realtime on Elixir and Phoenix, as the language and framework are great for concurrency, distributed computing, and WebSockets. We'll continue to support the existing Realtime feature of listening to database changes, but now we're also introducing the ability for developers to use WebSockets to build multiplayer games, collaborative apps, and support a wide array of use cases.
+
+## New Features
+
+### Presence
+
+
+
+Presence is great for showing when your users are online. When a user connects or disconnects (even accidentally!), the server automatically detects this and let's everyone else know.
+Presence is powered by [CRDTs](https://crdt.tech/) (Conflict-free Replicated Data Type) on a distributed cluster useful for storing synced data across nodes.
+
+
+### Broadcast
+
+
+
+Broadcasts are perfect for sending ephemeral events, like cursor movements. It's incredibly useful for gaming where you need to send messages across all connected users without storing them in the database.
+In Realtime, connected users communicate with other subscribing & publishing to topics.
+
+### Extensions
+
+In this version of Realtime we're re-architecting the way that we listen to PostgreSQL databases by opening the WebSocket functionality for general use.
+Instead of only using WebSockets to broadcast database changes, we are now moving the PostgreSQL listener to an “extension” architecture. This opens up numerous new ways of extending the server.
+Here are just a few that we've heard:
+
+- Multiple Postgres: listen to multiple PostgreSQL databases at the same time.
+- Other databases: Listen to database changes from other databases, like MySQL.
+- Finance: Listen to stock market events and broadcast them to connected users.
+- Web3: Listen to blockchain events and broadcast them to connected users.
+- A server clock which broadcasts a timer to every connected client (e.g. auction sites)
+
+We're extremely excited about what the community develops.
+
+## Demo
+
+To show off the functionality that we're releasing, we've built a demo application.
+
+[multiplayer.dev](https://multiplayer.dev)
+
+Tech stack:
+
+- [Realtime](https://github.com/supabase/realtime), powered by the [Phoenix Web Framework](https://www.phoenixframework.org/) and [Elixir](https://elixir-lang.org/).
+- [Next.js](https://nextjs.org/) by [Vercel](https://vercel.com).
+- Deployed on a [Fly.io](https://fly.io) - cluster of 20 nodes distributed around the world 🌍.
+
+## Getting started
+
+Sign up for the waitlist at [multiplayer.dev](https://multiplayer.dev).
+
+You can follow development in our [open source repository on GitHub](https://github.com/supabase/realtime/tree/multiplayer).
diff --git a/www/_blog/2022-04-01-supabrew.mdx b/www/_blog/2022-04-01-supabrew.mdx
new file mode 100644
index 00000000000..cce894d4ed9
--- /dev/null
+++ b/www/_blog/2022-04-01-supabrew.mdx
@@ -0,0 +1,37 @@
+---
+title: Supabrew - Never Code Thirsty
+description: A light and refreshing non-alcoholic beer for devs.
+author: ant_wilson
+image: launch-week-4/friday-supabrew/productShot1.jpg
+thumb: launch-week-4/friday-supabrew/productShot1.png
+tags:
+ - launch-week
+date: '2022-04-01T11:00:00'
+toc_depth: 3
+---
+
+Supabase is best known as being a Developer Experience focused database company. As we expand our offerings and feature set, it’s only natural that we expand into other greenfield areas of the Developer Experience stack. After all, Supabase exists to solve developer problems, wherever we find them.
+
+One thing we noticed ALL developers require when they sit down to code is refreshment. There’s nothing worse than being in the middle of a 4000 line PR review and experiencing an extreme, unquenchable thirst. After extensive market review, we discovered that there doesn’t yet exist a product to fill this gap in the market.
+
+
+
+We surveyed our 80,000 registered developers, and asked them if they could help us design the perfect beverage for coding - what would it be? The result was a light, refreshing, low sugar, and non-alcoholic beverage.
+
+If you’ve been following our social media recently you will have seen that the entire team is currently working from a remote location in Bavaria, Germany. This is no coincidence. We came here primarily to sample beverages from some of the world’s oldest and best breweries. And we are proud to announce for the first time today, our latest solution to Developer Experience problems has arrived...
+
+### SupaBrew. An all-natural, light and refreshing non-alcoholic beer - engineered specifically for the needs of devs.
+
+
+
+Brewed in accordance with strict Germany Beer Purity laws, SupaBrew is made from 3 open source ingredients: Barley, Hops, and Water. With the absence of preservatives, you can be sure that you’re feeding your brain with only the purest liquids, which will keep your mind sharp, enabling you to squash bugs and center divs late into the night, and through to the early hours of the morning. And it’s not just an evening beverage, we specifically adapted the taste so you can even enjoy it during your 9am stand ups.
+
+You won’t have any blockers to report when it comes to sustainability either. Each bottle is made from recycled CRT monitors, and the labels are made from Ubuntu stickers leftover from last years’ FOSDEM.
+
+
+
+By far the best feature of SupaBrew, is the pricing structure. Thanks to an innovative product-led growth strategy, indie devs can start enjoying SupaBrew for free. As your consumption increases, you can move onto our Pay-as-you-Drink plan. And features such as priority delivery, empty bottle collections, and CopplePack (your order will be hand picked and packed by our Chief Brewing Officer - [kiwicopple](http://github.com/kiwicopple)) are available as Enterprise add-ons. Subscription based plans, and pay-per-seat arrangements are also available for teams of 15 and larger.
+
+Want to get started with SupaBrew? Head over to our [swag store](https://store.supabase.com/products/supabrew-6-pack?variant=42199068541083) to order your first crate now.
+
+This is of course an April Fools, but since you're here why not check out what else we [dropped this week](/blog/2022/03/25/supabase-launch-week-four).
diff --git a/www/_blog/2022-04-15-beta-update-march-2022.mdx b/www/_blog/2022-04-15-beta-update-march-2022.mdx
new file mode 100644
index 00000000000..9888153c9d4
--- /dev/null
+++ b/www/_blog/2022-04-15-beta-update-march-2022.mdx
@@ -0,0 +1,108 @@
+---
+title: Supabase Beta March 2022
+description: Functions, GraphQL, and much more.
+author: ant_wilson
+image: 2022-march/thumb.jpg
+thumb: 2022-march/thumb.jpg
+tags:
+ - launch-week
+date: '2022-04-15T11:00:00'
+toc_depth: 3
+---
+
+Definitely our most feature-packed month so far. Here's a ton of stuff we shipped throughout March...
+
+## Functions
+
+The one we've all been waiting for. You can now [deploy Javascript & Typescript functions](/blog/2022/03/31/supabase-edge-functions) to Supabase. You can develop and test locally, link a project, and deploy globally to the edge in a matter of seconds!
+
+[](/blog/2022/03/31/supabase-edge-functions)
+
+## GraphQL
+
+You can now [query your Supabase database with GraphQL](/blog/2022/03/29/graphql-now-available). We built this as a postgres extension, so it's portable, open source, and solves some of the problems that exist in other GraphQL implementations.
+
+[](/blog/2022/03/29/graphql-now-available)
+
+## Realtime
+
+Supabase Realtime [now supports multiplayer and presence](/blog/2022/04/01/supabase-realtime-with-multiplayer-features), so you can build collaborative applications like Figma and Google Docs with Supabase. Come and have some fun on our demo application.
+
+[](/blog/2022/04/01/supabase-realtime-with-multiplayer-features)
+
+## Enterprise
+
+[Logging and Observability dashboard](/blog/2022/03/30/supabase-enterprise), Prometheus endpoint, SLAs, premium support, pricing updates, and Point-In-Time-Recovery. Everything you need to use Supabase at scale.
+
+[](/blog/2022/03/30/supabase-enterprise)
+
+## GitHub Secret Scanning
+
+We're now an official [GitHub secret scanning partner](/blog/2022/03/28/community-day#supabase-is-now-a-github-secret-scanning-partner), meaning that if you accidentally push your service_role key to GitHub, you'll get a notification email, and your keys will automatically be rolled on Supabase. For private repos you can disable this.
+
+[](/blog/2022/03/28/community-day#supabase-is-now-a-github-secret-scanning-partner)
+
+## Community Day
+
+[PostgREST 10 pre-release](/blog/2022/03/28/community-day#postgrest-10-pre-release), new OAuth providers, Next-JS auth helpers, new courses, and an open source Partner Gallery.
+
+[](/blog/2022/03/28/community-day)
+
+## Should I open source my company?
+
+[We wrote an article](/blog/2022/03/25/should-i-open-source-my-company) for anyone considoring making their codebase open source. We explore the advantages and tackle some common concerns.
+
+[](/blog/2022/03/25/should-i-open-source-my-company)
+
+## Supabrew - Never Code Thirsty
+
+For April Fools - [we announced a non-alcoholic](/blog/2022/04/01/supabrew), light, and refreshing brew. Perfect for coding late into the night. We're pushing the boundaries of Developer Experience.
+
+[](/blog/2022/04/01/supabrew)
+
+## Video Highlights
+
+Relive all the action from Launch Week 4:
+- [Community Day Live Stream](https://www.youtube.com/watch?v=D0gIgjozOzc) on YouTube
+- [GraphQL Announcement Live Stream](https://www.youtube.com/watch?v=fApxu_U_hdw) on YouTube
+- [Enterprise Announcements Live Stream](https://www.youtube.com/watch?v=UZrl1cwzTDg) on YouTube
+- [Functions Announcement with Deno Team](https://www.youtube.com/watch?v=Xci5SOv76k0) on YouTube
+- [Realtime Demo App](https://www.youtube.com/watch?v=BelYEMJ2N00) on YouTube
+- [Realtime Remix w/Supabase Launch Party](https://www.youtube.com/watch?v=rntEMgaenHs) on YouTube
+- [Building an Image Gallery with Vercel](https://www.youtube.com/watch?v=BSoRXk1FIw8) by Lee Robinson
+
+## Hiring
+
+We're Hiring - for a ton of new roles across engineering, marketing, and HR. We hire fully remotely, and you'll get to work alongside some incredible people, on one of the fastest growing open source companies. [See which roles we're hiring for](https://about.supabase.com/careers).
+
+[](https://about.supabase.com/careers)
+
+## Twitter
+
+We're having a 24/7*365 meme-fest on [Twitter](https://twitter.com/supabase). Come join us.
+
+[](https://twitter.com/supabase)
+
+## TikTok
+
+Check us out on [TikTok](https://www.tiktok.com/@supabase.com?fromUrl=%2Fsupabase.com&lang=en)
+
+[](https://www.tiktok.com/@supabase.com?fromUrl=%2Fsupabase.com&lang=en)
+
+## Swag Store
+
+A reminder that we have a [Supabase Swag Store](https://store.supabase.com)
+
+[](https://store.supabase.com)
+
+## GitHub
+
+We hit 30K stars!!: [github.com/supabase/supabase](http://github.com/supabase/supabase)
+
+## Get started
+
+- Start using Supabase today: **[app.supabase.io](https://app.supabase.io/)**
+- Make sure to **[star us on GitHub](https://github.com/supabase/supabase)**
+- Follow us **[on Twitter](https://twitter.com/supabase)**
+- Subscribe to our **[YouTube channel](https://www.youtube.com/c/supabase)**
+- Become a **[sponsor](https://github.com/sponsors/supabase)**
diff --git a/www/_blog/2022-04-18-bring-the-func-hackathon-winners.mdx b/www/_blog/2022-04-18-bring-the-func-hackathon-winners.mdx
new file mode 100644
index 00000000000..bf619282d2c
--- /dev/null
+++ b/www/_blog/2022-04-18-bring-the-func-hackathon-winners.mdx
@@ -0,0 +1,102 @@
+---
+title: 'Bring the Func Hackathon Winners 2022'
+description: Celebrating many amazing OSS Hackathon projects using GraphQL and Edge Functions.
+author: thor_schaeff
+author_url: https://github.com/thorwebdev
+author_image_url: https://github.com/thorwebdev.png
+authorURL: https://github.com/thorwebdev
+image: hackathon-winners/bring-the-func/funcwinners.png
+thumb: hackathon-winners/bring-the-func/funcwinners.png
+tags:
+ - community
+ - hackathon
+date: '2022-04-18'
+toc_depth: 2
+---
+
+To cool down from [our latest launch week](/blog/2022/03/25/supabase-launch-week-four) we (virtually) sat down with y'all and started hacking, and once again we absolutely loved your hackathon submissions and are excited to send some extremely limited swag your way and plant some trees for each of your submitted projects!
+
+As always, it was challenging to pick the winners from all the great submissions! You can see all the amazing projects submitted on [madewithsupabase.com](https://www.madewithsupabase.com/bring-the-func). And now, without further ado, let's look at some of our favourites in more detail:
+
+## Most Impressive GraphQL Project
+
+### Winner
+
+[mintbaseXsupabase](https://github.com/3lLobo/mintbaseXsupabase) - by [@Flowolfpro](https://twitter.com/Flowolfpro) and [@the_reshma](https://twitter.com/the_reshma)
+
+Think NFTs meet Instagram, this app lets you browse, like, and comment on NFTs.
+
+[](https://github.com/3lLobo/mintbaseXsupabase)
+
+### Runner Up
+
+[Pgm Dictionary](https://github.com/n4ze3m/PgmDictionary) - by [@n4ze3m](https://twitter.com/n4ze3m)
+
+This UrbanDictionary clone uses NextJS, Mantine, and Supabase to power a community dictionary project.
+
+A great idea that deserves some silver tees!
+
+[](https://github.com/n4ze3m/PgmDictionary)
+
+## Most Interesting Usage Of Edge Functions
+
+### Winner
+
+[Wen NFT](https://github.com/gbibeaul/supabase-wen) - by [@gbibeaul](https://twitter.com/gbibeaul)
+
+Next up is the category for our newest feature, Edge Functions! The winner here is Wen NFT, which helps anyone manage NFT communities by helping to prove ownership for community access.
+
+[](https://github.com/gbibeaul/supabase-wen)
+
+### Runner Up
+
+[DocuPool](https://github.com/emilioschepis/docupool) - by [@emilioschepis](https://twitter.com/emilioschepis) and brother Federico.
+
+Docupool is our runner up in the Edge Functions category. Emilio and brother Federico built Docupool to let you share documents and notes, and unlock other people’s content with tokens you collect through the app.
+
+[](https://github.com/emilioschepis/docupool)
+
+## Most Fun / Most Visually Pleasing
+
+### Winner
+
+[AbileneX](https://github.com/okezieuc/abilenex) - by [@okeziechiedozie](https://github.com/okeziechiedozie)
+
+Our final category is Most Fun or Visually Pleasing, and AbileneX is our winner. This free tool creates links you can share to gather feedback on your ideas.
+
+[](https://github.com/okezieuc/abilenex)
+
+### Runner Up
+
+[Kardow](https://github.com/Kardow/kardow-app) - by [SimonGingras18](https://twitter.com/SimonGingras18)
+
+Kardow is our runner up for Most Fun or Visually Pleasing. This project management tool lets you customize your UI while you add and manage your tasks.
+
+[](https://github.com/Kardow/kardow-app)
+
+## The Prizes
+
+As is now tradition with Supabase Hackathons, the winners will receive an extremely limited edition gold medal shirt.
+
+
+
+And the runner uppers will receive the same shirt but in silver. These shirts are limited to winners of the hackathon and will never be produced again. Keep them safe like your favourite NFTs!
+
+## Hang out with us and the community
+
+If you want to join the community and build with us, find other people using Supabase, or if you just want to chill and watch people build, come and join us in Discord!
+
+[Join our Discord](https://discord.supabase.com)
+
+
+
+### Get Started Guides
+
+If you're inspired to build, check out some of the latest resources:
+
+- Getting started with [GraphQL on Supabase](https://supabase.com/blog/2022/03/29/graphql-now-available#getting-started)
+- [GraphQL HackerNews clone](https://supabase-graphql-example.vercel.app/)
+- [Edge Functions Guide](https://supabase.com/docs/guides/functions)
+- [Edge Functions Quickstart video](https://youtu.be/rzglqRdZUQE)
+- [Supabase CLI local development guide](https://supabase.com/docs/guides/local-development)
+- [Edge Functions examples](https://github.com/supabase/supabase/tree/master/examples/edge-functions)
diff --git a/www/_blog/2022-04-20-partner-gallery-works-with-supabase.mdx b/www/_blog/2022-04-20-partner-gallery-works-with-supabase.mdx
new file mode 100644
index 00000000000..eaea01bbd94
--- /dev/null
+++ b/www/_blog/2022-04-20-partner-gallery-works-with-supabase.mdx
@@ -0,0 +1,218 @@
+---
+title: Works With Supabase - announcing our Partner Gallery
+description: Introducing our Partner Gallery - open source and made with Supabase.
+author: alaister,shanerice,thor_schaeff
+image: partner-gallery/partner-showcase-thumb.png
+thumb: partner-gallery/partner-showcase-thumb.png
+tags:
+ - community
+ - partnerships
+date: '2022-04-20'
+toc_depth: 3
+---
+
+# Introducing our Partner Gallery - open source and made with Supabase
+
+Supabase is a collaborative effort across many open-source projects, and we’re incredibly fortunate that you all have rallied around us to make Supabase what it is today.
+
+To keep track of all the great tools and people that “Work With Supabase”, we’ve built a [Partner Gallery](/partners) that showcases integration partners who are extending how Supabase works, as well as experts who are certified to help you build new, exciting things.
+
+
+
+As with anything at Supabase, the Partner Gallery is built on top of the [Supabase stack](/docs/architecture) and is, of course, open-source. If you’re looking to build a partner gallery yourself, feel free to use our template as a start: [github.com/supabase-community/partner-gallery-example](https://github.com/supabase-community/partner-gallery-example). It’s packed with goodies like [Postgres Full Text Search](/docs/guides/database/full-text-search), `next-image` with Supabase Storage, and sending emails based on an insert trigger with Supabase Edge Functions.
+
+# Partner showcase - new integrations and expert services
+
+
+
+## Expert services
+
+Some agencies and developer experts have specialized experience building with Supabase. If you’re looking for the right partner to bring your application to life, check out the experts on [supabase.com/partners/experts](/partners/experts).
+
+If you have expertise developing with Supabase and want to offer your expert services, you can [apply to become a partner today](/partners/integrations#become-a-partner).
+
+Please join us in welcoming our first two experts!
+
+### Morrow
+
+
+
+Morrow is an app development agency headquartered in Bristol, UK. Their mission is to consult, build and support cutting-edge innovation.
+
+Their specialisms are working with Supabase, React Native, Netlify and Swell to produce bespoke solutions that are robust and beautiful.
+
+Morrow was awarded UK App Dev Agency of the Year 2022.
+
+### Quinence
+
+
+
+Quinence is a boutique product development studio from Singapore.
+
+They build digital products that delight. You give them an idea, and they can deliver the complete experience with hyper-scalable infrastructure.
+
+## Integrations
+
+There are so many fantastic tools out there making it easier than ever to build stunning applications or helping you with a specific workflow. We’re ecstatic that many of them chose to integrate with Supabase to give you even more superpowers.
+
+We’re starting off with a selection across auth, developer tools, and low-code tools. If you’ve built a tool that integrates with Supabase, we’d love to [hear from you](/partners/integrations#become-a-partner)!
+
+## Auth
+
+### Clerk
+
+
+
+Clerk authenticates users, manages session tokens, and provides user management functionality that can be used in combination with the authorization logic available in Supabase through PostgreSQL Row Level Security (RLS) policies.
+
+### Stytch
+
+
+
+Stytch provides an all-in-one platform for passwordless auth. Stytch makes it easy for you to embed passwordless solutions into your websites and apps for better security, better conversion rates, and a better end user experience.
+
+## DevTools
+
+### Prisma
+
+
+
+Prisma is an open source next-generation ORM. It consists of the following parts:
+
+- Prisma Client: Auto-generated and type-safe query builder for Node.js & TypeScript.
+- Prisma Migrate: Migration system.
+- Prisma Studio: GUI to view and edit data in your database.
+
+### Snaplet
+
+
+
+Snaplet is a developer tool that copies a Postgres database, transforming personal information, so that you can safely code against actual data. This functionality makes it possible to easily achieve environment parity in Supabase.
+
+### Vercel
+
+
+
+Vercel enables developers to build and publish wonderful things. They build products for developers and designers. And those who aspire to become one. This makes it the perfect tool for building web apps with Supabase.
+
+### pgMustard
+
+
+
+pgMustard speeds up your journey from knowing which query is a problem to working out what can be done about it.
+
+Reading EXPLAIN ANALYZE output can be tough.
+
+Even if you know how, Postgres includes so much useful information, it is easy to miss something important. And for queries that do a lot, the plans are even more useful-yet-time-consuming.
+
+## Low-Code
+
+### Clutch
+
+
+
+What can I achieve with Clutch & Supabase? Anything you can think of where a database would be necessary for your project. Examples include building a blog, real-time chat app, booking platform, and todo list, Supabase, and Clutch provides all the necessary tools to build your projects quickly and efficiently.
+
+### Appsmith
+
+
+
+Appsmith is an open-source framework for building internal tools. It lets you drag-and-drop UI components to build pages, connect to any API, database or GraphQL source and write logic with JavaScript objects.
+
+### Draftbit
+
+
+
+Draftbit is a "pro-code" low-code mobile app building platform. Draftbit exports React Native source code that is 100% run on open-source languages and libraries.
+
+### Plasmic
+
+
+
+By connecting Supabase with Plasmic, a visual builder for the web, you can build data-backed applications without code. While many users leverage Plasmic to quickly launch and iterate on landing pages, Plasmic can be used as a general-purpose visual builder for React, which can be used to design and implement fully featured read-write applications.
+
+### Teta
+
+
+
+Teta is an online cooperative app builder. It allows designers and developers to collaborate in real-time on the design and development of mobile applications, through a convenient visual interface that allows the export of Flutter code.
diff --git a/www/components/AdminAccess/index.tsx b/www/components/AdminAccess/index.tsx
new file mode 100644
index 00000000000..fc7f82059a3
--- /dev/null
+++ b/www/components/AdminAccess/index.tsx
@@ -0,0 +1,26 @@
+import React, { useState } from 'react'
+import Tabs from 'components/AdminAccess/tabs'
+import SectionHeader from 'components/UI/SectionHeader'
+import { useRouter } from 'next/router'
+import SectionContainer from '../Layouts/SectionContainer'
+import ImageCarousel from '../Carousels/ImageCarousel'
+
+import TableViewCarouselData from 'data/products/database/table-view-carousel.json'
+
+import AdminAccessData from 'data/home/admin-access.json'
+
+const AdminAccess = () => {
+ const { basePath } = useRouter()
+ const [tabId, setTabId] = useState('tabTableEditor')
+
+ return (
+
+
+
Build your app without leaving the dashboard
+
+
+
+ )
+}
+
+export default AdminAccess
diff --git a/www/components/AdminAccess/tabs.tsx b/www/components/AdminAccess/tabs.tsx
new file mode 100644
index 00000000000..753b2f85b44
--- /dev/null
+++ b/www/components/AdminAccess/tabs.tsx
@@ -0,0 +1,68 @@
+import TabMarkup from 'data/AdminAccess.json'
+import { Tabs as SBTabs, Button } from '@supabase/ui'
+
+type Props = {
+ tabId: string
+ setTabId: Function
+}
+
+function Tabs(props: Props) {
+ const { tabId, setTabId } = props
+
+ function handleTabChange(id: string) {
+ return setTabId(id)
+ }
+
+ return (
+
+ )
+}
+
+export default Tabs
diff --git a/www/components/AuthWidget/AuthComponentExample.tsx b/www/components/AuthWidget/AuthComponentExample.tsx
new file mode 100644
index 00000000000..ec0e3b3e7c0
--- /dev/null
+++ b/www/components/AuthWidget/AuthComponentExample.tsx
@@ -0,0 +1,251 @@
+import { useEffect, useState } from 'react'
+import { createClient } from '@supabase/supabase-js'
+import {
+ Badge,
+ Button,
+ Card,
+ // Auth,
+ Space,
+ Tabs,
+ IconCode,
+ IconSearch,
+} from '@supabase/ui'
+import CodeBlock from '../CodeBlock/CodeBlock'
+// Import Swiper React components
+import { Swiper, SwiperSlide } from 'swiper/react'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+
+import { useTheme } from '../Providers'
+
+const supabase = createClient(
+ 'https://rsnibhkhsbfnncjmwnkj.supabase.co',
+ 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYxNTIxNDE1MywiZXhwIjoxOTMwNzkwMTUzfQ.OQEbAaTfgDdLCCht251P2JRD3QDnui6nsU8N-tZA_Mc'
+)
+
+function AuthComponentExample() {
+ const { isDarkMode } = useTheme()
+ const { basePath } = useRouter()
+
+ // // store API swiper instance
+ // const [imageSwiper, setImageSwiper] = useState(undefined)
+ // const [imageSwiperActiveIndex, setImageSwiperActiveIndex] = useState(0)
+
+ // function handleNavChange(e: number) {
+ // console.log(e)
+ // setImageSwiperActiveIndex(e)
+ // // @ts-ignore
+ // imageSwiper.slideTo(e)
+ // }
+
+ // const AuthContainer = (props: any) => {
+ // const { user } = Auth.useUser()
+ // if (user) {
+ // return (
+ // <>
+ // Signed in: {user.email}
+ // props.supabaseClient.auth.signOut()}>
+ // Sign out
+ //
+ // >
+ // )
+ // }
+ // return props.children
+ // }
+
+ return (
+
+ {/*
handleNavChange(Number(id))}
+ >
+ }>
+
+
+ } id="1">
+
+
+ */}
+
+
+
+
+
+
+
+
+
+ {'Acme Company'}
+
+
Demo
+
+ Sign in with
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+
+
+ */}
+
+
+
+
+
+
+
+
+ Signed in: {user.email}
+ props.supabaseClient.auth.signOut()}>
+ Sign out
+
+
+ )
+ }
+ return props.children;
+ };
+
+ return (
+
+
+
+
+
+ );
+}
+`}
+ lang="js"
+ />
+
+
+
+
+
+ )
+}
+
+export default AuthComponentExample
diff --git a/www/components/AuthWidget/AuthWidget.tsx b/www/components/AuthWidget/AuthWidget.tsx
new file mode 100644
index 00000000000..87aa96947cf
--- /dev/null
+++ b/www/components/AuthWidget/AuthWidget.tsx
@@ -0,0 +1,235 @@
+import { useState } from 'react'
+import { createClient, Provider } from '@supabase/supabase-js'
+
+import DefaultLayout from '~/components/Layouts/Default'
+import CodeBlock from '~/components/CodeBlock/CodeBlock'
+import {
+ Button,
+ // Auth,
+ Card,
+ Checkbox,
+ Divider,
+ Radio,
+ Select,
+ Space,
+ Tabs,
+ Input,
+ Toggle,
+ IconCode,
+ IconZoomIn,
+ IconCopy,
+ IconColumns,
+} from '@supabase/ui'
+
+import AuthStyles from './Auth.module.css'
+
+function AuthPage() {
+ const supabase = createClient(
+ 'https://rsnibhkhsbfnncjmwnkj.supabase.co',
+ 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYxNTIxNDE1MywiZXhwIjoxOTMwNzkwMTUzfQ.OQEbAaTfgDdLCCht251P2JRD3QDnui6nsU8N-tZA_Mc'
+ )
+
+ type SizeProps = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge'
+ type LayoutProps = 'horizontal' | 'vertical'
+
+ const [companyName, setCompanyName] = useState('Acme Company')
+ const [widgetSize, setWidgetSize] = useState('tiny')
+ const [socialLogins, setSocialLogins] = useState(true)
+ const [socialLoginLayout, setSocialLoginLayout] = useState('horizontal')
+ const [socialColors, setSocialColors] = useState(false)
+
+ const socials: Provider[] = ['facebook', 'google', 'bitbucket', 'github', 'gitlab']
+
+ const formSize = 'small'
+ const formLayout = 'vertical'
+
+ return (
+
+
+
+
+
ReactJS Auth Widget
+
+ An API built from the groud up just for Storage.With powerful library clients coming
+ soon that allow for asset optimasation and image transformation
+
+
+
+
+
+
+ }>
+ Copy code
+
+ }>
+ Customise
+
+ ,
+ ]}
+ >
+ }>
+
+
+
+
+
+
+ {companyName}
+
+
+ {/* */}
+
+
+
+
+ } id="panel-2">
+
+
+
+
+
+
+ )
+ }
+ `}
+ lang="js"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
Customise your login form
+
Our ReactJS Auth form will help you get going even quicker
+
+
+ setCompanyName(e.target.value)}
+ />
+ {/* @ts-ignore */}
+
+
+
+ setSocialLogins(!socialLogins)}
+ />
+ {socialLogins && (
+ <>
+
+ {/* @ts-ignore */}
+ ) =>
+ // @ts-ignore
+ setSocialLoginLayout(e.target.value)
+ }
+ >
+
+
+
+ setSocialColors(!socialColors)}
+ />
+ >
+ )}
+
+
+
+ setWidgetSize(e.target.value)}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default AuthPage
diff --git a/www/components/Blog/BlogHeader.tsx b/www/components/Blog/BlogHeader.tsx
new file mode 100644
index 00000000000..c1c494969c0
--- /dev/null
+++ b/www/components/Blog/BlogHeader.tsx
@@ -0,0 +1,19 @@
+import React from 'react'
+
+interface Props {
+ title: string
+}
+
+export default function BlogHeader({ title }: Props) {
+ return (
+
+ )
+}
diff --git a/www/components/Blog/BlogListItem.tsx b/www/components/Blog/BlogListItem.tsx
new file mode 100644
index 00000000000..b1a70d0abce
--- /dev/null
+++ b/www/components/Blog/BlogListItem.tsx
@@ -0,0 +1,76 @@
+import authors from 'lib/authors.json'
+import Image from 'next/image'
+import React from 'react'
+import Author from '~/types/author'
+import PostTypes from '~/types/post'
+
+interface Props {
+ post: PostTypes
+}
+
+const BlogListItem = ({ post }: Props) => {
+ const authorArray: string[] | undefined = post.author ? post.author.split(',') : []
+ const author = []
+
+ if (authorArray) {
+ for (let i = 0; i < authorArray.length; i++) {
+ author.push(
+ authors.find((authors: Author) => {
+ return authors.author_id === authorArray[i]
+ })
+ )
+ }
+ }
+
+ return (
+
+ )
+}
+
+export default BlogListItem
diff --git a/www/components/BuiltWithSupabase/index.tsx b/www/components/BuiltWithSupabase/index.tsx
new file mode 100644
index 00000000000..e928f6994bf
--- /dev/null
+++ b/www/components/BuiltWithSupabase/index.tsx
@@ -0,0 +1,50 @@
+import { useRouter } from 'next/router'
+import { Button, IconGitHub } from '@supabase/ui'
+import SectionContainer from '../Layouts/SectionContainer'
+import ExampleCard from '../ExampleCard'
+
+import Examples from 'data/Examples.json'
+import Link from 'next/link'
+// import Button from '../Button'
+
+const BuiltExamples = () => {
+ const { basePath } = useRouter()
+ return (
+
+
+
What can you build with supabase?
+
There are many example apps and starter projects to get going
+
+
+
+ View all examples
+
+
+
+ } size="small">
+ Official github library
+
+
+
+
+
+ {Examples.slice(0, 6).map((example, i) => {
+ return (
+
2 && `sm:hidden lg:block`}`}
+ key={i}
+ >
+
+
+ )
+ })}
+
+
+ )
+}
+
+export default BuiltExamples
diff --git a/www/components/Button.tsx b/www/components/Button.tsx
new file mode 100644
index 00000000000..ecf4b18e8d0
--- /dev/null
+++ b/www/components/Button.tsx
@@ -0,0 +1,57 @@
+import Link from 'next/link'
+
+type Props = {
+ type?: 'primary' | 'secondary'
+ text: string
+ url?: string
+ className?: string
+ hideArrow?: boolean
+}
+
+const Button = (props: Props) => {
+ const { type = 'primary', text, url, className, hideArrow = false } = props
+
+ const colorClass =
+ type === 'primary'
+ ? 'px-3 py-2 shadow-sm border border-transparent text-white bg-brand-700 hover:bg-brand-800 focus:ring-2 focus:ring-offset-2 focus:ring-brand-500'
+ : 'text-brand-700 bg-none'
+
+ const textClass = type === 'primary' ? 'font-medium left-3 group-hover:left-0' : 'font-normal'
+
+ const arrowClass = type === 'primary' ? '' : 'relative -left-1 group-hover:left-0'
+
+ let buttonStyles = {
+ textShadow: 'none',
+ }
+ if (type === 'primary') {
+ buttonStyles.textShadow = '0px 0px 6px rgba(13, 128, 86, 0.8)'
+ }
+
+ const renderButton = () => (
+
+
+ {text}
+
+ {url && (
+
+ →
+
+ )}
+
+ )
+
+ return url ? {renderButton()} : renderButton()
+}
+
+export default Button
diff --git a/www/components/CTABanner/index.tsx b/www/components/CTABanner/index.tsx
new file mode 100644
index 00000000000..5d9cffc6a44
--- /dev/null
+++ b/www/components/CTABanner/index.tsx
@@ -0,0 +1,29 @@
+import { Button } from '@supabase/ui'
+
+const CTABanner = (props: any) => {
+ const { darkerBg } = props
+ return (
+
+
+
+ Build in a weekend,
+ scale to millions
+
+
+
+
+ )
+}
+
+export default CTABanner
diff --git a/www/components/Card.tsx b/www/components/Card.tsx
new file mode 100644
index 00000000000..f6c995195e2
--- /dev/null
+++ b/www/components/Card.tsx
@@ -0,0 +1,100 @@
+import Button from 'components/Button'
+
+type PostMetaProps = {
+ name: string
+ avatarUrl: string
+ publishDate: string
+ readLength: number
+}
+
+type Props = {
+ title: string
+ type: 'Project Example' | 'Case Study' | 'Blog Post'
+ description: string
+ imgUrl: string
+ url: string
+ logoUrl?: string
+ ctaText?: string
+ icons?: any[]
+ postMeta?: PostMetaProps
+}
+
+const Card = (props: Props) => {
+ const {
+ title,
+ type,
+ description,
+ imgUrl,
+ url,
+ logoUrl = '',
+ ctaText = '',
+ icons = [],
+ postMeta = {
+ name: '',
+ avatarUrl: '',
+ publishDate: '',
+ readLength: '',
+ },
+ } = props
+
+ const iconMarkup =
+ icons &&
+ icons.map((icon: any) => {
+ return (
+
+ )
+ })
+
+ return (
+
+
+
+
+
+
+ {/* {icons && (
+
+ {iconMarkup}
+
+ )} */}
+
{type}
+
+ {/* {logoUrl &&
} */}
+ {title &&
{title}
}
+
+ {type !== 'Project Example' ? postMeta.publishDate : description}
+
+
+
+ {type === 'Case Study' && postMeta.name.length > 0 && (
+
+
+
{postMeta.name}
+
+
+
+
{postMeta.name}
+
+ {postMeta.publishDate}
+ ·
+ {postMeta.readLength} min read
+
+
+
+ )}
+ {ctaText &&
}
+
+
+ )
+}
+
+export default Card
diff --git a/www/components/Carousels/ImageCarousel.module.css b/www/components/Carousels/ImageCarousel.module.css
new file mode 100644
index 00000000000..5a8c40ab2af
--- /dev/null
+++ b/www/components/Carousels/ImageCarousel.module.css
@@ -0,0 +1,6 @@
+/* bright */
+.gradient-bg {
+ background: linear-gradient(338.96deg, rgba(0, 0, 0, 0.2) -18.99%, rgba(0, 0, 0, 0) 25.34%),
+ linear-gradient(300.08deg, #53ffb1 7.6%, #3ecf8e 64.93%);
+ /* transform: rotate(-89.79deg); */
+}
diff --git a/www/components/Carousels/ImageCarousel.tsx b/www/components/Carousels/ImageCarousel.tsx
new file mode 100644
index 00000000000..f461f5bea5c
--- /dev/null
+++ b/www/components/Carousels/ImageCarousel.tsx
@@ -0,0 +1,184 @@
+import { useRouter } from 'next/router'
+import { Tabs, Button, IconCornerRightUp, IconArrowUpRight } from '@supabase/ui'
+import { useState } from 'react'
+
+// Import Swiper React components
+import { Swiper, SwiperSlide } from 'swiper/react'
+
+// Import Swiper styles
+import 'swiper/swiper.min.css'
+
+import ImageCarouselStyles from './ImageCarousel.module.css'
+import Link from 'next/link'
+import Image from 'next/image'
+import TextLink from '../TextLink'
+
+interface Content {
+ title: string
+ label?: string
+ img_url?: string
+ video_url?: string
+ text?: string
+ cta?: string
+ url?: string
+}
+
+interface ImageCarouselProps {
+ content: Content[]
+ footer?: React.ReactNode
+ altTabView?: boolean
+}
+
+function ImageCarousel(props: ImageCarouselProps) {
+ // base path for images
+ const { basePath } = useRouter()
+
+ // store API swiper instance
+ const [imageSwiper, setImageSwiper] = useState(undefined)
+ const [swiperDetails, setSwiperDetails] = useState(undefined)
+
+ const [imageSwiperActiveIndex, setImageSwiperActiveIndex] = useState(0)
+
+ function handleImageSwiperNav(e: number) {
+ setImageSwiperActiveIndex(e)
+ // @ts-ignore
+ imageSwiper.slideTo(e)
+ // @ts-ignore
+ swiperDetails.slideTo(e)
+ }
+
+ const details = (
+
+
+ Allow fetch something
+
+
+
+ This would only allow the authenticated user access to a folder that is named after their
+ own account UID. This is useful for things like profile images.
+
+
+
+ }>
+ View documentation
+
+
+
+ )
+
+ return (
+
+
+
+
+ handleImageSwiperNav(Number(id))}
+ >
+ {props.content.map((content: Content, i) => {
+ return (
+
+
+
+ )
+ })}
+
+
+
+
+ {props.content.map((content: Content, i: number) => {
+ return (
+
+ {content.img_url && (
+
+ )}
+ {content.video_url && (
+
+ Your browser does not support the video tag
+
+ )}
+
+ )
+ })}
+
+
+
+
+
+
+ handleImageSwiperNav(Number(id))}
+ >
+ {props.content.map((content: Content, i: number) => {
+ return (
+
+ )
+ })}
+
+
+
+ {props.content.map((content, i) => {
+ return (
+
+ {content.title}
+ {content.text}
+
+
+ )
+ })}
+ {props.footer && {props.footer}
}
+
+
+
+ )
+}
+
+export default ImageCarousel
diff --git a/www/components/Carousels/SplitCodeBlockCarousel.tsx b/www/components/Carousels/SplitCodeBlockCarousel.tsx
new file mode 100644
index 00000000000..ee4e7cb1197
--- /dev/null
+++ b/www/components/Carousels/SplitCodeBlockCarousel.tsx
@@ -0,0 +1,152 @@
+import { useState } from 'react'
+// Import Swiper React components
+import { Swiper, SwiperSlide } from 'swiper/react'
+
+import { Tabs, Button, Space } from '@supabase/ui'
+import CodeBlock from '../CodeBlock/CodeBlock'
+
+// Import Swiper styles
+import 'swiper/swiper.min.css'
+import { Badge } from '@supabase/ui'
+import Link from 'next/link'
+
+interface Content {
+ lang: 'js' | 'py' | 'sql'
+ title: string
+ code: string
+ detail_title?: string
+ detail_text?: string
+ badges_label?: string
+ badges?: string[]
+ url?: string
+}
+
+interface SplitCodeBlockCarousel {
+ content: Content[]
+ footer?: React.ReactNode
+ altTabView?: boolean
+}
+
+function SplitCodeBlockCarousel(props: SplitCodeBlockCarousel) {
+ // store API swiper instance
+ const [apiSwiper, setApiSwiper] = useState(undefined)
+ const [swiperDetails, setSwiperDetails] = useState(undefined)
+
+ const [apiSwiperActiveIndex, setApiSwiperActiveIndex] = useState(0)
+
+ function handleApiSwiperNavChange(e: number) {
+ setApiSwiperActiveIndex(e)
+ // @ts-ignore
+ apiSwiper.slideTo(e)
+ // @ts-ignore
+ swiperDetails.slideTo(e)
+ }
+
+ const details = (
+
+
+ Allow fetch something
+
+
+
+ This would only allow the authenticated user access to a folder that is named after their
+ own account UID. This is useful for things like profile images.
+
+
+
+ View documentation
+
+
+ )
+
+ return (
+
+
handleApiSwiperNavChange(Number(id))}
+ type="pills"
+ >
+ {props.content.map((extension, i) => {
+ return (
+
+
+
+ )
+ })}
+
+
+
+ {props.content.map((extension, i) => {
+ return (
+
+
+ {extension.code}
+
+
+ )
+ })}
+
+
+
+
+ {props.content.map((extension, i) => {
+ return (
+
+
+
+ {extension.detail_title}
+
+
+ {extension.detail_text}
+
+ {extension.url && (
+
+
+
+ View documentation
+
+
+
+ )}
+
+
{extension.badges_label}
+ {extension.badges &&
+ extension.badges.map((badge, i) => {
+ return
{badge}
+ })}
+
+
+
+ )
+ })}
+
+
+
+ )
+}
+
+export default SplitCodeBlockCarousel
diff --git a/www/components/CaseStudies/benchmark.tsx b/www/components/CaseStudies/benchmark.tsx
new file mode 100644
index 00000000000..4c97dc281fc
--- /dev/null
+++ b/www/components/CaseStudies/benchmark.tsx
@@ -0,0 +1,44 @@
+import { Button } from '@supabase/ui'
+import { useRouter } from 'next/router'
+
+const Benchmark = () => {
+ const { basePath } = useRouter()
+ return (
+
+
+
+
+
+
+
+ Built for speed and reliability
+
+
+
+ Supabase outperforms equivalent systems by more than 300%.
+
+
+ Sign up for our public benchmark release and we'll send it to your inbox.
+
+
+
+
+
+
+
+ )
+}
+
+export default Benchmark
diff --git a/www/components/CaseStudies/index.tsx b/www/components/CaseStudies/index.tsx
new file mode 100644
index 00000000000..5093d3ecc36
--- /dev/null
+++ b/www/components/CaseStudies/index.tsx
@@ -0,0 +1,42 @@
+import SectionHeader from 'components/UI/SectionHeader'
+import CaseStudiesData from 'data/CaseStudies.json'
+import { useRouter } from 'next/router'
+import BlogListItem from '../Blog/BlogListItem'
+import SectionContainer from '../Layouts/SectionContainer'
+
+const CaseStudies = () => {
+ const { basePath } = useRouter()
+
+ return (
+
+
+
+
+
+ {CaseStudiesData.map((caseStudy, idx: number) => (
+
+ ))}
+
+
+ )
+}
+
+export default CaseStudies
diff --git a/www/components/CodeBlock/CodeBlock.module.css b/www/components/CodeBlock/CodeBlock.module.css
new file mode 100644
index 00000000000..364e15058e9
--- /dev/null
+++ b/www/components/CodeBlock/CodeBlock.module.css
@@ -0,0 +1,46 @@
+.code-block {
+ @apply overflow-hidden;
+}
+
+.code-line {
+ @apply block;
+ transition: filter 500ms ease, opacity 500ms ease;
+ transition-delay: 200ms;
+}
+
+.code-block .code-line:first-of-type {
+ @apply flex items-end h-8;
+}
+
+.code-block .code-line:first-of-type :global(.linenumber) {
+ @apply items-end self-stretch;
+}
+
+.code-block .code-line:first-of-type > :global(*:not(.linenumber)) {
+ @apply pb-1;
+}
+
+.code-block .code-line:last-of-type {
+ @apply flex items-start h-8;
+}
+
+.code-block .code-line:last-of-type :global(.linenumber) {
+ @apply items-start self-stretch;
+}
+
+.code-block .code-line:last-of-type > :global(*:not(.linenumber)) {
+ @apply pt-1;
+}
+
+.code-block code .linenumber {
+ margin-right: 4px;
+}
+
+.code-block code::after,
+.code-block code::before {
+ content: none !important;
+}
+
+.code-line--flash {
+ @apply animate-flash-code-slow;
+}
diff --git a/www/components/CodeBlock/CodeBlock.tsx b/www/components/CodeBlock/CodeBlock.tsx
new file mode 100644
index 00000000000..1058882e8bf
--- /dev/null
+++ b/www/components/CodeBlock/CodeBlock.tsx
@@ -0,0 +1,129 @@
+import { useCallback, useMemo } from 'react'
+import reactSyntaxHighlighter, { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
+import monokaiCustomTheme from 'data/CodeEditorTheme'
+import CodeBlockStyles from './CodeBlock.module.css'
+import { Button, IconCopy } from '@supabase/ui'
+import CopyToClipboard from 'react-copy-to-clipboard'
+import rangeParser from 'parse-numeric-range'
+
+import classNames from 'classnames'
+
+import js from 'react-syntax-highlighter/dist/cjs/languages/hljs/javascript'
+import ts from 'react-syntax-highlighter/dist/cjs/languages/hljs/typescript'
+import py from 'react-syntax-highlighter/dist/cjs/languages/hljs/python'
+import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'
+
+export interface CodeBlockProps {
+ lang: 'js' | 'ts' | 'sql' | 'py'
+ startingLineNumber?: number
+ hideCopy?: boolean
+ className?: string
+ children?: string
+ size?: 'small' | 'medium' | 'large'
+ /**
+ * Inline styling
+ * Supports CSS Properties in camelcase
+ */
+ style?: React.CSSProperties | undefined
+ /**
+ * Lines to be highlighted.
+ * Supports individual lines: '14', multiple lines: '14,15', or a range of lines '14..19'
+ */
+ highlightLines?: string
+ hideBorder?: boolean
+}
+
+function CodeBlock(props: CodeBlockProps) {
+ let lang = props.lang
+ ? props.lang
+ : props.className
+ ? props.className.replace('language-', '')
+ : 'js'
+ // force jsx to be js highlighted
+ if (lang === 'jsx') lang = 'js'
+ if (lang === 'tsx') lang = 'ts'
+
+ SyntaxHighlighter.registerLanguage('js', js)
+ SyntaxHighlighter.registerLanguage('ts', ts)
+ SyntaxHighlighter.registerLanguage('py', py)
+ SyntaxHighlighter.registerLanguage('sql', sql)
+
+ // const large = props.size === 'large' ? true : false
+ const large = false
+
+ const shouldHighlightLines = props.highlightLines !== undefined
+ const highlightLines = useMemo(
+ () => new Set(rangeParser(props.highlightLines ?? '')),
+ [props.highlightLines]
+ )
+
+ const lineProps = useCallback(
+ (lineNumber: number) => {
+ const shouldHighlightLine = !shouldHighlightLines || highlightLines.has(lineNumber)
+
+ const style = shouldHighlightLine ? {} : { filter: 'grayscale(75%)', opacity: 0.5 }
+
+ return {
+ class: classNames(
+ CodeBlockStyles['code-line'],
+ shouldHighlightLines && shouldHighlightLine && CodeBlockStyles['code-line--flash']
+ ),
+ style,
+ }
+ },
+ [highlightLines]
+ )
+
+ return (
+
+
+ {props.children}
+
+
+ {!props.hideCopy && props.children ? (
+
+
+ }>
+ Copy
+
+
+
+ ) : null}
+
+ )
+}
+
+export default CodeBlock
diff --git a/www/components/Container.tsx b/www/components/Container.tsx
new file mode 100644
index 00000000000..f0bbb25c01e
--- /dev/null
+++ b/www/components/Container.tsx
@@ -0,0 +1,11 @@
+import { ReactNode, FunctionComponent } from 'react'
+
+type Props = {
+ children?: ReactNode
+}
+
+const Container: FunctionComponent = ({ children }: Props) => {
+ return {children}
+}
+
+export default Container
diff --git a/www/components/CountUp.tsx b/www/components/CountUp.tsx
new file mode 100644
index 00000000000..16597982056
--- /dev/null
+++ b/www/components/CountUp.tsx
@@ -0,0 +1,61 @@
+import { useState, useEffect } from 'react'
+
+type Props = {
+ children: any
+ duration?: number
+ triggerAnimOnScroll?: boolean
+ referenceElId?: string
+}
+
+const easeOutQuad = (t: number) => t * (2 - t)
+const frameDuration = 1000 / 60
+
+const CountUp = (props: Props) => {
+ const { children, duration = 2000, triggerAnimOnScroll = false, referenceElId = '' } = props
+ const countTo = parseInt(children, 10)
+ const [count, setCount] = useState(0)
+ const [animTriggered, setAnimTriggered] = useState(false)
+
+ useEffect(() => {
+ let frame = 0
+ const totalFrames = Math.round(duration / frameDuration)
+
+ async function handleScroll() {
+ const reference = document.getElementById(referenceElId)
+ if (reference && !animTriggered) {
+ const yOffset = reference.getBoundingClientRect().top - window.innerHeight + 20
+ if (yOffset <= 0) {
+ setAnimTriggered(true)
+ setCount(0)
+ const counter = setInterval(() => {
+ frame++
+ const progress = easeOutQuad(frame / totalFrames)
+ setCount(countTo * progress)
+
+ if (frame === totalFrames) clearInterval(counter)
+ }, frameDuration)
+ }
+ }
+ }
+
+ if (triggerAnimOnScroll) {
+ window.addEventListener('scroll', handleScroll, { passive: true })
+ } else {
+ const counter = setInterval(() => {
+ frame++
+ const progress = easeOutQuad(frame / totalFrames)
+ setCount(countTo * progress)
+
+ if (frame === totalFrames) clearInterval(counter)
+ }, frameDuration)
+ }
+
+ return () => {
+ if (triggerAnimOnScroll) window.removeEventListener('scroll', handleScroll)
+ }
+ }, [animTriggered])
+
+ return {Math.floor(count)}
+}
+
+export default CountUp
diff --git a/www/components/DarkModeToggle.tsx b/www/components/DarkModeToggle.tsx
new file mode 100644
index 00000000000..a36ab085c57
--- /dev/null
+++ b/www/components/DarkModeToggle.tsx
@@ -0,0 +1,45 @@
+import { useTheme } from '~/components/Providers'
+import { IconSun, IconMoon } from '@supabase/ui'
+
+function DarkModeToggle() {
+ const { isDarkMode, toggleTheme } = useTheme()
+
+ const toggleDarkMode = () => {
+ localStorage.setItem('supabaseDarkMode', (!isDarkMode).toString())
+ toggleTheme()
+
+ const key = localStorage.getItem('supabaseDarkMode')
+ document.documentElement.className = key === 'true' ? 'dark' : ''
+ }
+
+ return (
+
+
+ toggleDarkMode()}
+ >
+ Toggle Themes
+
+
+
+
+ )
+}
+
+export default DarkModeToggle
diff --git a/www/components/EnterpriseContactForm.tsx b/www/components/EnterpriseContactForm.tsx
new file mode 100644
index 00000000000..af4c80eda3a
--- /dev/null
+++ b/www/components/EnterpriseContactForm.tsx
@@ -0,0 +1,163 @@
+import { Button, Form, Input, Select } from '@supabase/ui'
+import { useState } from 'react'
+import countries from '~/data/Countries.json'
+import supabase from '~/lib/supabase'
+
+const INITIAL_VALUES = {
+ companyName: '',
+ contactName: '',
+ contactEmail: '',
+ contactPhone: '',
+ companySize: '',
+ details: '',
+ country: 'US',
+}
+
+const validate = (values: any) => {
+ const errors: any = {}
+
+ if (!values.companyName) {
+ errors.companyName = 'Required'
+ }
+
+ if (!values.contactName) {
+ errors.contactName = 'Required'
+ }
+
+ if (!values.contactEmail) {
+ errors.contactEmail = 'Required'
+ } else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(values.contactEmail)) {
+ errors.contactEmail = 'Invalid email address'
+ }
+
+ return errors
+}
+
+const EnterpriseContactForm = () => {
+ const [formSubmitted, setFormSubmitted] = useState(false)
+
+ const handleFormSubmit = async (values: typeof INITIAL_VALUES, { resetForm }: any) => {
+ const { error } = await supabase.from('enterprise_contacts').insert(
+ [
+ {
+ company_name: values.companyName,
+ contact_name: values.contactName,
+ contact_email: values.contactEmail,
+ contact_phone: values.contactPhone,
+ company_size: values.companySize,
+ details: values.details,
+ country: values.country,
+ },
+ ],
+ { returning: 'minimal' }
+ )
+
+ // TODO: handle error
+ console.log('error:', error)
+ if (!error) {
+ resetForm()
+
+ setFormSubmitted(true)
+ }
+ }
+
+ return (
+
+
+
+ {formSubmitted && (
+
Thanks, we'll reach out to you shortly.
+ )}
+
+ )
+}
+
+export default EnterpriseContactForm
diff --git a/www/components/ExampleCard.tsx b/www/components/ExampleCard.tsx
new file mode 100644
index 00000000000..ffa7ed10284
--- /dev/null
+++ b/www/components/ExampleCard.tsx
@@ -0,0 +1,87 @@
+import { Button, Divider, IconArrowUpRight, IconGitHub, IconTriangle, Space } from '@supabase/ui'
+import Link from 'next/link'
+
+function ExampleCard(props: any) {
+ return (
+ <>
+
+
+
{props.title}
+
{props.description}
+
+
+
{props.author}
+
+
+
+
+
+ >
+ )
+}
+
+export default ExampleCard
diff --git a/www/components/Favicons.tsx b/www/components/Favicons.tsx
new file mode 100644
index 00000000000..5c65346f0fa
--- /dev/null
+++ b/www/components/Favicons.tsx
@@ -0,0 +1,38 @@
+import Head from 'next/head'
+import { useRouter } from 'next/router'
+
+const Favicons = () => {
+ const { basePath } = useRouter()
+ return (
+
+
+
+
+
+ {/* */}
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Favicons
diff --git a/www/components/FeatureColumn.tsx b/www/components/FeatureColumn.tsx
new file mode 100644
index 00000000000..745f97561bc
--- /dev/null
+++ b/www/components/FeatureColumn.tsx
@@ -0,0 +1,11 @@
+function FeatureColumn({ icon, title, text }: any) {
+ return (
+ <>
+ {icon && {icon}
}
+ {title}
+ {text}
+ >
+ )
+}
+
+export default FeatureColumn
diff --git a/www/components/Features/index.tsx b/www/components/Features/index.tsx
new file mode 100644
index 00000000000..21dbc854381
--- /dev/null
+++ b/www/components/Features/index.tsx
@@ -0,0 +1,41 @@
+import { Button, Badge, IconArrowRight } from '@supabase/ui'
+import SectionHeader from 'components/UI/SectionHeader'
+import Solutions from 'data/Solutions.json'
+import Link from 'next/link'
+import SectionContainer from '../Layouts/SectionContainer'
+import ProductIcon from '../ProductIcon'
+import TextLink from '../TextLink'
+
+const Features = () => {
+ const IconSections = Object.values(Solutions).map((solution: any) => {
+ const { name, description, icon, label, url } = solution
+ return (
+
+
+
+
{description}
+
+ {label && (
+
+ {label}
+
+ )}
+ {url &&
}
+
+ )
+ })
+
+ return (
+
+ Build faster and focus on your products
+
+ {IconSections}
+
+
+ )
+}
+
+export default Features
diff --git a/www/components/FloatingIcons/FloatingIcons.module.css b/www/components/FloatingIcons/FloatingIcons.module.css
new file mode 100644
index 00000000000..9c8c30e4398
--- /dev/null
+++ b/www/components/FloatingIcons/FloatingIcons.module.css
@@ -0,0 +1,36 @@
+.icon-react-one {
+ @apply absolute w-20 z-10;
+ right: 13%;
+ top: 8%;
+}
+.icon-electron {
+ @apply absolute w-16 z-0;
+ left: 17%;
+ top: 25%;
+}
+.icon-vue {
+ @apply absolute w-16 z-10;
+ right: 33%;
+ top: 3%;
+}
+.icon-angular {
+ @apply absolute w-12 z-10;
+ right: 21%;
+ top: 28%;
+}
+.icon-flutter {
+ @apply absolute w-16 z-10;
+ left: 5%;
+ top: 15%;
+}
+.icon-nuxt {
+ @apply absolute w-12 z-10;
+ right: 5%;
+ top: 28%;
+}
+.icon-redwood {
+ @apply absolute w-14 z-10;
+ /* background-color: yellow; */
+ left: 15%;
+ top: 5%;
+}
diff --git a/www/components/FloatingIcons/FloatingIcons.tsx b/www/components/FloatingIcons/FloatingIcons.tsx
new file mode 100644
index 00000000000..d5d95f60697
--- /dev/null
+++ b/www/components/FloatingIcons/FloatingIcons.tsx
@@ -0,0 +1,45 @@
+import { useRouter } from 'next/router'
+
+import Styles from './FloatingIcons.module.css'
+
+function FloatingIcons() {
+ // base path for images
+ const { basePath } = useRouter()
+
+ return (
+
+ )
+}
+
+export default FloatingIcons
diff --git a/www/components/FloatingIcons/index.tsx b/www/components/FloatingIcons/index.tsx
new file mode 100644
index 00000000000..87ca7e9ea48
--- /dev/null
+++ b/www/components/FloatingIcons/index.tsx
@@ -0,0 +1,3 @@
+import FloatingIcons from './FloatingIcons'
+
+export default FloatingIcons
diff --git a/www/components/Footer/index.tsx b/www/components/Footer/index.tsx
new file mode 100644
index 00000000000..aa6cda77fe0
--- /dev/null
+++ b/www/components/Footer/index.tsx
@@ -0,0 +1,138 @@
+import { useRouter } from 'next/router'
+import FooterLinks from 'data/Footer.json'
+import SectionContainer from '../Layouts/SectionContainer'
+import DarkModeToggle from '../DarkModeToggle'
+import Link from 'next/link'
+import { useTheme } from '../Providers'
+import { Badge } from '@supabase/ui'
+import Image from 'next/image'
+
+const Footer = () => {
+ const { basePath } = useRouter()
+ const { isDarkMode } = useTheme()
+
+ return (
+
+
+
+
+
+
+
+ {FooterLinks.map((segment: any) => {
+ return (
+
+ )
+ })}
+
+
+
+
+ © Supabase Inc
+
+
+
+
+ )
+}
+
+export default Footer
diff --git a/www/components/Hero.tsx b/www/components/Hero.tsx
new file mode 100644
index 00000000000..516d79c7c8d
--- /dev/null
+++ b/www/components/Hero.tsx
@@ -0,0 +1,113 @@
+import { Button, IconBookOpen, Space } from '@supabase/ui'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import SectionContainer from './Layouts/SectionContainer'
+
+const Hero = () => {
+ const { basePath } = useRouter()
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ The Open Source
+ Firebase Alternative
+
+
+
+ Create a backend in less than 2 minutes. Start your project with a
+ Postgres Database, Authentication, instant APIs, Realtime subscriptions
+ and Storage.
+
+
+
+
+
+
+ Start your project
+
+
+
+ }>
+ Documentation
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+ Replace src with the following if have preference:
+ Vimeo: https://player.vimeo.com/video/485959063?loop=1&autoplay=1
+ Youtube: https://www.youtube-nocookie.com/embed/dBOSUER_5T4?playlist=dBOSUER_5T4&autoplay=1&loop=1&controls=0&modestbranding=1&rel=0&disablekb=1&mute=1&muted=1
+ */}
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Hero
diff --git a/www/components/ImageGrid.tsx b/www/components/ImageGrid.tsx
new file mode 100644
index 00000000000..bae22b51b5c
--- /dev/null
+++ b/www/components/ImageGrid.tsx
@@ -0,0 +1,121 @@
+import { useRouter } from 'next/router'
+import Image from 'next/image'
+
+import Link from 'next/link'
+interface iImages {
+ name: string
+ image: string
+ alt?: string
+ link?: string
+}
+
+type colSizes = 8 | 6 | 4 | 3
+type paddingSizes = 6 | 8 | 12
+
+interface iImageGrid {
+ images: iImages[]
+ smCols?: colSizes
+ mdCols?: colSizes
+ lgCols?: colSizes
+ padding?: paddingSizes
+ className?: string
+}
+
+const ImageGrid = ({
+ images,
+ smCols = 3,
+ mdCols = 6,
+ lgCols = 8,
+ padding = 8,
+ className,
+}: iImageGrid) => {
+ const smBreakpoint = {
+ 3: 'grid-cols-3',
+ 4: 'grid-cols-4',
+ 6: 'grid-cols-6',
+ 8: 'grid-cols-8',
+ }
+
+ const mdBreakpoint = {
+ 3: 'md:grid-cols-3',
+ 4: 'md:grid-cols-4',
+ 6: 'md:grid-cols-6',
+ 8: 'md:grid-cols-8',
+ }
+
+ const lgBreakpoint = {
+ 3: 'lg:grid-cols-3',
+ 4: 'lg:grid-cols-4',
+ 6: 'lg:grid-cols-6',
+ 8: 'lg:grid-cols-8',
+ }
+
+ const imgPadding = {
+ 6: 'h-6 ',
+ 8: 'h-8 ',
+ 12: 'h-12 ',
+ }
+
+ return (
+
+ {images.map((x, i) => {
+ const Container = ({ children, link }: any) => {
+ if (x.link) {
+ return (
+
+
+ {children}
+
+
+ )
+ } else {
+ return children
+ }
+ }
+
+ return (
+
+
+
+ )
+ })}
+
+ )
+}
+
+export default ImageGrid
diff --git a/www/components/Layouts/Blog.tsx b/www/components/Layouts/Blog.tsx
new file mode 100644
index 00000000000..d28b9ad89c4
--- /dev/null
+++ b/www/components/Layouts/Blog.tsx
@@ -0,0 +1,5 @@
+function BlogLayout(props: any) {
+ return {props.children}
+}
+
+export default BlogLayout
diff --git a/www/components/Layouts/Default.tsx b/www/components/Layouts/Default.tsx
new file mode 100644
index 00000000000..f960816a169
--- /dev/null
+++ b/www/components/Layouts/Default.tsx
@@ -0,0 +1,35 @@
+import { useEffect } from 'react'
+import Nav from 'components/Nav/index'
+import Footer from 'components/Footer/index'
+
+type Props = {
+ hideHeader?: boolean
+ hideFooter?: boolean
+ children: React.ReactNode
+}
+
+const DefaultLayout = (props: Props) => {
+ const { hideHeader = false, hideFooter = false, children } = props
+
+ useEffect(() => {
+ const key = localStorage.getItem('supabaseDarkMode')
+ if (!key) {
+ // Default to dark mode if no preference config
+ document.documentElement.className = 'dark'
+ } else {
+ document.documentElement.className = key === 'true' ? 'dark' : ''
+ }
+ }, [])
+
+ return (
+ <>
+ {!hideHeader && }
+
+ {children}
+
+ {!hideFooter && }
+ >
+ )
+}
+
+export default DefaultLayout
diff --git a/www/components/Layouts/SectionContainer.tsx b/www/components/Layouts/SectionContainer.tsx
new file mode 100644
index 00000000000..0a721c5c989
--- /dev/null
+++ b/www/components/Layouts/SectionContainer.tsx
@@ -0,0 +1,19 @@
+import classNames from 'classnames'
+
+interface Props {
+ children: React.ReactNode
+ className?: string
+}
+
+const SectionContainer = ({ children, className }: Props) => (
+
+ {children}
+
+)
+
+export default SectionContainer
diff --git a/www/components/MadeForDevelopers/CodeExamples.tsx b/www/components/MadeForDevelopers/CodeExamples.tsx
new file mode 100644
index 00000000000..8496e5be6cf
--- /dev/null
+++ b/www/components/MadeForDevelopers/CodeExamples.tsx
@@ -0,0 +1,186 @@
+import { useState } from 'react'
+import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
+import js from 'react-syntax-highlighter/dist/cjs/languages/hljs/javascript'
+import CopyToClipboard from 'react-copy-to-clipboard'
+import {
+ createUserExample,
+ subscribeExample,
+ readExample,
+ createExample,
+ updateExample,
+ ExampleProps,
+} from 'data/CodeExamples'
+import monokaiCustomTheme from 'data/CodeEditorTheme'
+import { Button, IconCopy, Space, Tabs } from '@supabase/ui'
+
+SyntaxHighlighter.registerLanguage('javascript', js)
+
+const ClipboardIcon = () => (
+
+
+
+
+)
+
+const CopiedIcon = () => (
+
+
+
+)
+
+const CodeExamples = () => {
+ const [example, setExample] = useState('createUserExample')
+ const [copied, setCopied] = useState(false)
+
+ type exampleListProps = {
+ [key: string]: ExampleProps
+ }
+
+ const exampleList: exampleListProps = {
+ createUserExample,
+ subscribeExample,
+ readExample,
+ createExample,
+ updateExample,
+ }
+
+ const lang = 'javascript'
+
+ function handleClick(key: string) {
+ setExample(key)
+ setCopied(false)
+ }
+
+ const Buttons = () => (
+
+ {Object.values(exampleList).map((x, i) => {
+ const length: number = Object.values(exampleList).length - 1
+ // const radiusStyles = {
+ // borderBottomRightRadius: i !== length ? '0' : undefined,
+ // borderBottomLeftRadius: i !== length ? '0' : undefined,
+ // borderTopLeftRadius: i !== length + 1 && i !== 0 ? '0' : undefined,
+ // borderTopRightRadius: i !== length + 1 && i !== 0 ? '0' : undefined,
+ // }
+ return (
+ handleClick(x.id)}
+ style={
+ example === x.id
+ ? {
+ background: 'white',
+ color: '#3d3d3d',
+ // borderBottom: i !== 0 ? 'none' : 'red',
+ // ...radiusStyles,
+ }
+ : {
+ // borderBottom: i !== length ? 'none' : undefined,
+ // ...radiusStyles,
+ }
+ }
+ >
+ {x.name}
+
+ )
+ })}
+
+ )
+
+ const TabNav = () => (
+ handleClick(id)}
+ activeId={example}
+ type="underlined"
+ >
+ {Object.values(exampleList).map((x) => {
+ return (
+
+
+
+ )
+ })}
+
+ )
+
+ return (
+
+
+
{ }
+
+
+
+
+ {exampleList[example].description}
+
+
+ setCopied(true)}
+ >
+ : }>
+ {copied ? 'Copied!' : 'Copy code'}
+
+
+
+
+
+ {exampleList[example].code[lang]}
+
+
+
+
{ }
+
+
+ )
+}
+
+export default CodeExamples
diff --git a/www/components/MadeForDevelopers/index.tsx b/www/components/MadeForDevelopers/index.tsx
new file mode 100644
index 00000000000..f4682f4c72f
--- /dev/null
+++ b/www/components/MadeForDevelopers/index.tsx
@@ -0,0 +1,57 @@
+import { Badge, Button, IconArrowUpRight, IconMail } from '@supabase/ui'
+import APISection from '../Sections/APISection'
+import SectionContainer from '../Layouts/SectionContainer'
+import FeatureColumn from '../FeatureColumn'
+
+import CodeExamples from 'data/home/api-examples'
+import DeveloperFeatures from 'data/DeveloperFeatures.json'
+import TextLink from '../TextLink'
+
+const MadeForDevelopers = () => {
+ return (
+
+
+ We introspect your database to provide APIs instantly. Stop building repetitive CRUD
+ endpoints and focus on your product.
+ ,
+ ]}
+ // @ts-ignore
+ content={CodeExamples}
+ footer={[
+
+ {DeveloperFeatures.map((feature: any, i: number) => {
+ return (
+
+
+
+
+ {feature.badge && (
+
+
+ {feature.badge}
+
+
+ )}
+ {feature.badge ? (
+
+ ) : (
+
+ )}
+
+
+
+ )
+ })}
+ ,
+ ]}
+ />
+
+ )
+}
+
+export default MadeForDevelopers
diff --git a/www/components/Nav/Announcement.tsx b/www/components/Nav/Announcement.tsx
new file mode 100644
index 00000000000..061e1cd1eaa
--- /dev/null
+++ b/www/components/Nav/Announcement.tsx
@@ -0,0 +1,81 @@
+import React, { useEffect, useState } from 'react'
+
+import announcement from '~/data/Announcement.json'
+import { IconChevronRight, IconX } from '@supabase/ui'
+import { useRouter } from 'next/router'
+
+const Announcement = () => {
+ const [hidden, setHidden] = useState(true)
+
+ const router = useRouter()
+
+ // override to hide announcement
+ if (!announcement.show) return null
+
+ // construct the key for the announcement, based on the title text
+ const announcementKey = 'announcement_' + announcement.text.replace(/ /g, '')
+
+ // window.localStorage is kept inside useEffect
+ // to prevent error
+ useEffect(function () {
+ if (!window.localStorage.getItem(announcementKey)) {
+ return setHidden(false)
+ }
+ }, [])
+
+ function handleClose(event: any) {
+ event.stopPropagation()
+
+ window.localStorage.setItem(announcementKey, 'hidden')
+ return setHidden(true)
+ }
+
+ function handleLink() {
+ router.push(announcement.link)
+ window.localStorage.setItem(announcementKey, 'hidden')
+ }
+
+ if (hidden) {
+ return null
+ } else {
+ return (
+
+
+ {announcement.text}
+
+
+ {
+ // @ts-ignore
+ announcement.cta
+ }
+
+
+
+
+
+
+
+
+ )
+ }
+}
+
+export default Announcement
diff --git a/www/components/Nav/Company.tsx b/www/components/Nav/Company.tsx
new file mode 100644
index 00000000000..20997f72eb5
--- /dev/null
+++ b/www/components/Nav/Company.tsx
@@ -0,0 +1,95 @@
+import React from 'react'
+import CompanyData from 'data/Company.json'
+import BlogPostsData from 'data/BlogPosts.json'
+
+type Props = {
+ text: string
+ description?: string
+ url?: string
+ icon?: string
+}
+
+const Company = () => {
+ const iconSections = Object.values(CompanyData).map((company: Props) => {
+ const { text, description, url, icon } = company
+
+ const content = (
+
+ {/* */}
+
+
+
+
+
{text}
+
{description}
+
+
+ )
+ return (
+
+ {content}
+
+ )
+ })
+
+ return (
+
+
+ {iconSections}
+
+
+
+
+ Latest blog posts
+
+
+
+
+
+
+ )
+}
+
+export default Company
diff --git a/www/components/Nav/Developers.tsx b/www/components/Nav/Developers.tsx
new file mode 100644
index 00000000000..379ee1ed08b
--- /dev/null
+++ b/www/components/Nav/Developers.tsx
@@ -0,0 +1,96 @@
+import React from 'react'
+import DevelopersData from 'data/Developers.json'
+import AnnouncementsData from 'data/Announcements.json'
+import { useRouter } from 'next/router'
+import Image from 'next/image'
+
+type Props = {
+ text: string
+ description?: string
+ url?: string
+ icon?: string
+}
+
+const Developers = () => {
+ const { basePath } = useRouter()
+
+ const iconSections = Object.values(DevelopersData).map((company: Props) => {
+ const { text, description, url, icon } = company
+
+ const content = (
+
+ {/* */}
+
+
+
+
+
{text}
+
{description}
+
+
+ )
+ return url ? (
+
+ {content}
+
+ ) : (
+
+ {content}
+
+ )
+ })
+
+ return (
+
+
+ {iconSections}
+
+
+
+
Latest announcements
+
+
+
+
+ )
+}
+
+export default Developers
diff --git a/www/components/Nav/Product.tsx b/www/components/Nav/Product.tsx
new file mode 100644
index 00000000000..9ac3e291f9a
--- /dev/null
+++ b/www/components/Nav/Product.tsx
@@ -0,0 +1,88 @@
+import React from 'react'
+import SolutionsData from 'data/Solutions.json'
+import CaseStudiesData from 'data/CaseStudies.json'
+import { useRouter } from 'next/router'
+import ProductIcon from '../ProductIcon'
+import { Badge } from '@supabase/ui'
+import Image from 'next/image'
+
+const Product = () => {
+ const { basePath } = useRouter()
+
+ const iconSections = Object.values(SolutionsData).map((solution) => {
+ const { name, description, icon, label, url } = solution
+
+ const content = (
+
+
+
+
{description}
+ {label && (
+
+ {label}
+
+ )}
+
+
+ )
+ return (
+ url && (
+
+ {content}
+
+ )
+ )
+ })
+
+ return (
+
+
+ {iconSections}
+
+
+
+
Latest case studies
+
+
+
+
+ )
+}
+
+export default Product
diff --git a/www/components/Nav/index.tsx b/www/components/Nav/index.tsx
new file mode 100644
index 00000000000..fcc0a223029
--- /dev/null
+++ b/www/components/Nav/index.tsx
@@ -0,0 +1,387 @@
+import React, { useState } from 'react'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+
+import { Button, Badge, IconStar, IconChevronDown } from '@supabase/ui'
+import FlyOut from '~/components/UI/FlyOut'
+import Transition from 'lib/Transition'
+
+import SolutionsData from 'data/Solutions.json'
+
+import Solutions from '~/components/Nav/Product'
+import Developers from '~/components/Nav/Developers'
+import Announcement from '~/components/Nav/Announcement'
+
+import { useTheme } from '~/components/Providers'
+import TextLink from '../TextLink'
+import Image from 'next/image'
+
+const Nav = () => {
+ const { basePath } = useRouter()
+ const { isDarkMode } = useTheme()
+ const [open, setOpen] = useState(false)
+
+ const [openProduct, setOpenProduct] = useState(false)
+ const [openDevelopers, setOpenDevelopers] = useState(false)
+
+ React.useEffect(() => {
+ if (open) {
+ // Prevent scrolling on mount
+ document.body.style.overflow = 'hidden'
+ } else {
+ document.body.style.overflow = 'auto'
+ }
+ }, [open])
+
+ function handleToggle(callback: any) {
+ handleCancel()
+ callback()
+ }
+
+ function handleCancel() {
+ setOpenProduct(false)
+ setOpenDevelopers(false)
+ }
+
+ const iconSections = Object.values(SolutionsData).map((solution: any, idx: number) => {
+ const { name, description, icon, label, url } = solution
+
+ const content = (
+
+
+
+
+
+ {name}
+ {label && (
+
+ {label}
+
+ )}
+
+
{description}
+
+ {url && (
+
+
+
+ )}
+
+
+ )
+ return url ? (
+
+ {content}
+
+ ) : (
+
+ {content}
+
+ )
+ })
+
+ type HamburgerButtonProps = {
+ toggleFlyOut: Function
+ }
+
+ const HamburgerButton = (props: HamburgerButtonProps) => (
+ props.toggleFlyOut()}
+ >
+
+ Open main menu
+
+
+
+
+
+
+
+
+
+
+ )
+
+ const FlyOutNavButton = (props: any) => (
+
+ <>
+
{props.title}
+
+
+
+ >
+
+ )
+
+ return (
+ <>
+
+
+
+
+ {/* */}
+
+
setOpen(true)} />
+
+
+
+
+
handleToggle(() => setOpenProduct(!openProduct))}
+ active={openProduct}
+ />
+ handleToggle(() => setOpenDevelopers(!openDevelopers))}
+ active={openDevelopers}
+ />
+
+ Pricing
+
+
+ Blog
+
+
+
+
+ }
+ >
+ Star us on GitHub
+
+
+
+
+ Sign in
+
+
+
+ Start your project
+
+
+
+ {/*
*/}
+
+ {/* */}
+ {/* Mobile Nav Menu */}
+
+
+
+
+
setOpen(false)}
+ type="button"
+ className="inline-flex items-center justify-center p-2 rounded-md bg-white text-scale-900 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-brand-900 dark:bg-scale-300 dark:hover:bg-scale-400"
+ >
+ Close menu
+
+
+
+
+
+
+ {/*
*/}
+
+
+
+
+
Products available:
+ {iconSections}
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default Nav
diff --git a/www/components/Partners/BecomeAPartners.tsx b/www/components/Partners/BecomeAPartners.tsx
new file mode 100644
index 00000000000..16e0442a471
--- /dev/null
+++ b/www/components/Partners/BecomeAPartners.tsx
@@ -0,0 +1,203 @@
+import { SupabaseClient } from '@supabase/supabase-js'
+import { Button, Form, Input, InputNumber, Select } from '@supabase/ui'
+import { useState } from 'react'
+import countries from '~/data/Countries.json'
+import { PartnerContact } from '~/types/partners'
+
+const INITIAL_VALUES = {
+ type: 'expert',
+ first: '',
+ last: '',
+ company: '',
+ size: '',
+ title: '',
+ email: '',
+ phone: '',
+ country: 'US',
+ details: '',
+}
+
+const validate = (values: any) => {
+ const errors: any = {}
+
+ if (!values.first) {
+ errors.first = 'Required'
+ }
+
+ if (!values.last) {
+ errors.last = 'Required'
+ }
+
+ if (!values.email) {
+ errors.email = 'Required'
+ } else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(values.email)) {
+ errors.email = 'Invalid email address'
+ }
+
+ return errors
+}
+
+export default function BecomeAPartner({ supabase }: { supabase: SupabaseClient }) {
+ const [formSubmitted, setFormSubmitted] = useState(false)
+
+ const handleFormSubmit = async (values: any) => {
+ const { error } = await supabase.from('partner_contacts').insert(
+ [
+ {
+ type: values.type,
+ first: values.first,
+ last: values.last,
+ company: values.company,
+ size: Number(values.size),
+ title: values.title,
+ email: values.email,
+ website: values.email.split('@')[1],
+ phone: values.phone,
+ country: values.country,
+ details: values.details,
+ },
+ ],
+ { returning: 'minimal' }
+ )
+
+ // TODO: handle error
+ console.log('error:', error)
+
+ setFormSubmitted(true)
+ }
+
+ return (
+
+
+
Become a Partner
+
+
+
+ {formSubmitted &&
Thanks, we'll reach out to you shortly 👁⚡️👁 }
+
+
+ )
+}
diff --git a/www/components/Partners/PartnerLinkBox.tsx b/www/components/Partners/PartnerLinkBox.tsx
new file mode 100644
index 00000000000..81960e6e2f8
--- /dev/null
+++ b/www/components/Partners/PartnerLinkBox.tsx
@@ -0,0 +1,57 @@
+import Link from 'next/link'
+import React from 'react'
+
+const PartnerLinkBox = ({
+ href,
+ title,
+ description,
+ icon,
+ color = 'amber',
+}: {
+ href: string
+ title: string
+ description: string
+ icon?: React.ReactNode
+ color?: 'amber' | 'brand' | 'blue'
+}) => {
+ const colors = {
+ amber:
+ 'bg-amber-400 dark:bg-scale-100 group-hover:bg-amber-500 dark:group-hover:bg-amber-300 text-amber-900',
+ blue: 'bg-blue-400 dark:bg-scale-100 group-hover:bg-blue-500 dark:group-hover:bg-blue-300 text-blue-900',
+ brand:
+ 'bg-brand-400 dark:bg-scale-100 group-hover:bg-brand-500 dark:group-hover:bg-brand-300 text-brand-900',
+ }
+
+ const content = (
+
+
+
+ {icon}
+
+
+
{title}
+
{description}
+
+
+
+ )
+
+ return {content}
+}
+
+export default PartnerLinkBox
diff --git a/www/components/Partners/TileGrid.tsx b/www/components/Partners/TileGrid.tsx
new file mode 100644
index 00000000000..64d3058dc43
--- /dev/null
+++ b/www/components/Partners/TileGrid.tsx
@@ -0,0 +1,64 @@
+import Image from 'next/image'
+import Link from 'next/link'
+import { Partner } from '~/types/partners'
+
+export default function TileGrid({
+ partnersByCategory,
+ hideCategories = false,
+}: {
+ partnersByCategory: { [category: string]: Partner[] }
+ hideCategories?: boolean
+}) {
+ return (
+ <>
+ {Object.keys(partnersByCategory).map((category) => (
+
+ {!hideCategories &&
{category} }
+
+
+ ))}
+ >
+ )
+}
diff --git a/www/components/PricingAddOnTable.tsx b/www/components/PricingAddOnTable.tsx
new file mode 100644
index 00000000000..6fa0d20e728
--- /dev/null
+++ b/www/components/PricingAddOnTable.tsx
@@ -0,0 +1,117 @@
+import { Collapsible, IconChevronUp } from '@supabase/ui'
+import classNames from 'classnames'
+import { Fragment, useMemo, useState } from 'react'
+import { Check } from './PricingTableRow'
+
+interface PricingAddOnTableProps {
+ pricing: {
+ title: string
+ features: string[]
+ rows: {
+ columns: {
+ key: string
+ title: string
+ value: string
+ }[]
+ }[]
+ }
+ icon: JSX.Element
+}
+
+const PricingAddOnTable = ({ icon, pricing }: PricingAddOnTableProps) => {
+ const [isAddOnOpen, setIsAddOnOpen] = useState(false)
+
+ const columnNames = useMemo(
+ () =>
+ pricing.rows.map((row) =>
+ row.columns.map((column) => ({ key: column.key, title: column.title }))
+ )[0],
+ [pricing]
+ )
+
+ return (
+
+
+
+
+
+
+
+ {icon}
+
+
+ See {pricing.title} add-on plans
+
+
+
+
+
+ {pricing.features.map((feature, i) => (
+
+
+ {feature}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {columnNames.map((column) => (
+
+ {column.title}
+
+ ))}
+
+
+
+ {pricing.rows.map((row, i) => (
+
+ {row.columns.map((column) => (
+
+ {column.value}
+
+ ))}
+
+ ))}
+
+
+
+
+
+ {pricing.rows.map((row, i) => (
+
+ {row.columns.map((column) => (
+
+ {column.title}
+ {column.value}
+
+ ))}
+
+ ))}
+
+
+
+
+
+
+ )
+}
+
+export default PricingAddOnTable
diff --git a/www/components/PricingTableRow.tsx b/www/components/PricingTableRow.tsx
new file mode 100644
index 00000000000..0c900700a99
--- /dev/null
+++ b/www/components/PricingTableRow.tsx
@@ -0,0 +1,162 @@
+import { IconHelpCircle } from '@supabase/ui'
+import ProductIcon from 'components/ProductIcon'
+import React from 'react'
+import ReactTooltip from 'react-tooltip'
+
+export const Check = () => (
+
+
+
+)
+
+const IncludedCheck = (props: any) => (
+ <>
+
+ Included in {props.tier}
+ >
+)
+
+const Minus = (props: any) => (
+ <>
+
+
+
+ Not included in {props.tier}
+ >
+)
+
+export const PricingTableRowDesktop = (props: any) => {
+ const category = props.category
+
+ return (
+ <>
+
+
+
+ {props.icon &&
}
+
{category.title}
+
+
+
+
+
+
+
+ {category.features.map((feat: any) => {
+ return (
+
+
+ {feat.title}
+ {feat.tooltip && (
+
+
+
+ )}
+
+
+ {Object.values(feat.tiers).map((tier: any, i) => {
+ return (
+
+ {typeof tier === 'boolean' && tier === true ? (
+
+ ) : typeof tier === 'boolean' && tier === false ? (
+
+ ) : (
+ {tier}
+ )}
+
+ )
+ })}
+
+ )
+ })}
+
+ >
+ )
+}
+
+export const PricingTableRowMobile = (props: any) => {
+ const category = props.category
+ const tier = props.tier
+
+ return (
+ <>
+
+
+
+ {category.icon ?
: null}
+
{category.title}
+
+
+
+
+
+ Feature
+
+
+ Included
+
+
+
+
+ {category.features.map((feat: any, i: number) => {
+ return (
+
+
+
+ {feat.title}
+
+
+
+ {typeof feat.tiers[tier] === 'boolean' && feat.tiers[tier] === true ? (
+
+
+
+ ) : typeof feat.tiers[tier] === 'boolean' && feat.tiers[tier] === false ? (
+
+
+
+ ) : (
+ {feat.tiers[tier]}
+ )}
+
+
+ )
+ })}
+
+
+
+ >
+ )
+}
diff --git a/www/components/ProductIcon.tsx b/www/components/ProductIcon.tsx
new file mode 100644
index 00000000000..13b69236812
--- /dev/null
+++ b/www/components/ProductIcon.tsx
@@ -0,0 +1,21 @@
+interface ProductIcon {
+ icon: string
+}
+
+function ProductIcon({ icon }: ProductIcon) {
+ return (
+
+ )
+}
+
+export default ProductIcon
diff --git a/www/components/Providers/index.tsx b/www/components/Providers/index.tsx
new file mode 100644
index 00000000000..ab023562c17
--- /dev/null
+++ b/www/components/Providers/index.tsx
@@ -0,0 +1,44 @@
+import { createContext, useContext, useEffect, useState } from 'react'
+
+interface UseThemeProps {
+ isDarkMode?: boolean
+ toggleTheme: () => void
+}
+
+interface ThemeProviderProps {
+ children?: any
+}
+
+export const ThemeContext = createContext({
+ isDarkMode: true,
+ toggleTheme: () => {},
+})
+
+export const useTheme = () => useContext(ThemeContext)
+
+export const ThemeProvider = ({ children }: ThemeProviderProps) => {
+ const [isDarkMode, setIsDarkMode] = useState(false)
+
+ useEffect(() => {
+ const key = localStorage.getItem('supabaseDarkMode')
+ // Default to dark mode if no preference config
+ setIsDarkMode(!key || key === 'true')
+ }, [])
+
+ const toggleTheme = () => {
+ setIsDarkMode(!isDarkMode)
+ }
+
+ return (
+ <>
+
+ {children}
+
+ >
+ )
+}
diff --git a/www/components/Quote.tsx b/www/components/Quote.tsx
new file mode 100644
index 00000000000..e9a9150e649
--- /dev/null
+++ b/www/components/Quote.tsx
@@ -0,0 +1,32 @@
+import { Space } from '@supabase/ui'
+import React from 'react'
+
+interface Props {
+ children: React.ReactNode
+ caption: string
+ img: string
+}
+
+export default function Quote(props: Props) {
+ const { children, caption, img } = props
+
+ return (
+
+
+
+ {children}
+
+
+
+
+ {caption}
+
+
+
+
+ )
+}
diff --git a/www/components/ScrollableCodeBlock.tsx b/www/components/ScrollableCodeBlock.tsx
new file mode 100644
index 00000000000..3b0a41dd4dd
--- /dev/null
+++ b/www/components/ScrollableCodeBlock.tsx
@@ -0,0 +1,66 @@
+import rangeParser from 'parse-numeric-range'
+import { useMemo } from 'react'
+import CodeBlock, { CodeBlockProps } from './CodeBlock/CodeBlock'
+
+interface ScrollableCodeBlockProps extends CodeBlockProps {
+ highlightLines: string
+ children: string
+ /**
+ * Shows an application toolbar at the top
+ */
+ showToolbar?: boolean
+}
+
+const MAX_HEIGHT = 520
+const CODE_LINE_HEIGHT = 22
+const TOP_OFFSET = 4
+
+const ScrollableCodeBlock = ({
+ highlightLines: highlightLinesRange,
+ children,
+ showToolbar,
+ ...props
+}: ScrollableCodeBlockProps) => {
+ const highlightLines = useMemo(
+ () => rangeParser(highlightLinesRange ?? ''),
+ [highlightLinesRange]
+ )
+ const firstLine = Math.min(...highlightLines)
+ const lastLine = Math.max(...highlightLines)
+
+ const firstLinePosition = firstLine * CODE_LINE_HEIGHT
+ const lastLinePosition = lastLine * CODE_LINE_HEIGHT
+
+ const middlePosition = (firstLinePosition + lastLinePosition) / 2
+ const position = Math.max(middlePosition - MAX_HEIGHT / 2 + TOP_OFFSET, 0)
+
+ return (
+
+ {showToolbar && (
+
+ )}
+
+
+
+
+ {children + '\n'.repeat(100)}
+
+
+
+
+ )
+}
+
+export default ScrollableCodeBlock
diff --git a/www/components/Sections/APISection.tsx b/www/components/Sections/APISection.tsx
new file mode 100644
index 00000000000..7e8801e956c
--- /dev/null
+++ b/www/components/Sections/APISection.tsx
@@ -0,0 +1,91 @@
+import { useState } from 'react'
+// Import Swiper React components
+import { Button, IconArrowUpRight, Tabs } from '@supabase/ui'
+import { Swiper, SwiperSlide } from 'swiper/react'
+import CodeBlock from '../CodeBlock/CodeBlock'
+import Link from 'next/link'
+
+interface Example {
+ lang: 'js' | 'py' | 'sql'
+ title: string
+ code: string
+}
+
+interface Props {
+ size?: 'small' | 'large'
+ content: Example[]
+ title: string | React.ReactNode
+ footer?: React.ReactNode
+ text?: React.ReactNode
+ autoHeight?: boolean
+ documentation_link?: string
+}
+
+function APISection(props: Props) {
+ // store API swiper instance
+ const [apiSwiper, setApiSwiper] = useState(undefined)
+ const [apiSwiperActiveIndex, setApiSwiperActiveIndex] = useState(0)
+
+ function handleApiSwiperNavChange(e: number) {
+ setApiSwiperActiveIndex(e)
+ // @ts-ignore
+ apiSwiper.slideTo(e)
+ }
+
+ return (
+
+
+
+
handleApiSwiperNavChange(Number(id))}
+ >
+ {props.content &&
+ props.content.map((content: Example, i) => (
+
+
+
+ ))}
+
+
+
+ {props.content &&
+ props.content.map((content: Example, i) => (
+
+
+ {content.code}
+
+
+ ))}
+
+
+
+
+ )
+}
+
+export default APISection
diff --git a/www/components/Sections/FeatureSection.tsx b/www/components/Sections/FeatureSection.tsx
new file mode 100644
index 00000000000..524a846eedf
--- /dev/null
+++ b/www/components/Sections/FeatureSection.tsx
@@ -0,0 +1,58 @@
+import { IconDatabase } from '@supabase/ui'
+
+const FeatureSection = (props: any) => {
+ return (
+
+
+
+
+
+
Write less code
+
+
+ Use media in your project without needing to reply on external services or learn new
+ frameworks.
+
+
+ Familiar and easy to use permissions mean that your content is secure and accessible
+ only to the right users
+
+
+
+
+
+
+
+
Blazing fast
+
+
+ Use media in your project without needing to reply on external services or learn new
+ frameworks.
+
+
+ Familiar and easy to use permissions mean that your content is secure and accessible
+ only to the right users
+
+
+
+
+
+
+
+
Dependable
+
+
+ Use media in your project without needing to reply on external services or learn new
+ frameworks.
+
+
+ Familiar and easy to use permissions mean that your content is secure and accessible
+ only to the right users
+
+
+
+
+ )
+}
+
+export default FeatureSection
diff --git a/www/components/Sections/FunctionsUsecases.tsx b/www/components/Sections/FunctionsUsecases.tsx
new file mode 100644
index 00000000000..5f8eb7810a9
--- /dev/null
+++ b/www/components/Sections/FunctionsUsecases.tsx
@@ -0,0 +1,114 @@
+import { useState } from 'react'
+// Import Swiper React components
+import { Button, IconArrowUpRight } from '@supabase/ui'
+import { Swiper, SwiperSlide } from 'swiper/react'
+import CodeBlock from '../CodeBlock/CodeBlock'
+import Link from 'next/link'
+
+interface Example {
+ lang: 'js' | 'py' | 'sql'
+ title: string
+ code: string
+}
+
+interface Props {
+ size?: 'small' | 'large'
+ content: Example[]
+ title: string | React.ReactNode
+ footer?: React.ReactNode
+ text?: React.ReactNode
+ autoHeight?: boolean
+ documentation_link?: string
+}
+
+function FunctionsUsecases(props: Props) {
+ // store API swiper instance
+ const [apiSwiper, setApiSwiper] = useState(undefined)
+ const [apiSwiperActiveIndex, setApiSwiperActiveIndex] = useState(0)
+
+ function handleApiSwiperNavChange(e: number) {
+ setApiSwiperActiveIndex(e)
+ // @ts-ignore
+ apiSwiper.slideTo(e)
+ }
+
+ return (
+
+
+
{props.title}
+
{props.text}
+
+
+ {props.content.map((feat, i) => {
+ const active = i == apiSwiperActiveIndex
+ return (
+
setCurrentSelection(feat.highlightLines)}
+ onClick={() => handleApiSwiperNavChange(i)}
+ >
+
+ {feat.title}
+
+
+ {/*
+ // @ts-ignore */}
+ {feat.description}
+
+
+ )
+ })}
+ {props.documentation_link && (
+
+
+ }>
+ Explore documentation
+
+
+
+ )}
+
+
+
+
+
+ {props.content &&
+ props.content.map((content: Example, i) => (
+
+
+ {content.code}
+
+
+ ))}
+
+
+
+
+ )
+}
+
+export default FunctionsUsecases
diff --git a/www/components/Sections/GithubExamples.tsx b/www/components/Sections/GithubExamples.tsx
new file mode 100644
index 00000000000..34cf953f3b3
--- /dev/null
+++ b/www/components/Sections/GithubExamples.tsx
@@ -0,0 +1,117 @@
+import { useRef } from 'react'
+
+import { useRouter } from 'next/router'
+
+import { Swiper, SwiperSlide } from 'swiper/react'
+// import Swiper core and required modules
+import SwiperCore, { Navigation, Pagination } from 'swiper'
+
+import Link from 'next/link'
+import { Button, IconGitHub, IconArrowLeft, IconArrowRight, IconBookOpen } from '@supabase/ui'
+
+import Examples from '../../data/Examples.json'
+import ExampleCard from '../ExampleCard'
+
+// install Swiper modules
+SwiperCore.use([Navigation, Pagination])
+
+function GithubExamples() {
+ // base path for images
+ const { basePath } = useRouter()
+
+ const prevRef = useRef(null)
+ const nextRef = useRef(null)
+
+ return (
+ <>
+
+
+
Community driven examples, libraries and guides
+
+ Supported by a network of early advocates, contributors, and champions.
+
+
+
+ }>
+ View guides
+
+
+
+
+ View all examples
+
+
+
+ }>
+ Official GitHub library
+
+
+
+
+
+
+
+
+
{
+ swiper.params.navigation.prevEl = prevRef.current
+ swiper.params.navigation.nextEl = nextRef.current
+ swiper.navigation.update()
+ }}
+ breakpoints={{
+ 320: {
+ slidesPerView: 1,
+ },
+ 720: {
+ slidesPerView: 2,
+ },
+ 920: {
+ slidesPerView: 3,
+ },
+ 1024: {
+ slidesPerView: 4,
+ },
+ }}
+ >
+ {Object.values(Examples).map((example: any, i: number) => {
+ return (
+
+
+
+
+
+ )
+ })}
+
+
+
+
+ >
+ )
+}
+
+export default GithubExamples
diff --git a/www/components/Sections/ProductHeader.tsx b/www/components/Sections/ProductHeader.tsx
new file mode 100644
index 00000000000..b9665438ae1
--- /dev/null
+++ b/www/components/Sections/ProductHeader.tsx
@@ -0,0 +1,74 @@
+import { Button, IconBookOpen } from '@supabase/ui'
+import Link from 'next/link'
+import ProductIcon from '../ProductIcon'
+
+type subheader = string
+interface Types {
+ h1: string | React.ReactNode
+ subheader: string[]
+ icon?: string
+ title?: string
+ image?: React.ReactNode
+ footer?: React.ReactNode
+ documentation_url?: string
+}
+
+const ProductHeader = (props: Types) => (
+
+
+
+
+ {props.icon || props.title ? (
+
+ {props.icon &&
}
+ {props.title && (
+
+ {props.title}
+
+ )}
+
+ ) : null}
+
+ {props.h1}
+
+
+
+ {props.subheader &&
+ props.subheader.map((subheader, i) => {
+ return (
+
+ {subheader}
+
+ )
+ })}
+
+
+ {props.footer &&
{props.footer}
}
+
+ {props.image && (
+
+ {props.image}
+
+ )}
+
+
+)
+
+export default ProductHeader
diff --git a/www/components/Sections/TwitterSocialProof.tsx b/www/components/Sections/TwitterSocialProof.tsx
new file mode 100644
index 00000000000..f0c79cec352
--- /dev/null
+++ b/www/components/Sections/TwitterSocialProof.tsx
@@ -0,0 +1,135 @@
+import { useRef } from 'react'
+
+import { useRouter } from 'next/router'
+
+import { Swiper, SwiperSlide } from 'swiper/react'
+// import Swiper core and required modules
+import SwiperCore, { Navigation, Pagination } from 'swiper'
+
+import { Button, IconMessageCircle, IconArrowLeft, IconArrowRight } from '@supabase/ui'
+
+import Examples from '../../data/tweets/Tweets.json'
+import TweetCard from '../TweetCard'
+
+// Import Swiper styles
+import 'swiper/swiper.min.css'
+import 'swiper/components/navigation/navigation.min.css'
+import 'swiper/components/pagination/pagination.min.css'
+import Link from 'next/link'
+
+// install Swiper modules
+SwiperCore.use([Navigation, Pagination])
+
+function TwitterSocialProof() {
+ // base path for images
+ const { basePath } = useRouter()
+
+ const prevRef = useRef(null)
+ const nextRef = useRef(null)
+
+ return (
+ <>
+
+
+
Join the community
+
+ Supported by a network of early advocates, contributors, and champions.
+
+
+
+ }
+ type="default"
+ >
+ GitHub discussions
+
+
+
+ }
+ >
+ Discord
+
+
+
+
+
+
+
+
{
+ swiper.params.navigation.prevEl = prevRef.current
+ swiper.params.navigation.nextEl = nextRef.current
+ // swiper.navigation.update()
+ }}
+ breakpoints={{
+ 320: {
+ slidesPerView: 1,
+ },
+ 720: {
+ slidesPerView: 2,
+ },
+ 920: {
+ slidesPerView: 3,
+ },
+ 1024: {
+ slidesPerView: 4,
+ },
+ 1208: {
+ slidesPerView: 5,
+ },
+ }}
+ >
+ {Examples.map((tweet: any, i: number) => {
+ return (
+
+
+
+
+
+ )
+ })}
+
+
+
+
+ >
+ )
+}
+
+export default TwitterSocialProof
diff --git a/www/components/TextLink.tsx b/www/components/TextLink.tsx
new file mode 100644
index 00000000000..3537be85fc8
--- /dev/null
+++ b/www/components/TextLink.tsx
@@ -0,0 +1,20 @@
+import { IconArrowRight, IconChevronRight } from '@supabase/ui'
+import Link from 'next/link'
+
+function TextLink({ url, label }: any) {
+ return (
+
+
+
+ )
+}
+
+export default TextLink
diff --git a/www/components/TweetCard.tsx b/www/components/TweetCard.tsx
new file mode 100644
index 00000000000..cce78981944
--- /dev/null
+++ b/www/components/TweetCard.tsx
@@ -0,0 +1,46 @@
+import { IconTwitter } from '@supabase/ui'
+import Image from 'next/image'
+
+interface TweetCard {
+ handle: string
+ quote: string
+ img_url: string
+}
+
+function TweetCard(props: TweetCard) {
+ return (
+
+
+
+
+
+
+
{props.handle}
+
+
+
+
+
+
"{props.quote}"
+
+
+ )
+}
+export default TweetCard
diff --git a/www/components/TwitterSocialSection.tsx b/www/components/TwitterSocialSection.tsx
new file mode 100644
index 00000000000..6b288242682
--- /dev/null
+++ b/www/components/TwitterSocialSection.tsx
@@ -0,0 +1,23 @@
+import SectionContainer from './Layouts/SectionContainer'
+import TwitterSocialProof from './Sections/TwitterSocialProof'
+
+const TwitterSocialSection = () => {
+ return (
+
+ )
+}
+
+export default TwitterSocialSection
diff --git a/www/components/UI/FlyOut.tsx b/www/components/UI/FlyOut.tsx
new file mode 100644
index 00000000000..449b6c5d696
--- /dev/null
+++ b/www/components/UI/FlyOut.tsx
@@ -0,0 +1,66 @@
+import React, { useEffect } from 'react'
+import Transition from 'lib/Transition'
+
+type Props = {
+ title?: string
+ children?: React.ReactNode
+ className?: string
+ open?: boolean
+ handleCancel?: any
+ singleBgColor?: boolean
+}
+
+const FlyOut = (props: Props) => {
+ const { title = '', children, className = '', singleBgColor = false, handleCancel } = props
+
+ useEffect(() => {
+ function handleScroll() {
+ if (window.pageYOffset > 96) handleCancel()
+ }
+ window.addEventListener('scroll', handleScroll)
+ return () => window.removeEventListener('scroll', handleScroll)
+ }, [])
+
+ return (
+ <>
+
+ <>
+
+
+
+ {children}
+
+
props.handleCancel()}
+ >
+
+ >
+
+ >
+ )
+}
+
+export default FlyOut
diff --git a/www/components/UI/SectionHeader.tsx b/www/components/UI/SectionHeader.tsx
new file mode 100644
index 00000000000..bf71e3dbd2a
--- /dev/null
+++ b/www/components/UI/SectionHeader.tsx
@@ -0,0 +1,18 @@
+const SectionHeader = (props: any) => {
+ return (
+
+
+
+ {props.subtitle}
+
+
+ {props.title}
+ {props.title_alt && {props.title_alt} }
+
+
+ {props.paragraph &&
{props.paragraph}
}
+
+ )
+}
+
+export default SectionHeader
diff --git a/www/data/AdminAccess.json b/www/data/AdminAccess.json
new file mode 100644
index 00000000000..f5919dd1a94
--- /dev/null
+++ b/www/data/AdminAccess.json
@@ -0,0 +1,20 @@
+{
+ "tabTableEditor": {
+ "header": "Manage your data with the familiarity of a spreadsheet",
+ "description": "You don’t have to be a database expert to use Supabase. Our table editor makes Postgres easy to use, even for non-techies. You can do everything right in our dashboard.",
+ "cta": "Explore Table View",
+ "url": "/docs/guides/platform"
+ },
+ "tabSqlEditor": {
+ "header": "In-built SQL editor for when you need greater control",
+ "description": "Write, save, and execute SQL queries directly on our dashboard, with templates to save you time. Run common queries and even build applications using our growing list of templates.",
+ "cta": "Explore SQL Editor",
+ "url": "/docs/guides/platform"
+ },
+ "tabAuthRules": {
+ "header": "User management as straight-forward as it can be",
+ "description": "Easily manage your users with Supabase Auth, with email logins, magic links, and third-party logins. Create complex access policies with SQL rules to fit your unique business needs.",
+ "cta": "Explore Auth Policies",
+ "url": "/docs/guides/auth"
+ }
+}
diff --git a/www/data/Announcement.json b/www/data/Announcement.json
new file mode 100644
index 00000000000..ec4c797fa26
--- /dev/null
+++ b/www/data/Announcement.json
@@ -0,0 +1,6 @@
+{
+ "show": true,
+ "text": "Supabase Launch Week IV",
+ "cta": "Functions, GraphQL, Enterprise, and more",
+ "link": "/blog/2022/03/25/supabase-launch-week-four"
+}
diff --git a/www/data/Announcements.json b/www/data/Announcements.json
new file mode 100644
index 00000000000..77b9ce6ccbe
--- /dev/null
+++ b/www/data/Announcements.json
@@ -0,0 +1,34 @@
+[
+ {
+ "type": "Announcement",
+ "title": "Supabase Launch Week III: Holiday Special",
+ "description": "Santa's little hackers have been hard at work because we've got another five days of launches ready to go.",
+ "imgUrl": "images/blog/launch-week-three/launch-week-three-og.jpg",
+ "logoUrl": "images/blog/launch-week-three/launch-week-three-og.jpg",
+ "organization": "Supabase",
+ "url": "/blog/2021/11/26/supabase-launch-week-the-trilogy",
+ "postMeta": {
+ "name": "Paul Copplestone",
+ "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4",
+ "publishDate": "Nov 26, 2021",
+ "readLength": 2
+ },
+ "ctaText": "View case study"
+ },
+ {
+ "type": "Announcement",
+ "title": "Supabase $30m Series A",
+ "description": "Supabase just raised $30M, bringing our total funding to $36M. How will we spend this? Read on to find out.",
+ "imgUrl": "images/blog/series-a/supabase-series-a.png",
+ "logoUrl": "images/blog/series-a/supabase-series-a.png",
+ "organization": "Supabase",
+ "url": "/blog/2021/10/28/supabase-series-a",
+ "postMeta": {
+ "name": "Paul Copplestone",
+ "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4",
+ "publishDate": "Oct 28, 2021",
+ "readLength": 28
+ },
+ "ctaText": "View case study"
+ }
+]
diff --git a/www/data/Authors.json b/www/data/Authors.json
new file mode 100644
index 00000000000..5521ab77332
--- /dev/null
+++ b/www/data/Authors.json
@@ -0,0 +1,26 @@
+{
+ "paul_copplestone": {
+ "name": "Paul Copplestone",
+ "job_title": "CEO and Co-Founder",
+ "username": "kiwicopple",
+ "avatar_url": "https://avatars0.githubusercontent.com/u/10214025?v=4"
+ },
+ "anthony_wilson": {
+ "name": "Anthony Wilson",
+ "job_title": "CTO and Co-Founder",
+ "username": "awalias",
+ "avatar_url": "https://avatars3.githubusercontent.com/u/458736?v=4"
+ },
+ "rory": {
+ "name": "Rory Wilding",
+ "job_title": "Head of Growth",
+ "username": "roryw10",
+ "avatar_url": "https://avatars0.githubusercontent.com/u/10214025?v=4"
+ },
+ "inian": {
+ "name": "Inian Parameshwaran",
+ "job_title": "Engineer",
+ "username": "everconfusedguy",
+ "avatar_url": "https://avatars0.githubusercontent.com/u/2155545?v=4"
+ }
+}
diff --git a/www/data/BetaPage.js b/www/data/BetaPage.js
new file mode 100644
index 00000000000..9016994cae7
--- /dev/null
+++ b/www/data/BetaPage.js
@@ -0,0 +1,186 @@
+export const AlphaNumbers = [
+ {
+ icon: (
+
+
+
+
+
+ ),
+ value: 3102,
+ unit: null,
+ name: 'Hosted Databases',
+ },
+ {
+ icon: (
+
+
+
+ ),
+ value: 5460,
+ unit: null,
+ name: 'GitHub Stars',
+ },
+ {
+ icon: (
+
+
+
+
+ ),
+ value: 505,
+ unit: null,
+ name: 'GitHub issues resolved',
+ },
+ {
+ icon: (
+
+
+
+
+
+
+ ),
+ value: 379,
+ unit: null,
+ name: 'Forks of our repositories',
+ },
+ {
+ icon: (
+
+
+
+
+
+
+ ),
+ value: 88,
+ unit: null,
+ name: 'Active GitHub contributors',
+ },
+ {
+ icon: (
+
+
+
+
+ ),
+ value: 238,
+ unit: 'K',
+ name: 'Lines of code',
+ },
+]
+
+export const IntroductionSegments = [
+ {
+ description:
+ "To deliver a production-ready platform, we've put extra effort into three areas of Supabase.",
+ chapters: [
+ { no: 1, name: 'Performance', key: 'performance' },
+ { no: 2, name: 'Security', key: 'security' },
+ { no: 3, name: 'Reliability', key: 'reliability' },
+ ],
+ },
+ {
+ description:
+ "We received an incredible number of feature requests from our Alpha Users, and we're using these conversations build a simple, predictable Beta Pricing model.",
+ chapters: [
+ { no: 4, name: 'New Features & Integrations', key: 'features' },
+ { no: 5, name: 'Beta Pricing', key: 'pricing' },
+ ],
+ },
+ {
+ description:
+ "Open Source is, and will always be, at the core of everything that we do. Find out how we've been working with the community to support existing OSS projects and Communities.",
+ chapters: [{ no: 6, name: 'Open Source', key: 'openSource' }],
+ },
+ {
+ description:
+ "And finally, we're partnering with the best in the business to help us achieve our goal of becoming the default backend for every company. We'll be announcing the details soon, and we're excited to share what we have in store for 2021:",
+ chapters: [
+ { no: 7, name: 'Funding Partners', key: 'fundingPartners' },
+ { no: 8, name: 'Scaling Our Team', key: 'scaling' },
+ { no: 9, name: "What's Next", key: 'next' },
+ ],
+ },
+]
+
+// Currently unused
+export const PerformanceComparisonData = [
+ {
+ key: 'read',
+ title: 'Read (requests/s)',
+ stats: [
+ { name: 'Supabase', value: 1167 },
+ { name: 'Firestore', value: 366 },
+ ],
+ },
+ {
+ key: 'write',
+ title: 'Write (requests/s)',
+ stats: [
+ { name: 'Supabase', value: 870 },
+ { name: 'Firestore', value: 280 },
+ ],
+ },
+]
diff --git a/www/data/BlogPosts.json b/www/data/BlogPosts.json
new file mode 100644
index 00000000000..1541789124a
--- /dev/null
+++ b/www/data/BlogPosts.json
@@ -0,0 +1,26 @@
+[
+ {
+ "type": "Blog post",
+ "title": "Tayfa Built a No-Code Website Builder Deployed in Seven Days",
+ "description": "",
+ "postMeta": {
+ "name": "Paul Copplestone",
+ "avatarUrl": "/blog/2020/12/02/case-study-xendit",
+ "publishDate": "",
+ "readLength": 6
+ },
+ "ctaText": "View blog post"
+ },
+ {
+ "type": "Blog post",
+ "title": "Supabase Partners With Strive School To Help Teach Open Source",
+ "description": "",
+ "postMeta": {
+ "name": "Paul Copplestone",
+ "avatarUrl": "/blog/2020/12/02/supabase-striveschool",
+ "publishDate": "",
+ "readLength": 6
+ },
+ "ctaText": "View blog post"
+ }
+]
diff --git a/www/data/CaseStudies.json b/www/data/CaseStudies.json
new file mode 100644
index 00000000000..2892e8e3057
--- /dev/null
+++ b/www/data/CaseStudies.json
@@ -0,0 +1,50 @@
+[
+ {
+ "type": "Case Study",
+ "title": "A web crawler handling millions of API requests.",
+ "description": "See how Monitoro built an automated a scraping platform using Supabase.",
+ "imgUrl": "images/case-study-monitoro.jpg",
+ "logoUrl": "images/logos/monitoro.png",
+ "organization": "Monitoro",
+ "url": "/blog/2020/12/02/case-study-monitoro",
+ "postMeta": {
+ "name": "Paul Copplestone",
+ "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4",
+ "publishDate": "Mar 16, 2020",
+ "readLength": 6
+ },
+ "ctaText": "View case study"
+ },
+ {
+ "type": "Case Study",
+ "title": "Counter-fraud watchlists for the fintech industry.",
+ "description": "See how Xendit use Supabase to build a full-text search engine.",
+ "imgUrl": "images/case-study-xendit.jpg",
+ "logoUrl": "images/logos/xendit.png",
+ "organization": "Llama Lab",
+ "url": "/blog/2020/12/02/case-study-xendit",
+ "postMeta": {
+ "name": "Paul Copplestone",
+ "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4",
+ "publishDate": "Mar 20, 2020",
+ "readLength": 10
+ },
+ "ctaText": "View case study"
+ },
+ {
+ "type": "Case Study",
+ "title": "A no-code website builder, deployed in seven days.",
+ "description": "See how Tayfa went from idea to paying customer in less than 30 days.",
+ "imgUrl": "images/case-study-tayfab.jpg",
+ "logoUrl": "images/logos/monitoro.png",
+ "organization": "Tayfab",
+ "url": "/blog/2020/12/02/case-study-tayfa",
+ "postMeta": {
+ "name": "Paul Copplestone",
+ "avatarUrl": "https://avatars0.githubusercontent.com/u/10214025?v=4",
+ "publishDate": "Mar 27, 2020",
+ "readLength": 5
+ },
+ "ctaText": "View case study"
+ }
+]
diff --git a/www/data/CodeEditorTheme.js b/www/data/CodeEditorTheme.js
new file mode 100644
index 00000000000..3ac408c9cf6
--- /dev/null
+++ b/www/data/CodeEditorTheme.js
@@ -0,0 +1,116 @@
+const monokaiCustomTheme = {
+ hljs: {
+ display: 'block',
+ overflowX: 'auto',
+ padding: '0.5em',
+ background: '#272822',
+ color: '#ddd',
+ },
+ 'hljs-tag': {
+ color: '#569cd6',
+ },
+ 'hljs-keyword': {
+ color: '#569cd6',
+ fontWeight: 'bold',
+ },
+ 'hljs-selector-tag': {
+ color: '#569cd6',
+ fontWeight: 'bold',
+ },
+ 'hljs-literal': {
+ color: '#569cd6',
+ fontWeight: 'bold',
+ },
+ 'hljs-strong': {
+ color: '#569cd6',
+ },
+ 'hljs-name': {
+ color: '#569cd6',
+ },
+ 'hljs-code': {
+ color: '#66d9ef',
+ },
+ 'hljs-class .hljs-title': {
+ color: 'white',
+ },
+ 'hljs-attribute': {
+ color: '#bf79db',
+ },
+ 'hljs-symbol': {
+ color: '#bf79db',
+ },
+ 'hljs-regexp': {
+ color: '#bf79db',
+ },
+ 'hljs-link': {
+ color: '#bf79db',
+ },
+ 'hljs-string': {
+ color: '#3ECF8E',
+ },
+ 'hljs-bullet': {
+ color: '#3ECF8E',
+ },
+ 'hljs-subst': {
+ color: '#3ECF8E',
+ },
+ 'hljs-title': {
+ color: '#3ECF8E',
+ fontWeight: 'bold',
+ },
+ 'hljs-section': {
+ color: '#3ECF8E',
+ fontWeight: 'bold',
+ },
+ 'hljs-emphasis': {
+ color: '#3ECF8E',
+ },
+ 'hljs-type': {
+ color: '#3ECF8E',
+ fontWeight: 'bold',
+ },
+ 'hljs-built_in': {
+ color: '#3ECF8E',
+ },
+ 'hljs-builtin-name': {
+ color: '#3ECF8E',
+ },
+ 'hljs-selector-attr': {
+ color: '#3ECF8E',
+ },
+ 'hljs-selector-pseudo': {
+ color: '#3ECF8E',
+ },
+ 'hljs-addition': {
+ color: '#3ECF8E',
+ },
+ 'hljs-variable': {
+ color: '#3ECF8E',
+ },
+ 'hljs-template-tag': {
+ color: '#3ECF8E',
+ },
+ 'hljs-template-variable': {
+ color: '#3ECF8E',
+ },
+ 'hljs-comment': {
+ color: '#75715e',
+ },
+ 'hljs-quote': {
+ color: '#75715e',
+ },
+ 'hljs-deletion': {
+ color: '#75715e',
+ },
+ 'hljs-meta': {
+ color: '#75715e',
+ },
+ 'hljs-doctag': {
+ fontWeight: 'bold',
+ },
+ 'hljs-selector-id': {
+ fontWeight: 'bold',
+ },
+}
+
+export default monokaiCustomTheme
diff --git a/www/data/CodeExamples.ts b/www/data/CodeExamples.ts
new file mode 100644
index 00000000000..e1002e9cbd0
--- /dev/null
+++ b/www/data/CodeExamples.ts
@@ -0,0 +1,244 @@
+interface Code {
+ javascript: string
+}
+
+export interface ExampleProps {
+ id: string
+ name: string
+ description: string
+ code: Code
+}
+
+export const createUserExample: ExampleProps = {
+ id: 'createUserExample',
+ name: 'Create user',
+ description: 'Sign up a new user in an example chat room',
+ code: {
+ javascript: `
+ import { createClient } from '@supabase/supabase-js'
+
+ // Initialize
+ const supabaseUrl = 'https://chat-room.supabase.co'
+ const supabaseKey = 'public-anon-key'
+ const supabase = createClient(supabaseUrl, supabaseKey)
+
+ // Create a new user
+ const { user, error } = await supabase.auth.signUp({
+ email: 'example@email.com',
+ password: 'example-password',
+ })
+ `,
+ },
+}
+
+export const subscribeExample: ExampleProps = {
+ id: 'subscribeExample',
+ name: 'Realtime subscriptions',
+ description: 'Receive realtime messages in an example chat room',
+ code: {
+ javascript: `
+ import { createClient } from '@supabase/supabase-js'
+
+ // Initialize
+ const supabaseUrl = 'https://chat-room.supabase.co'
+ const supabaseKey = 'public-anon-key'
+ const supabase = createClient(supabaseUrl, supabaseKey)
+
+ // Get notified of all new chat messages
+ const realtime = supabase
+ .from('messages')
+ .on('INSERT', message => {
+ console.log('New message!', message)
+ })
+ .subscribe()
+ `,
+ },
+}
+
+export const readExample: ExampleProps = {
+ id: 'readExample',
+ name: 'Read a record',
+ description: 'Get all public rooms and their messages',
+ code: {
+ javascript: `
+ import { createClient } from '@supabase/supabase-js'
+
+ // Initialize
+ const supabaseUrl = 'https://chat-room.supabase.co'
+ const supabaseKey = 'public-anon-key'
+ const supabase = createClient(supabaseUrl, supabaseKey)
+
+ // Get public rooms and their messages
+ const publicRooms = await supabase
+ .from('rooms')
+ .select(\`
+ name,
+ messages ( text )
+ \`)
+ .eq('public', true)
+ `,
+ },
+}
+
+export const createExample: ExampleProps = {
+ id: 'createExample',
+ name: 'Create a record',
+ description: 'Create a new chat room',
+ code: {
+ javascript: `
+ import { createClient } from '@supabase/supabase-js'
+
+ // Initialize
+ const supabaseUrl = 'https://chat-room.supabase.co'
+ const supabaseKey = 'public-anon-key'
+ const supabase = createClient(supabaseUrl, supabaseKey)
+
+ // Create a new chat room
+ const newRoom = await supabase
+ .from('rooms')
+ .insert({ name: 'Supabase Fan Club', public: true })
+ `,
+ },
+}
+
+export const updateExample: ExampleProps = {
+ id: 'updateExample',
+ name: 'Update a record',
+ description: 'Update a user',
+ code: {
+ javascript: `
+ import { createClient } from '@supabase/supabase-js'
+
+ // Initialize
+ const supabaseUrl = 'https://chat-room.supabase.co'
+ const supabaseKey = 'public-anon-key'
+ const supabase = createClient(supabaseUrl, supabaseKey)
+
+ // Update multiple users
+ const updatedUsers = await supabase
+ .from('users')
+ .eq('account_type', 'paid')
+ .update({ highlight_color: 'gold' })
+ `,
+ },
+}
+
+// const heroExample = `
+// const messages = supabase
+// .from('messages')
+// .select(\`
+// id, text,
+// user ( id, name )
+// \`)
+
+// const newMessages = supabase
+// .from('messages')
+// .on('INSERT', message => console.log('New message!', message) )
+// .subscribe()
+// `
+// const subscribeExample = `
+// import { createClient } from '@supabase/supabase-js'
+
+// // Initialize
+// const supabaseUrl = 'https://chat-room.supabase.co'
+// const supabaseKey = 'public-anon-key'
+// const supabase = createClient(supabaseUrl, supabaseKey)
+
+// // Get notified of all new chat messages
+// const realtime = supabase
+// .from('messages')
+// .on('INSERT', message => {
+// console.log('New message!', message)
+// })
+// .subscribe()
+// `
+// const readExample = `
+// import { createClient } from '@supabase/supabase-js'
+
+// // Initialize
+// const supabaseUrl = 'https://chat-room.supabase.co'
+// const supabaseKey = 'public-anon-key'
+// const supabase = createClient(supabaseUrl, supabaseKey)
+
+// // Get public rooms and their messages
+// const publicRooms = await supabase
+// .from('rooms')
+// .select(\`
+// name,
+// messages ( text )
+// \`)
+// .eq('public', true)
+// `
+// const createExample = `
+// import { createClient } from '@supabase/supabase-js'
+
+// // Initialize
+// const supabaseUrl = 'https://chat-room.supabase.co'
+// const supabaseKey = 'public-anon-key'
+// const supabase = createClient(supabaseUrl, supabaseKey)
+
+// // Create a new chat room
+// const newRoom = await supabase
+// .from('rooms')
+// .insert({ name: 'Supabase Fan Club', public: true })
+// `
+// const updateExample = `
+// import { createClient } from '@supabase/supabase-js'
+
+// // Initialize
+// const supabaseUrl = 'https://chat-room.supabase.co'
+// const supabaseKey = 'public-anon-key'
+// const supabase = createClient(supabaseUrl, supabaseKey)
+
+// // Update multiple users
+// const updatedUsers = await supabase
+// .from('users')
+// .eq('account_type', 'paid')
+// .update({ highlight_color: 'gold' })
+// `
+// const nodeTSExample = `
+// import { NextApiRequest, NextApiResponse } from 'next';
+// import { createClient } from '@supabase/supabase-js';
+
+// const supabase = createClient(
+// process.env.NEXT_PUBLIC_SUPABASE_URL,
+// process.env.SUPABASE_SECRET_KEY
+// );
+
+// type User = {
+// id: string;
+// username: string;
+// status: 'ONLINE' | 'OFFLINE';
+// };
+
+// export default async (req: NextApiRequest, res: NextApiResponse) => {
+// const allOnlineUsers = await supabase
+// .from('users')
+// .select('*')
+// .eq('status', 'ONLINE');
+// res.status(200).json(allOnlineUsers);
+// };
+// `
+
+// const umdExample = `
+//
+
+//
+// `
diff --git a/www/data/Community.tsx b/www/data/Community.tsx
new file mode 100644
index 00000000000..93e5afad0ba
--- /dev/null
+++ b/www/data/Community.tsx
@@ -0,0 +1,67 @@
+import DeveloperSignups from 'data/DeveloperSignups'
+
+type CommunityItem = {
+ title: string
+ stat: string
+ statLabel: string
+ img: string
+ detail: any // some component to show when selected
+ invertImgDarkMode?: boolean
+}
+
+const data: CommunityItem[] = [
+ {
+ title: 'Developers',
+ stat: '50,000+',
+ statLabel: 'Registered developers',
+ img: 'supabase.png',
+ detail: () => (
+
+ {DeveloperSignups.map((signup) => (
+
+
+
+ ))}
+
+ ),
+ },
+ {
+ title: 'GitHub',
+ stat: '30,000+',
+ statLabel: 'GitHub stars',
+ img: 'github.png',
+ invertImgDarkMode: true,
+ detail: () => (
+
+ ),
+ },
+ {
+ title: 'Twitter',
+ stat: '26,000+',
+ statLabel: 'Followers',
+ img: 'twitter.png',
+ detail: () => (
+
+
Some twitter callouts
+
+ ),
+ },
+ {
+ title: 'Discord',
+ stat: '6,000+',
+ statLabel: 'SuperTroopers',
+ img: 'discord.png',
+ detail: () => (
+
+ ),
+ },
+]
+
+export default data
diff --git a/www/data/Companies.tsx b/www/data/Companies.tsx
new file mode 100644
index 00000000000..aa0f53fd7c6
--- /dev/null
+++ b/www/data/Companies.tsx
@@ -0,0 +1,105 @@
+type Companies = {
+ name: string
+ image: string
+}
+
+const data: Companies[] = [
+ {
+ name: 'wells-fargo',
+ image: '/images/company/companies-using-supabase/wells-fargo.png',
+ },
+ {
+ name: 'under-armour',
+ image: '/images/company/companies-using-supabase/under-armour.png',
+ },
+ {
+ name: 'audi-logo',
+ image: '/images/company/companies-using-supabase/audi-logo.png',
+ },
+ {
+ name: 'capitalone',
+ image: '/images/company/companies-using-supabase/capitalone.png',
+ },
+ {
+ name: 'coinbase',
+ image: '/images/company/companies-using-supabase/coinbase.png',
+ },
+ {
+ name: 'facebook',
+ image: '/images/company/companies-using-supabase/facebook.png',
+ },
+ {
+ name: 'github',
+ image: '/images/company/companies-using-supabase/github.png',
+ },
+ {
+ name: 'google',
+ image: '/images/company/companies-using-supabase/google.png',
+ },
+ {
+ name: 'gsk',
+ image: '/images/company/companies-using-supabase/gsk.png',
+ },
+ {
+ name: 'hewlett-packard',
+ image: '/images/company/companies-using-supabase/hewlett-packard.png',
+ },
+ {
+ name: 'hubspot',
+ image: '/images/company/companies-using-supabase/hubspot.png',
+ },
+ {
+ name: 'ibm',
+ image: '/images/company/companies-using-supabase/ibm.png',
+ },
+ {
+ name: 'instagram',
+ image: '/images/company/companies-using-supabase/instagram.png',
+ },
+ {
+ name: 'linkedin',
+ image: '/images/company/companies-using-supabase/linkedin.png',
+ },
+ {
+ name: 'microsoft',
+ image: '/images/company/companies-using-supabase/microsoft.png',
+ },
+ {
+ name: 'netflix',
+ image: '/images/company/companies-using-supabase/netflix.png',
+ },
+ {
+ name: 'notion',
+ image: '/images/company/companies-using-supabase/notion.png',
+ },
+ {
+ name: 'red-hat',
+ image: '/images/company/companies-using-supabase/red-hat.png',
+ },
+ {
+ name: 'robinhood',
+ image: '/images/company/companies-using-supabase/robinhood.png',
+ },
+ {
+ name: 'salesforce',
+ image: '/images/company/companies-using-supabase/salesforce.png',
+ },
+ {
+ name: 'santander',
+ image: '/images/company/companies-using-supabase/santander.png',
+ },
+ {
+ name: 'shopify',
+ image: '/images/company/companies-using-supabase/shopify.png',
+ },
+ {
+ name: 'squarespace',
+ image: '/images/company/companies-using-supabase/squarespace.png',
+ },
+ {
+ name: 'twitter',
+ image: '/images/company/companies-using-supabase/twitter.png',
+ },
+]
+
+export default data
diff --git a/www/data/Company.json b/www/data/Company.json
new file mode 100644
index 00000000000..60f2df1d29c
--- /dev/null
+++ b/www/data/Company.json
@@ -0,0 +1,26 @@
+[
+ {
+ "text": "Blog",
+ "description": "Read the latest developments from Supabase",
+ "url": "/blog",
+ "icon": "M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"
+ },
+ {
+ "text": "Open Source",
+ "description": "Supabase is an opensource company, supporting existing open source tools and communities wherever possible.",
+ "url": "/docs/oss",
+ "icon": "M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"
+ },
+ {
+ "text": "Humans.txt",
+ "description": "Overview of Supabase staff",
+ "url": "/humans.txt",
+ "icon": "M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"
+ },
+ {
+ "text": "Lawyers.txt",
+ "description": "Details of technology used by Supabase",
+ "url": "/lawyers.txt",
+ "icon": "M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
+ }
+]
diff --git a/www/data/Countries.json b/www/data/Countries.json
new file mode 100644
index 00000000000..5df305aeb22
--- /dev/null
+++ b/www/data/Countries.json
@@ -0,0 +1,1002 @@
+[
+ {
+ "code": "AF",
+ "name": "Afghanistan"
+ },
+ {
+ "code": "AX",
+ "name": "Aland Islands"
+ },
+ {
+ "code": "AL",
+ "name": "Albania"
+ },
+ {
+ "code": "DZ",
+ "name": "Algeria"
+ },
+ {
+ "code": "AS",
+ "name": "American Samoa"
+ },
+ {
+ "code": "AD",
+ "name": "Andorra"
+ },
+ {
+ "code": "AO",
+ "name": "Angola"
+ },
+ {
+ "code": "AI",
+ "name": "Anguilla"
+ },
+ {
+ "code": "AQ",
+ "name": "Antarctica"
+ },
+ {
+ "code": "AG",
+ "name": "Antigua and Barbuda"
+ },
+ {
+ "code": "AR",
+ "name": "Argentina"
+ },
+ {
+ "code": "AM",
+ "name": "Armenia"
+ },
+ {
+ "code": "AW",
+ "name": "Aruba"
+ },
+ {
+ "code": "AU",
+ "name": "Australia"
+ },
+ {
+ "code": "AT",
+ "name": "Austria"
+ },
+ {
+ "code": "AZ",
+ "name": "Azerbaijan"
+ },
+ {
+ "code": "BS",
+ "name": "Bahamas"
+ },
+ {
+ "code": "BH",
+ "name": "Bahrain"
+ },
+ {
+ "code": "BD",
+ "name": "Bangladesh"
+ },
+ {
+ "code": "BB",
+ "name": "Barbados"
+ },
+ {
+ "code": "BY",
+ "name": "Belarus"
+ },
+ {
+ "code": "BE",
+ "name": "Belgium"
+ },
+ {
+ "code": "BZ",
+ "name": "Belize"
+ },
+ {
+ "code": "BJ",
+ "name": "Benin"
+ },
+ {
+ "code": "BM",
+ "name": "Bermuda"
+ },
+ {
+ "code": "BT",
+ "name": "Bhutan"
+ },
+ {
+ "code": "BO",
+ "name": "Bolivia"
+ },
+ {
+ "code": "BQ",
+ "name": "Bonaire, Saint Eustatius and Saba "
+ },
+ {
+ "code": "BA",
+ "name": "Bosnia and Herzegovina"
+ },
+ {
+ "code": "BW",
+ "name": "Botswana"
+ },
+ {
+ "code": "BV",
+ "name": "Bouvet Island"
+ },
+ {
+ "code": "BR",
+ "name": "Brazil"
+ },
+ {
+ "code": "IO",
+ "name": "British Indian Ocean Territory"
+ },
+ {
+ "code": "VG",
+ "name": "British Virgin Islands"
+ },
+ {
+ "code": "BN",
+ "name": "Brunei"
+ },
+ {
+ "code": "BG",
+ "name": "Bulgaria"
+ },
+ {
+ "code": "BF",
+ "name": "Burkina Faso"
+ },
+ {
+ "code": "BI",
+ "name": "Burundi"
+ },
+ {
+ "code": "KH",
+ "name": "Cambodia"
+ },
+ {
+ "code": "CM",
+ "name": "Cameroon"
+ },
+ {
+ "code": "CA",
+ "name": "Canada"
+ },
+ {
+ "code": "CV",
+ "name": "Cape Verde"
+ },
+ {
+ "code": "KY",
+ "name": "Cayman Islands"
+ },
+ {
+ "code": "CF",
+ "name": "Central African Republic"
+ },
+ {
+ "code": "TD",
+ "name": "Chad"
+ },
+ {
+ "code": "CL",
+ "name": "Chile"
+ },
+ {
+ "code": "CN",
+ "name": "China"
+ },
+ {
+ "code": "CX",
+ "name": "Christmas Island"
+ },
+ {
+ "code": "CC",
+ "name": "Cocos Islands"
+ },
+ {
+ "code": "CO",
+ "name": "Colombia"
+ },
+ {
+ "code": "KM",
+ "name": "Comoros"
+ },
+ {
+ "code": "CK",
+ "name": "Cook Islands"
+ },
+ {
+ "code": "CR",
+ "name": "Costa Rica"
+ },
+ {
+ "code": "HR",
+ "name": "Croatia"
+ },
+ {
+ "code": "CU",
+ "name": "Cuba"
+ },
+ {
+ "code": "CW",
+ "name": "Curacao"
+ },
+ {
+ "code": "CY",
+ "name": "Cyprus"
+ },
+ {
+ "code": "CZ",
+ "name": "Czech Republic"
+ },
+ {
+ "code": "CD",
+ "name": "Democratic Republic of the Congo"
+ },
+ {
+ "code": "DK",
+ "name": "Denmark"
+ },
+ {
+ "code": "DJ",
+ "name": "Djibouti"
+ },
+ {
+ "code": "DM",
+ "name": "Dominica"
+ },
+ {
+ "code": "DO",
+ "name": "Dominican Republic"
+ },
+ {
+ "code": "TL",
+ "name": "East Timor"
+ },
+ {
+ "code": "EC",
+ "name": "Ecuador"
+ },
+ {
+ "code": "EG",
+ "name": "Egypt"
+ },
+ {
+ "code": "SV",
+ "name": "El Salvador"
+ },
+ {
+ "code": "GQ",
+ "name": "Equatorial Guinea"
+ },
+ {
+ "code": "ER",
+ "name": "Eritrea"
+ },
+ {
+ "code": "EE",
+ "name": "Estonia"
+ },
+ {
+ "code": "ET",
+ "name": "Ethiopia"
+ },
+ {
+ "code": "FK",
+ "name": "Falkland Islands"
+ },
+ {
+ "code": "FO",
+ "name": "Faroe Islands"
+ },
+ {
+ "code": "FJ",
+ "name": "Fiji"
+ },
+ {
+ "code": "FI",
+ "name": "Finland"
+ },
+ {
+ "code": "FR",
+ "name": "France"
+ },
+ {
+ "code": "GF",
+ "name": "French Guiana"
+ },
+ {
+ "code": "PF",
+ "name": "French Polynesia"
+ },
+ {
+ "code": "TF",
+ "name": "French Southern Territories"
+ },
+ {
+ "code": "GA",
+ "name": "Gabon"
+ },
+ {
+ "code": "GM",
+ "name": "Gambia"
+ },
+ {
+ "code": "GE",
+ "name": "Georgia"
+ },
+ {
+ "code": "DE",
+ "name": "Germany"
+ },
+ {
+ "code": "GH",
+ "name": "Ghana"
+ },
+ {
+ "code": "GI",
+ "name": "Gibraltar"
+ },
+ {
+ "code": "GR",
+ "name": "Greece"
+ },
+ {
+ "code": "GL",
+ "name": "Greenland"
+ },
+ {
+ "code": "GD",
+ "name": "Grenada"
+ },
+ {
+ "code": "GP",
+ "name": "Guadeloupe"
+ },
+ {
+ "code": "GU",
+ "name": "Guam"
+ },
+ {
+ "code": "GT",
+ "name": "Guatemala"
+ },
+ {
+ "code": "GG",
+ "name": "Guernsey"
+ },
+ {
+ "code": "GN",
+ "name": "Guinea"
+ },
+ {
+ "code": "GW",
+ "name": "Guinea-Bissau"
+ },
+ {
+ "code": "GY",
+ "name": "Guyana"
+ },
+ {
+ "code": "HT",
+ "name": "Haiti"
+ },
+ {
+ "code": "HM",
+ "name": "Heard Island and McDonald Islands"
+ },
+ {
+ "code": "HN",
+ "name": "Honduras"
+ },
+ {
+ "code": "HK",
+ "name": "Hong Kong"
+ },
+ {
+ "code": "HU",
+ "name": "Hungary"
+ },
+ {
+ "code": "IS",
+ "name": "Iceland"
+ },
+ {
+ "code": "IN",
+ "name": "India"
+ },
+ {
+ "code": "ID",
+ "name": "Indonesia"
+ },
+ {
+ "code": "IR",
+ "name": "Iran"
+ },
+ {
+ "code": "IQ",
+ "name": "Iraq"
+ },
+ {
+ "code": "IE",
+ "name": "Ireland"
+ },
+ {
+ "code": "IM",
+ "name": "Isle of Man"
+ },
+ {
+ "code": "IL",
+ "name": "Israel"
+ },
+ {
+ "code": "IT",
+ "name": "Italy"
+ },
+ {
+ "code": "CI",
+ "name": "Ivory Coast"
+ },
+ {
+ "code": "JM",
+ "name": "Jamaica"
+ },
+ {
+ "code": "JP",
+ "name": "Japan"
+ },
+ {
+ "code": "JE",
+ "name": "Jersey"
+ },
+ {
+ "code": "JO",
+ "name": "Jordan"
+ },
+ {
+ "code": "KZ",
+ "name": "Kazakhstan"
+ },
+ {
+ "code": "KE",
+ "name": "Kenya"
+ },
+ {
+ "code": "KI",
+ "name": "Kiribati"
+ },
+ {
+ "code": "XK",
+ "name": "Kosovo"
+ },
+ {
+ "code": "KW",
+ "name": "Kuwait"
+ },
+ {
+ "code": "KG",
+ "name": "Kyrgyzstan"
+ },
+ {
+ "code": "LA",
+ "name": "Laos"
+ },
+ {
+ "code": "LV",
+ "name": "Latvia"
+ },
+ {
+ "code": "LB",
+ "name": "Lebanon"
+ },
+ {
+ "code": "LS",
+ "name": "Lesotho"
+ },
+ {
+ "code": "LR",
+ "name": "Liberia"
+ },
+ {
+ "code": "LY",
+ "name": "Libya"
+ },
+ {
+ "code": "LI",
+ "name": "Liechtenstein"
+ },
+ {
+ "code": "LT",
+ "name": "Lithuania"
+ },
+ {
+ "code": "LU",
+ "name": "Luxembourg"
+ },
+ {
+ "code": "MO",
+ "name": "Macao"
+ },
+ {
+ "code": "MK",
+ "name": "Macedonia"
+ },
+ {
+ "code": "MG",
+ "name": "Madagascar"
+ },
+ {
+ "code": "MW",
+ "name": "Malawi"
+ },
+ {
+ "code": "MY",
+ "name": "Malaysia"
+ },
+ {
+ "code": "MV",
+ "name": "Maldives"
+ },
+ {
+ "code": "ML",
+ "name": "Mali"
+ },
+ {
+ "code": "MT",
+ "name": "Malta"
+ },
+ {
+ "code": "MH",
+ "name": "Marshall Islands"
+ },
+ {
+ "code": "MQ",
+ "name": "Martinique"
+ },
+ {
+ "code": "MR",
+ "name": "Mauritania"
+ },
+ {
+ "code": "MU",
+ "name": "Mauritius"
+ },
+ {
+ "code": "YT",
+ "name": "Mayotte"
+ },
+ {
+ "code": "MX",
+ "name": "Mexico"
+ },
+ {
+ "code": "FM",
+ "name": "Micronesia"
+ },
+ {
+ "code": "MD",
+ "name": "Moldova"
+ },
+ {
+ "code": "MC",
+ "name": "Monaco"
+ },
+ {
+ "code": "MN",
+ "name": "Mongolia"
+ },
+ {
+ "code": "ME",
+ "name": "Montenegro"
+ },
+ {
+ "code": "MS",
+ "name": "Montserrat"
+ },
+ {
+ "code": "MA",
+ "name": "Morocco"
+ },
+ {
+ "code": "MZ",
+ "name": "Mozambique"
+ },
+ {
+ "code": "MM",
+ "name": "Myanmar"
+ },
+ {
+ "code": "NA",
+ "name": "Namibia"
+ },
+ {
+ "code": "NR",
+ "name": "Nauru"
+ },
+ {
+ "code": "NP",
+ "name": "Nepal"
+ },
+ {
+ "code": "NL",
+ "name": "Netherlands"
+ },
+ {
+ "code": "NC",
+ "name": "New Caledonia"
+ },
+ {
+ "code": "NZ",
+ "name": "New Zealand"
+ },
+ {
+ "code": "NI",
+ "name": "Nicaragua"
+ },
+ {
+ "code": "NE",
+ "name": "Niger"
+ },
+ {
+ "code": "NG",
+ "name": "Nigeria"
+ },
+ {
+ "code": "NU",
+ "name": "Niue"
+ },
+ {
+ "code": "NF",
+ "name": "Norfolk Island"
+ },
+ {
+ "code": "KP",
+ "name": "North Korea"
+ },
+ {
+ "code": "MP",
+ "name": "Northern Mariana Islands"
+ },
+ {
+ "code": "NO",
+ "name": "Norway"
+ },
+ {
+ "code": "OM",
+ "name": "Oman"
+ },
+ {
+ "code": "PK",
+ "name": "Pakistan"
+ },
+ {
+ "code": "PW",
+ "name": "Palau"
+ },
+ {
+ "code": "PS",
+ "name": "Palestinian Territory"
+ },
+ {
+ "code": "PA",
+ "name": "Panama"
+ },
+ {
+ "code": "PG",
+ "name": "Papua New Guinea"
+ },
+ {
+ "code": "PY",
+ "name": "Paraguay"
+ },
+ {
+ "code": "PE",
+ "name": "Peru"
+ },
+ {
+ "code": "PH",
+ "name": "Philippines"
+ },
+ {
+ "code": "PN",
+ "name": "Pitcairn"
+ },
+ {
+ "code": "PL",
+ "name": "Poland"
+ },
+ {
+ "code": "PT",
+ "name": "Portugal"
+ },
+ {
+ "code": "PR",
+ "name": "Puerto Rico"
+ },
+ {
+ "code": "QA",
+ "name": "Qatar"
+ },
+ {
+ "code": "CG",
+ "name": "Republic of the Congo"
+ },
+ {
+ "code": "RE",
+ "name": "Reunion"
+ },
+ {
+ "code": "RO",
+ "name": "Romania"
+ },
+ {
+ "code": "RU",
+ "name": "Russia"
+ },
+ {
+ "code": "RW",
+ "name": "Rwanda"
+ },
+ {
+ "code": "BL",
+ "name": "Saint Barthelemy"
+ },
+ {
+ "code": "SH",
+ "name": "Saint Helena"
+ },
+ {
+ "code": "KN",
+ "name": "Saint Kitts and Nevis"
+ },
+ {
+ "code": "LC",
+ "name": "Saint Lucia"
+ },
+ {
+ "code": "MF",
+ "name": "Saint Martin"
+ },
+ {
+ "code": "PM",
+ "name": "Saint Pierre and Miquelon"
+ },
+ {
+ "code": "VC",
+ "name": "Saint Vincent and the Grenadines"
+ },
+ {
+ "code": "WS",
+ "name": "Samoa"
+ },
+ {
+ "code": "SM",
+ "name": "San Marino"
+ },
+ {
+ "code": "ST",
+ "name": "Sao Tome and Principe"
+ },
+ {
+ "code": "SA",
+ "name": "Saudi Arabia"
+ },
+ {
+ "code": "SN",
+ "name": "Senegal"
+ },
+ {
+ "code": "RS",
+ "name": "Serbia"
+ },
+ {
+ "code": "SC",
+ "name": "Seychelles"
+ },
+ {
+ "code": "SL",
+ "name": "Sierra Leone"
+ },
+ {
+ "code": "SG",
+ "name": "Singapore"
+ },
+ {
+ "code": "SX",
+ "name": "Sint Maarten"
+ },
+ {
+ "code": "SK",
+ "name": "Slovakia"
+ },
+ {
+ "code": "SI",
+ "name": "Slovenia"
+ },
+ {
+ "code": "SB",
+ "name": "Solomon Islands"
+ },
+ {
+ "code": "SO",
+ "name": "Somalia"
+ },
+ {
+ "code": "ZA",
+ "name": "South Africa"
+ },
+ {
+ "code": "GS",
+ "name": "South Georgia and the South Sandwich Islands"
+ },
+ {
+ "code": "KR",
+ "name": "South Korea"
+ },
+ {
+ "code": "SS",
+ "name": "South Sudan"
+ },
+ {
+ "code": "ES",
+ "name": "Spain"
+ },
+ {
+ "code": "LK",
+ "name": "Sri Lanka"
+ },
+ {
+ "code": "SD",
+ "name": "Sudan"
+ },
+ {
+ "code": "SR",
+ "name": "Suriname"
+ },
+ {
+ "code": "SJ",
+ "name": "Svalbard and Jan Mayen"
+ },
+ {
+ "code": "SZ",
+ "name": "Swaziland"
+ },
+ {
+ "code": "SE",
+ "name": "Sweden"
+ },
+ {
+ "code": "CH",
+ "name": "Switzerland"
+ },
+ {
+ "code": "SY",
+ "name": "Syria"
+ },
+ {
+ "code": "TW",
+ "name": "Taiwan"
+ },
+ {
+ "code": "TJ",
+ "name": "Tajikistan"
+ },
+ {
+ "code": "TZ",
+ "name": "Tanzania"
+ },
+ {
+ "code": "TH",
+ "name": "Thailand"
+ },
+ {
+ "code": "TG",
+ "name": "Togo"
+ },
+ {
+ "code": "TK",
+ "name": "Tokelau"
+ },
+ {
+ "code": "TO",
+ "name": "Tonga"
+ },
+ {
+ "code": "TT",
+ "name": "Trinidad and Tobago"
+ },
+ {
+ "code": "TN",
+ "name": "Tunisia"
+ },
+ {
+ "code": "TR",
+ "name": "Turkey"
+ },
+ {
+ "code": "TM",
+ "name": "Turkmenistan"
+ },
+ {
+ "code": "TC",
+ "name": "Turks and Caicos Islands"
+ },
+ {
+ "code": "TV",
+ "name": "Tuvalu"
+ },
+ {
+ "code": "VI",
+ "name": "U.S. Virgin Islands"
+ },
+ {
+ "code": "UG",
+ "name": "Uganda"
+ },
+ {
+ "code": "UA",
+ "name": "Ukraine"
+ },
+ {
+ "code": "AE",
+ "name": "United Arab Emirates"
+ },
+ {
+ "code": "GB",
+ "name": "United Kingdom"
+ },
+ {
+ "code": "US",
+ "name": "United States"
+ },
+ {
+ "code": "UM",
+ "name": "United States Minor Outlying Islands"
+ },
+ {
+ "code": "UY",
+ "name": "Uruguay"
+ },
+ {
+ "code": "UZ",
+ "name": "Uzbekistan"
+ },
+ {
+ "code": "VU",
+ "name": "Vanuatu"
+ },
+ {
+ "code": "VA",
+ "name": "Vatican"
+ },
+ {
+ "code": "VE",
+ "name": "Venezuela"
+ },
+ {
+ "code": "VN",
+ "name": "Vietnam"
+ },
+ {
+ "code": "WF",
+ "name": "Wallis and Futuna"
+ },
+ {
+ "code": "EH",
+ "name": "Western Sahara"
+ },
+ {
+ "code": "YE",
+ "name": "Yemen"
+ },
+ {
+ "code": "ZM",
+ "name": "Zambia"
+ },
+ {
+ "code": "ZW",
+ "name": "Zimbabwe"
+ }
+]
diff --git a/www/data/DeveloperFeatures.json b/www/data/DeveloperFeatures.json
new file mode 100644
index 00000000000..95baf3961dc
--- /dev/null
+++ b/www/data/DeveloperFeatures.json
@@ -0,0 +1,26 @@
+[
+ {
+ "name": "TypeScript Support",
+ "description": "Type definitions built directly from your database schema",
+ "badge": "",
+ "url": "/docs/client/generating-types"
+ },
+ {
+ "name": "Install from CDN",
+ "description": "Use Supabase in the browser without a build process",
+ "badge": "",
+ "url": "/docs/client/initializing"
+ },
+ {
+ "name": "Local emulator",
+ "description": "Develop locally and push to production when you're ready",
+ "badge": "",
+ "url": "/docs/guides/self-hosting"
+ },
+ {
+ "name": "Supabase CLI",
+ "description": "Manage Supabase projects from your local machine",
+ "badge": "",
+ "url": "https://github.com/supabase/cli"
+ }
+]
diff --git a/www/data/DeveloperSignups.ts b/www/data/DeveloperSignups.ts
new file mode 100644
index 00000000000..197db07cb43
--- /dev/null
+++ b/www/data/DeveloperSignups.ts
@@ -0,0 +1,57 @@
+type SignupItem = {
+ img: string
+ title: string
+}
+
+const data: SignupItem[] = [
+ {
+ title: 'Vercel',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Netlify',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Vercel',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Netlify',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Vercel',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Netlify',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Vercel',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Netlify',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Vercel',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Netlify',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Vercel',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+ {
+ title: 'Netlify',
+ img: 'https://tailwindui.com/img/logos/mirage-logo-gray-400.svg',
+ },
+]
+
+export default data
diff --git a/www/data/Developers.json b/www/data/Developers.json
new file mode 100644
index 00000000000..02ecb373187
--- /dev/null
+++ b/www/data/Developers.json
@@ -0,0 +1,26 @@
+[
+ {
+ "text": "Documentation",
+ "description": "Everything you need that makes it simple to get started.",
+ "url": "/docs",
+ "icon": "M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"
+ },
+ {
+ "text": "API reference",
+ "description": "Examples and references for using API libraries.",
+ "url": "/docs/client/supabase-client",
+ "icon": "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"
+ },
+ {
+ "text": "Guides",
+ "description": "Examples and references for using supabase.",
+ "url": "/docs/guides/examples",
+ "icon": "M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 15.21a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 3.414H4.828c-1.782 0-2.674-2.154-1.414-3.414l5-5A2 2 0 009 10.172V5L8 4z"
+ },
+ {
+ "text": "Careers",
+ "description": "Join the supabase team and get involved.",
+ "url": "https://about.supabase.com/careers",
+ "icon": "M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2 2v2m4 6h.01M5 20h14a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
+ }
+]
diff --git a/www/data/Examples.json b/www/data/Examples.json
new file mode 100644
index 00000000000..a781292d4ba
--- /dev/null
+++ b/www/data/Examples.json
@@ -0,0 +1,171 @@
+[
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "Svelte kanban board",
+ "description": "A Trello clone using Supabase as the storage system.",
+ "author": "joshnuss",
+ "author_url": "https://github.com/joshnuss",
+ "author_img": "https://avatars.githubusercontent.com/u/4437",
+ "repo_name": "supabase-kanban",
+ "repo_url": "https://github.com/joshnuss/supabase-kanban",
+ "vercel_deploy_url": "",
+ "demo_url": "https://supabase-kanban.vercel.app/"
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "NextJS Realtime chat app",
+ "description": "NextJS Slack clone app using Supabase realtime subscriptions",
+ "author": "supabase",
+ "author_url": "https://github.com/supabase",
+ "author_img": "https://avatars.githubusercontent.com/u/54469796",
+ "repo_name": "nextjs-slack-clone",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ },
+ {
+ "type": "example",
+ "products": ["database", "auth"],
+ "title": "Next.js Subscription and Auth",
+ "description": "The all-in-one starter kit for high-performance SaaS applications.",
+ "author": "Vercel",
+ "author_url": "https://github.com/vercel",
+ "author_img": "https://avatars.githubusercontent.com/u/14985020",
+ "repo_name": "nextjs-subscription-payments",
+ "repo_url": "https://github.com/vercel/nextjs-subscription-payments",
+ "vercel_deploy_url": "https://vercel.com/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnextjs-subscription-payments&project-name=nextjs-subscription-payments&repo-name=nextjs-subscription-payments&demo-title=Next.js%20Subscription%20Payments%20Starter&demo-description=Demo%20project%20on%20Vercel&demo-url=https%3A%2F%2Fsubscription-payments.vercel.app&demo-image=https%3A%2F%2Fsubscription-payments.vercel.app%2Fdemo.png&integration-ids=oac_pb1dqJT8Ry2D99Q0o9qXWIhJ,oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-subscription-payments",
+ "demo_url": "https://subscription-payments.vercel.app/"
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "Expo Starter",
+ "description": "Template bottom tabs with auth flow (Typescript)",
+ "author": "codingki",
+ "author_url": "https://github.com/codingki",
+ "author_img": "https://avatars.githubusercontent.com/u/39829726",
+ "repo_name": "react-native-expo-template",
+ "repo_url": "https://github.com/codingki/react-native-expo-template/tree/master/template-typescript-bottom-tabs-supabase-auth-flow",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ },
+ {
+ "type": "example",
+ "products": ["database", "auth"],
+ "title": "NestJS example",
+ "description": "NestJS example using Supabase Auth",
+ "author": "hiro1107",
+ "author_url": "https://github.com/hiro1107",
+ "author_img": "https://avatars.githubusercontent.com/u/1423067",
+ "repo_name": "nestjs-supabase-auth",
+ "repo_url": "https://github.com/hiro1107/nestjs-supabase-auth",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "ReactJS realtime chat app",
+ "description": "Example app of real-time chat using supabase realtime api",
+ "author": "shwosner",
+ "author_url": "https://github.com/shwosner",
+ "author_img": "https://avatars.githubusercontent.com/u/1423067",
+ "repo_name": "realtime-chat-supabase-react",
+ "repo_url": "https://github.com/shwosner/realtime-chat-supabase-react",
+ "vercel_deploy_url": "",
+ "demo_url": "https://random-chat.netlify.app/"
+ },
+ {
+ "type": "example",
+ "products": ["database", "auth"],
+ "title": "Vanilla-js Auth app",
+ "description": "How to sign up and login using supabase and supabase-js using HTML and JavaScript only",
+ "author": "supabase",
+ "author_url": "https://github.com/supabase",
+ "author_img": "https://avatars.githubusercontent.com/u/54469796",
+ "repo_name": "javascript-auth",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/javascript-auth",
+ "vercel_deploy_url": "",
+ "demo_url": "https://auth-vanilla-js.vercel.app/"
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "React Native todo list app",
+ "description": "React Native Todo List example with Expo",
+ "author": "supabase",
+ "author_url": "https://github.com/supabase",
+ "author_img": "https://avatars.githubusercontent.com/u/54469796",
+ "repo_name": "expo-todo-list",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/expo-todo-list",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "NextJS todo list app",
+ "description": "NextJS todo list example",
+ "author": "supabase",
+ "author_url": "https://github.com/supabase",
+ "author_img": "https://avatars.githubusercontent.com/u/54469796",
+ "repo_name": "nextjs-todo-list",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/nextjs-todo-list",
+ "vercel_deploy_url": "",
+ "demo_url": "https://supabase-nextjs-todo-list.vercel.app/"
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "React todo list app",
+ "description": "React todo List example",
+ "author": "supabase",
+ "author_url": "https://github.com/supabase",
+ "author_img": "https://avatars.githubusercontent.com/u/54469796",
+ "repo_name": "react-todo-list",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/react-todo-list",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "Svelte todo list app",
+ "description": "Sveltejs todo with TailwindCSS and Snowpack",
+ "author": "supabase",
+ "author_url": "https://github.com/supabase",
+ "author_img": "https://avatars.githubusercontent.com/u/54469796",
+ "repo_name": "sveltejs-todo-list",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/sveltejs-todo-list",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "Vue.js todo list app",
+ "description": "Vue.js todo app using TypeScript",
+ "author": "supabase",
+ "author_url": "https://github.com/supabase",
+ "author_img": "https://avatars.githubusercontent.com/u/54469796",
+ "repo_name": "vue3-ts-todo-list",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/vue3-ts-todo-list",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ },
+ {
+ "type": "example",
+ "products": ["database"],
+ "title": "Angular todo list app",
+ "description": "Angular todo List example",
+ "author": "geromegrignon",
+ "author_url": "https://github.com/geromegrignon",
+ "author_img": "https://avatars.githubusercontent.com/u/32737308",
+ "repo_name": "angular-todo-list",
+ "repo_url": "https://github.com/supabase/supabase/tree/master/examples/angular-todo-list",
+ "vercel_deploy_url": "",
+ "demo_url": ""
+ }
+]
diff --git a/www/data/Footer.json b/www/data/Footer.json
new file mode 100644
index 00000000000..e28dcef152c
--- /dev/null
+++ b/www/data/Footer.json
@@ -0,0 +1,114 @@
+[
+ {
+ "title": "Product",
+ "links": [
+ {
+ "text": "Database",
+ "url": "/database"
+ },
+ {
+ "text": "Auth",
+ "url": "/auth"
+ },
+ {
+ "text": "Storage",
+ "url": "/storage"
+ },
+ {
+ "text": "Functions",
+ "url": "/edge-functions"
+ },
+ {
+ "text": "Pricing",
+ "url": "/pricing"
+ },
+ {
+ "text": "Beta",
+ "url": "/beta"
+ }
+ ]
+ },
+ {
+ "title": "Resources",
+ "links": [
+ {
+ "text": "Support",
+ "url": "/support"
+ },
+ {
+ "text": "Brand Assets / Logos",
+ "url": "/brand-assets"
+ },
+ {
+ "text": "Integrations",
+ "url": "/partners/integrations"
+ },
+ {
+ "text": "Experts",
+ "url": "/partners/experts"
+ },
+ {
+ "text": "System Status",
+ "url": "https://status.supabase.com/"
+ },
+ {
+ "text": "Terms of service",
+ "url": "/docs/company/terms"
+ },
+ {
+ "text": "Privacy Policy",
+ "url": "/docs/company/privacy"
+ }
+ ]
+ },
+ {
+ "title": "Developers",
+ "links": [
+ {
+ "text": "Documentation",
+ "url": "/docs"
+ },
+ {
+ "text": "API Reference",
+ "url": "/docs/client/supabase-client"
+ },
+ {
+ "text": "Guides",
+ "url": "/docs/guides/examples"
+ }
+ ]
+ },
+ {
+ "title": "Company",
+ "links": [
+ {
+ "text": "Blog",
+ "url": "/blog"
+ },
+ {
+ "text": "Open Source",
+ "url": "/docs/oss"
+ },
+ {
+ "text": "Careers",
+ "url": "https://about.supabase.com/careers"
+ },
+ {
+ "text": "Company",
+ "url": "/company"
+ },
+ {
+ "text": "Humans.txt",
+ "url": "/humans.txt"
+ },
+ {
+ "text": "Lawyers.txt",
+ "url": "/lawyers.txt"
+ },
+ {
+ "text": "Security.txt",
+ "url": "/.well-known/security.txt"
+ }
+ ]
+ }
+]
diff --git a/www/data/Investors.tsx b/www/data/Investors.tsx
new file mode 100644
index 00000000000..5c07bf3cfd6
--- /dev/null
+++ b/www/data/Investors.tsx
@@ -0,0 +1,356 @@
+type Investor = {
+ name: string
+ round: 'SEED' | 'A'
+ title: string
+ img: string
+ lead: boolean
+ twitter?: string | null
+ linkedIn?: string | null
+}
+
+const data: Investor[] = [
+ {
+ name: 'Coatue',
+ round: 'SEED',
+ title: 'Coatue Growth Fund',
+ img: '/images/logos/coatue.png',
+ lead: true,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Mozilla',
+ round: 'SEED',
+ title: 'Mozilla',
+ img: '/images/logos/mozilla--grey.png',
+ lead: true,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Y Combinator',
+ round: 'A',
+ title: 'Y Combinator',
+ img: '/images/logos/yc--grey.png',
+ lead: true,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Tom Preston-Werner',
+ round: 'A',
+ title: 'GitHub Cofounder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Solomon Hykes',
+ round: 'A',
+ title: 'Docker Cofounder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Guillermo Rauch',
+ round: 'A',
+ title: 'Vercel Founder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Alex Solomon',
+ round: 'A',
+ title: 'PagerDuty Cofounder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Kurt Mackey',
+ round: 'A',
+ title: 'Fly Founder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Alana Anderson',
+ round: 'A',
+ title: 'Base Case Capital',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Lee Robinson',
+ round: 'A',
+ title: 'Vercel DevRel',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Kevin van Gundy',
+ round: 'A',
+ title: 'Vercel CRO',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Pedro Canahuati',
+ round: 'A',
+ title: '1Password CTO, Ex-Facebook',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Tyler McGinnis',
+ round: 'A',
+ title: 'UI.dev Cofounder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Piruze Sabuncu',
+ round: 'A',
+ title: 'Stripe',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Astasia Myers',
+ round: 'A',
+ title: 'Quiet Capital',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Chris Nguyen',
+ round: 'A',
+ title: 'LogDNA Founder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Tod Sacerdoti',
+ round: 'A',
+ title: 'Pipedream Founder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Harold Giménez',
+ round: 'A',
+ title: 'HashiCorp - VP Eng',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Mike Krieger',
+ round: 'SEED',
+ title: 'Instagram Cofounder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Cassidy Williams',
+ round: 'SEED',
+ title: 'Netlify DevRel',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Mathias Biilmann Christensen',
+ round: 'SEED',
+ title: 'Netlify Cofounder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Christian Bach',
+ round: 'SEED',
+ title: 'Netlify Cofounder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Chris Golda',
+ round: 'SEED',
+ title: 'Rogue Capital',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Ben Tossell',
+ round: 'SEED',
+ title: 'Makerpad Founder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Jason Warner',
+ round: 'SEED',
+ title: 'GitHub CTO',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Shawn Wang',
+ round: 'SEED',
+ title: 'Temporal DevRel',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Brian Douglas',
+ round: 'SEED',
+ title: 'GitHub DevRel',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Thorsten Schaeff',
+ round: 'SEED',
+ title: 'Stripe DevRel',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Justin Gage',
+ round: 'SEED',
+ title: 'Retool DevRel',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Zach Waterfield',
+ round: 'SEED',
+ title: 'On Deck',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Yuri Sagalov',
+ round: 'SEED',
+ title: 'Wayfinder Ventures',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Jeff Morris Jr.',
+ round: 'SEED',
+ title: 'Chapter One',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Todd and Rahul Angel Fund',
+ round: 'SEED',
+ title: 'Todd and Rahul Angel Fund',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Ram Parami',
+ round: 'A',
+ title: 'Customer Strategy at Blend',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Elad Gill',
+ round: 'A',
+ title: 'Investor',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Brianne Kimmel',
+ round: 'SEED',
+ title: 'Worklife VC',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Aron Korenblit',
+ round: 'A',
+ title: 'Education at Airtable',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+ {
+ name: 'Ankit Jain',
+ round: 'A',
+ title: 'Infinitus Founder',
+ img: '',
+ lead: false,
+ twitter: null,
+ linkedIn: null,
+ },
+]
+
+export default data
diff --git a/www/data/Press.ts b/www/data/Press.ts
new file mode 100644
index 00000000000..771acc990f7
--- /dev/null
+++ b/www/data/Press.ts
@@ -0,0 +1,47 @@
+type PressItem = {
+ type: 'podcast' | 'video' | 'article' | 'blog' | 'news' | 'event' | 'other'
+ href: string
+ title: string
+ publisher: string
+}
+
+const data: PressItem[] = [
+ {
+ type: 'article',
+ href: 'https://techcrunch.com/2021/09/09/supabase-raises-30m-for-its-open-source-insta-backend',
+ title: 'Open source backend-as-a-service startup Supabase raises $30M',
+ publisher: 'TechCrunch',
+ },
+ {
+ type: 'article',
+ href: 'https://techcrunch.com/2020/12/15/supabase-raises-6m-for-its-open-source-firebase-alternative',
+ title: 'Supabase raises $6M for its open-source Firebase alternative',
+ publisher: 'TechCrunch',
+ },
+ {
+ type: 'podcast',
+ href: 'https://softwareengineeringdaily.com/2020/10/15/supabase-open-source-firebase-with-paul-copplestone',
+ title: 'Software Engineering Daily',
+ publisher: 'Software Engineering Daily',
+ },
+ {
+ type: 'podcast',
+ href: 'https://fsjam.org/episodes/episode-33-supabase-with-paul-copplestone',
+ title: 'FS Jam',
+ publisher: 'FS Jam',
+ },
+ {
+ type: 'podcast',
+ href: 'https://www.heavybit.com/library/podcasts/jamstack-radio/ep-71-open-source-firebase-alternative-with-paul-copplestone-of-supabase',
+ title: 'Jamstack Radio',
+ publisher: 'Heavybit',
+ },
+ {
+ type: 'podcast',
+ href: 'https://podrocket.logrocket.com/9',
+ title: 'PodRocket',
+ publisher: 'LogRocket',
+ },
+]
+
+export default data
diff --git a/www/data/Pricing.json b/www/data/Pricing.json
new file mode 100644
index 00000000000..a75759db6c9
--- /dev/null
+++ b/www/data/Pricing.json
@@ -0,0 +1,349 @@
+{
+ "database": {
+ "title": "Database",
+ "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4",
+ "features": [
+ {
+ "title": "Dedicated Postgres Database",
+ "tooltip": "A Postgres database with no restrictions? You get it. No pseudo limited users, you are the postgres root user. No caveats.",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Unlimited API requests",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Realtime functionality",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Database space",
+ "tiers": {
+ "free": "Up to 500 MB",
+ "pro": "8 GB included, then $0.125 per GB",
+ "enterprise": "Unlimited"
+ }
+ },
+ {
+ "title": "Automatic backups",
+ "tooltip": "Backups are entire copies of your database that can be restored in the future.",
+ "tiers": {
+ "free": false,
+ "pro": "7 days of backup",
+ "enterprise": "30 days Point in Time backup"
+ }
+ },
+ {
+ "title": "Pausing",
+ "tooltip": "Unused projects that have no activity or API requests will be shut down. They can be reactivated by logging into the dashboard",
+ "tiers": {
+ "free": "Paused after 1 week inactivity",
+ "pro": "Never",
+ "enterprise": "Never"
+ }
+ },
+ {
+ "title": "Transfer limits",
+ "tooltip": "Good news, only download operations are counted towards the limit",
+ "tiers": {
+ "free": "Up to 2GB",
+ "pro": "50GB included, then $0.09 per GB",
+ "enterprise": "Unlimited"
+ }
+ }
+ ]
+ },
+ "auth": {
+ "title": "Auth",
+ "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4",
+ "features": [
+ {
+ "title": "Total Users",
+ "tooltip": "The maximum number of users your project can have",
+ "tiers": {
+ "free": "Unlimited",
+ "pro": "Unlimited",
+ "enterprise": "Unlimited"
+ }
+ },
+ {
+ "title": "Social OAuth providers",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Custom SMTP server",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Remove Supabase branding from emails",
+ "tiers": {
+ "free": false,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Enterprise OAuth providers",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Audit trails",
+ "tiers": {
+ "free": "1 hour",
+ "pro": "7 days",
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Custom SMTP",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Supabase Auth emails",
+ "tooltip": "Rate limits do not apply to Custom SMTP",
+ "tiers": {
+ "free": "30 / hour",
+ "pro": "100 / hour",
+ "enterprise": "Contact Us"
+ }
+ }
+ ]
+ },
+ "storage": {
+ "title": "Storage",
+ "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4",
+ "features": [
+ {
+ "title": "Storage total",
+ "tiers": {
+ "free": "Up to 1 GB",
+ "pro": "100 GB included, then $0.021 per GB",
+ "enterprise": "Unlimited"
+ }
+ },
+ {
+ "title": "Transfer limits",
+ "tooltip": "Good news, only download operations are counted towards the limit",
+ "tiers": {
+ "free": "Up to 2 GB",
+ "pro": "200 GB included, then $0.09 per GB",
+ "enterprise": "Unlimited"
+ }
+ },
+ {
+ "title": "Custom access controls",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Max file upload size",
+ "tiers": {
+ "free": "Up to 50MB",
+ "pro": "Up to 5GB",
+ "enterprise": "Unlimited"
+ }
+ }
+ ]
+ },
+ "edge-functions": {
+ "title": "Edge Functions",
+ "icon": "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4",
+ "features": [
+ {
+ "title": "Runtime hours",
+ "tiers": {
+ "free": "100 hours",
+ "pro": "1,000 hours",
+ "enterprise": "Unlimited"
+ }
+ },
+ {
+ "title": "Invocations",
+ "tiers": {
+ "free": "500K",
+ "pro": "2 Million",
+ "enterprise": "Unlimited"
+ }
+ },
+ {
+ "title": "Script size",
+ "tiers": {
+ "free": "1 mb",
+ "pro": "10 mb",
+ "enterprise": "unlimited"
+ }
+ },
+ {
+ "title": "Number of functions",
+ "tiers": {
+ "free": "10",
+ "pro": "100",
+ "enterprise": "unlimited"
+ }
+ }
+ ]
+ },
+ "dashboard": {
+ "title": "Dashboard",
+ "icon": "M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4",
+ "features": [
+ {
+ "title": "Team members",
+ "tiers": {
+ "free": "Unlimited",
+ "pro": "Unlimited",
+ "enterprise": "Unlimited"
+ }
+ },
+ {
+ "title": "Access controls",
+ "tiers": {
+ "free": false,
+ "pro": "Coming soon",
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Audit trails",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ }
+ ]
+ },
+ "support": {
+ "title": "Support and Compliance",
+ "icon": "M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z",
+ "features": [
+ {
+ "title": "Community support",
+ "tiers": {
+ "free": true,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Email support",
+ "tiers": {
+ "free": false,
+ "pro": true,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Email support SLA",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Designated support",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "On Premises / BYO cloud",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "Log retention (API & Database)",
+ "tiers": {
+ "free": "1 day",
+ "pro": "7 days",
+ "enterprise": "3 months"
+ }
+ },
+ {
+ "title": "Log drain",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": "Coming soon"
+ }
+ },
+ {
+ "title": "Metrics endpoint",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "SOC2",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": "Coming soon"
+ }
+ },
+ {
+ "title": "SSO",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": "Contact Us"
+ }
+ },
+ {
+ "title": "99.9% SLA",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ },
+ {
+ "title": "On Boarding Support",
+ "tiers": {
+ "free": false,
+ "pro": false,
+ "enterprise": true
+ }
+ }
+ ]
+ }
+}
diff --git a/www/data/PricingAddOn.json b/www/data/PricingAddOn.json
new file mode 100644
index 00000000000..0eaacfa10de
--- /dev/null
+++ b/www/data/PricingAddOn.json
@@ -0,0 +1,235 @@
+{
+ "database": {
+ "title": "Database",
+ "features": [
+ "Fully Managed PostgreSQL",
+ "Dedicated Postgres Database",
+ "Optimized Database Instances",
+ "Realtime Functionality"
+ ],
+ "rows": [
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Free (Included)" },
+ { "key": "pricing", "title": "Pricing", "value": "$0" },
+ { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" },
+ { "key": "memory", "title": "Memory", "value": "1 GB" },
+ { "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 2,085 Mbps" },
+ {
+ "key": "directConnections",
+ "title": "Connections: Direct",
+ "value": "10 (recommended)"
+ },
+ {
+ "key": "poolerConnections",
+ "title": "Connections: Pooler",
+ "value": "50 (recommended)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Small" },
+ { "key": "pricing", "title": "Pricing", "value": "$5" },
+ { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" },
+ { "key": "memory", "title": "Memory", "value": "2 GB" },
+ { "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 2,085 Mbps" },
+ {
+ "key": "directConnections",
+ "title": "Connections: Direct",
+ "value": "10 (recommended)"
+ },
+ {
+ "key": "poolerConnections",
+ "title": "Connections: Pooler",
+ "value": "50 (recommended)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Medium" },
+ { "key": "pricing", "title": "Pricing", "value": "$50" },
+ { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" },
+ { "key": "memory", "title": "Memory", "value": "4 GB" },
+ { "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 2,085 Mbps" },
+ {
+ "key": "directConnections",
+ "title": "Connections: Direct",
+ "value": "50 (recommended)"
+ },
+ {
+ "key": "poolerConnections",
+ "title": "Connections: Pooler",
+ "value": "500 (recommended)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Large" },
+ { "key": "pricing", "title": "Pricing", "value": "$100" },
+ { "key": "cpu", "title": "CPU", "value": "2-core ARM (dedicated)" },
+ { "key": "memory", "title": "Memory", "value": "8 GB" },
+ { "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 4,750 Mbps" },
+ {
+ "key": "directConnections",
+ "title": "Connections: Direct",
+ "value": "100 (recommended)"
+ },
+ {
+ "key": "poolerConnections",
+ "title": "Connections: Pooler",
+ "value": "1000 (recommended)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "XL" },
+ { "key": "pricing", "title": "Pricing", "value": "$200" },
+ { "key": "cpu", "title": "CPU", "value": "4-core ARM (dedicated)" },
+ { "key": "memory", "title": "Memory", "value": "16 GB" },
+ { "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 4,750 Mbps" },
+ {
+ "key": "directConnections",
+ "title": "Connections: Direct",
+ "value": "200 (recommended)"
+ },
+ {
+ "key": "poolerConnections",
+ "title": "Connections: Pooler",
+ "value": "2000 (recommended)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "2XL" },
+ { "key": "pricing", "title": "Pricing", "value": "$400" },
+ { "key": "cpu", "title": "CPU", "value": "8-core ARM (dedicated)" },
+ { "key": "memory", "title": "Memory", "value": "32 GB" },
+ { "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Up to 4,750 Mbps" },
+ {
+ "key": "directConnections",
+ "title": "Connections: Direct",
+ "value": "400 (recommended)"
+ },
+ {
+ "key": "poolerConnections",
+ "title": "Connections: Pooler",
+ "value": "4000 (recommended)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Custom (need more?)" },
+ { "key": "pricing", "title": "Pricing", "value": "Contact Us" },
+ { "key": "cpu", "title": "CPU", "value": "Contact Us" },
+ { "key": "memory", "title": "Memory", "value": "Contact Us" },
+ { "key": "diskIO", "title": "Disk IO Bandwidth", "value": "Contact Us" },
+ {
+ "key": "directConnections",
+ "title": "Connections: Direct",
+ "value": "Contact Us"
+ },
+ {
+ "key": "poolerConnections",
+ "title": "Connections: Pooler",
+ "value": "Contact Us"
+ }
+ ]
+ }
+ ]
+ },
+ "support": {
+ "title": "Support",
+ "features": [
+ "Guaranteed Response Times",
+ "SLAs",
+ "Designated Support",
+ "Advanced Support Scope"
+ ],
+ "rows": [
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Standard" },
+ { "key": "pricing", "title": "Pricing", "value": "Contact Us" },
+ {
+ "key": "severityLevelUrgent",
+ "title": "1. Severity Level: Urgent",
+ "value": "1 business hour (24/7x365)"
+ },
+ {
+ "key": "severityLevelHigh",
+ "title": "2. Severity Level: High",
+ "value": "4 business hours (Monday - Friday)"
+ },
+ {
+ "key": "severityLevelNormal",
+ "title": "3. Severity Level: Normal",
+ "value": "1 business day (Monday - Friday)"
+ },
+ {
+ "key": "severityLevelLow",
+ "title": "4. Severity Level: Low",
+ "value": "2 business days (Monday - Friday)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Priority" },
+ { "key": "pricing", "title": "Pricing", "value": "Contact Us" },
+ {
+ "key": "severityLevelUrgent",
+ "title": "1. Severity Level: Urgent",
+ "value": "1 business hour (24/7x365)"
+ },
+ {
+ "key": "severityLevelHigh",
+ "title": "2. Severity Level: High",
+ "value": "2 business hours (Monday - Friday)"
+ },
+ {
+ "key": "severityLevelNormal",
+ "title": "3. Severity Level: Normal",
+ "value": "1 business day (Monday - Friday)"
+ },
+ {
+ "key": "severityLevelLow",
+ "title": "4. Severity Level: Low",
+ "value": "2 business days (Monday - Friday)"
+ }
+ ]
+ },
+ {
+ "columns": [
+ { "key": "plan", "title": "Plan", "value": "Priority Plus" },
+ { "key": "pricing", "title": "Pricing", "value": "Contact Us" },
+ {
+ "key": "severityLevelUrgent",
+ "title": "1. Severity Level: Urgent",
+ "value": "1 business hour (24/7x365)"
+ },
+ {
+ "key": "severityLevelHigh",
+ "title": "2. Severity Level: High",
+ "value": "2 business hours (24/7x365)"
+ },
+ {
+ "key": "severityLevelNormal",
+ "title": "3. Severity Level: Normal",
+ "value": "12 business hours (Monday - Friday)"
+ },
+ {
+ "key": "severityLevelLow",
+ "title": "4. Severity Level: Low",
+ "value": "1 business days (Monday - Friday)"
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/www/data/PricingFAQ.json b/www/data/PricingFAQ.json
new file mode 100644
index 00000000000..f4792801ab6
--- /dev/null
+++ b/www/data/PricingFAQ.json
@@ -0,0 +1,38 @@
+[
+ {
+ "question": "Can I cap my usage so my bill doesn't run over.",
+ "answer": "Yes. Spend caps are on by default on the pro tier. You can turn spend caps off for usage beyond the tier limits to pay as you grow."
+ },
+ {
+ "question": "I'm worried I could end up with a huge bill at the end of the month.",
+ "answer": "Spend caps are on by default and you need to toggle them off from your dashboard to enable pay as you grow pricing."
+ },
+ {
+ "question": "When will I be billed?",
+ "answer": "Our Pro plan is charged up front, and billed on a monthly basis. Additional usage costs are billing are also billed at the end of the month."
+ },
+ {
+ "question": "Can I cap my additional usage so my bill doesn't run over $25?",
+ "answer": "Please note: The following feature will roll out 11th April 2022. Soft limits are currently in place, and we will contact the project owner if the project usage exceeds the allocated free limits | Pro plan projects have an optional 'Spend cap'. When this is enabled, the project will not go over the included Pro plan allocated limits."
+ },
+ {
+ "question": "Are you going to change your pricing in the future?",
+ "answer": "Our pricing is in Beta. You can read more about our decisions in our blog on pricing [here](/blog/2021/03/29/pricing). Pricing may change in the future, however as a team of developers we are committed to pricing being as developer friendly as possible."
+ },
+ {
+ "question": "What happens if I cancel my subscription",
+ "answer": "The organization is allocated credits for unused time during the billing month. Those credits can be used for other projects."
+ },
+ {
+ "question": "Do I get a notification if I am approaching my usage limits?",
+ "answer": "Yes, we will email you when you are within 20% of your tier limits."
+ },
+ {
+ "question": "What if I need one project for development and one for production?",
+ "answer": "We are working on multi-environment projects. For now, you can create a project for your development backend and production backend. We give you 2 free projects as part of our free tier. This means you could have a development and a production server as part of your free tier."
+ },
+ {
+ "question": "Can I self host Supabase for free?",
+ "answer": "Yes, our Docker setup can be found [here](https://github.com/supabase/supabase), or in our [CLI](https://github.com/supabase/cli). Supabase Studio is available in the docker setup, read more about it [here](https://supabase.com/blog/2021/11/30/supabase-studio)."
+ }
+]
diff --git a/www/data/ProjectExamples.json b/www/data/ProjectExamples.json
new file mode 100644
index 00000000000..fdf557007dd
--- /dev/null
+++ b/www/data/ProjectExamples.json
@@ -0,0 +1,57 @@
+[
+ {
+ "imgUrl": "images/stripe.jpg",
+ "title": "Stripe SaaS starter",
+ "url": "https://github.com/thorwebdev/nextjs-saas-starter",
+ "description": "Build a SaaS business with Stripe subscriptions and Supabase.",
+ "icons": [
+ {
+ "imgUrl": "https://avatars3.githubusercontent.com/u/54469796?s=480&v=4",
+ "imgAlt": "supabase icon"
+ },
+ {
+ "imgUrl": "https://avatars1.githubusercontent.com/u/14985020?s=480&v=4",
+ "imgAlt": "vercel icon"
+ },
+ {
+ "imgUrl": "https://avatars3.githubusercontent.com/u/856813?s=480&v=6",
+ "imgAlt": "stripe icon"
+ }
+ ],
+ "ctaText": "View project"
+ },
+ {
+ "imgUrl": "images/slack-clone.jpg",
+ "title": "Chat app with Next.js",
+ "url": "https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone",
+ "description": "Build a full-stack Slack clone using Next.js and Supabase.",
+ "icons": [
+ {
+ "imgUrl": "https://avatars3.githubusercontent.com/u/54469796?s=480&v=4",
+ "imgAlt": "supabase icon"
+ },
+ {
+ "imgUrl": "https://avatars1.githubusercontent.com/u/14985020?s=480&v=4",
+ "imgAlt": "vercel icon"
+ }
+ ],
+ "ctaText": "View project"
+ },
+ {
+ "imgUrl": "images/to-do-app.jpg",
+ "title": "Todo list with Vue.js",
+ "url": "https://github.com/supabase/supabase/tree/master/examples/vue3-ts-todo-list",
+ "description": "Build a simple todo list with Vue and Supabase.",
+ "icons": [
+ {
+ "imgUrl": "https://avatars3.githubusercontent.com/u/54469796?s=480&v=4",
+ "imgAlt": "supabase icon"
+ },
+ {
+ "imgUrl": "https://avatars1.githubusercontent.com/u/14985020?s=480&v=4",
+ "imgAlt": "vercel icon"
+ }
+ ],
+ "ctaText": "View project"
+ }
+]
diff --git a/www/data/Solutions.json b/www/data/Solutions.json
new file mode 100644
index 00000000000..7e9131da046
--- /dev/null
+++ b/www/data/Solutions.json
@@ -0,0 +1,34 @@
+{
+ "database": {
+ "name": "Database",
+ "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4",
+ "description": "Every project is a full Postgres database, the world's most trusted relational database.",
+ "description_short": "",
+ "label": "",
+ "url": "/database"
+ },
+ "authentication": {
+ "name": "Authentication",
+ "icon": "M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z",
+ "description": "Add user sign ups and logins, securing your data with Row Level Security.",
+ "description_short": "",
+ "label": "",
+ "url": "/auth"
+ },
+ "storage": {
+ "name": "Storage",
+ "icon": "M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4",
+ "description": "Store, organize, and serve large files. Any media, including videos and images.",
+ "description_short": "",
+ "label": "",
+ "url": "/storage"
+ },
+ "edge-functions": {
+ "name": "Edge Functions",
+ "icon": "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4",
+ "description": "Write custom code without deploying or scaling servers.",
+ "description_short": "",
+ "label": "",
+ "url": "/edge-functions"
+ }
+}
diff --git a/www/data/Team.tsx b/www/data/Team.tsx
new file mode 100644
index 00000000000..cfcc53a998e
--- /dev/null
+++ b/www/data/Team.tsx
@@ -0,0 +1,204 @@
+type TeamMember = {
+ name: string
+ img: string
+ department: string
+ active: boolean
+
+ github?: string
+ twitter?: string
+ linkedin?: string
+}
+
+const data: TeamMember[] = [
+ {
+ name: 'Caryn Marooney',
+ img: 'https://res.cloudinary.com/crunchbase-production/image/upload/c_thumb,h_256,w_256,f_auto,g_faces,z_0.7,q_auto:eco,dpr_1/iqltjymln82pxxcwr6kq.png',
+ department: 'Board member',
+ twitter: 'https://twitter.com/carynm650',
+ active: true,
+ },
+ {
+ name: 'Paul Copplestone',
+ github: 'https://github.com/kiwicopple',
+ img: 'https://github.com/kiwicopple.png',
+ department: 'Cofounder',
+ twitter: 'https://twitter.com/kiwicopple',
+ active: true,
+ },
+ {
+ name: 'Ant Wilson',
+ github: 'https://github.com/awalias',
+ img: 'https://github.com/awalias.png',
+ department: 'Cofounder',
+ twitter: 'https://twitter.com/antwilson',
+ active: true,
+ },
+ {
+ name: 'Angelico de los Reyes',
+ github: 'https://github.com/dragarcia',
+ img: 'https://github.com/dragarcia.png',
+ department: 'Engineering',
+ active: true,
+ },
+ {
+ name: 'Hieu Pham',
+ github: 'https://github.com/phamhieu',
+ department: 'Engineering',
+ img: 'https://github.com/phamhieu.png',
+ twitter: 'https://twitter.com/phamhieu_',
+ active: true,
+ },
+ {
+ name: 'Joshen Lim',
+ github: 'https://github.com/joshenlim',
+ department: 'Engineering, Design',
+ img: 'https://github.com/joshenlim.png',
+ twitter: 'https://twitter.com/joshenlimek',
+ active: true,
+ },
+ {
+ name: 'Steve Chavez',
+ github: 'https://github.com/steve-chavez',
+ department: 'Engineering & PostgREST maintainer',
+ img: 'https://github.com/steve-chavez.png',
+ twitter: 'https://twitter.com/_steve_chavez',
+ active: true,
+ },
+ {
+ name: 'Chris Copplestone',
+ github: '',
+ department: 'Corp',
+ img: 'https://ca.slack-edge.com/TS93YE5NV-U0131589GCX-8ceb0013e47a-512',
+ active: true,
+ },
+ {
+ name: 'Rory Wilding',
+ github: 'https://github.com/roryw10',
+ img: 'https://github.com/roryw10.png',
+ department: 'Growth',
+ twitter: 'https://twitter.com/Rorstro',
+ active: true,
+ },
+ {
+ name: 'Inian Parameshwaran',
+ github: 'https://github.com/inian',
+ img: 'https://github.com/inian.png',
+ department: 'Engineering',
+ twitter: 'https://twitter.com/everConfusedGuy',
+ active: true,
+ },
+ {
+ name: 'Bobbie Soedirgo',
+ github: 'https://github.com/soedirgo',
+ department: 'Engineering',
+ img: 'https://github.com/soedirgo.png',
+ active: true,
+ },
+ {
+ name: 'Jonathan Summers-Muir',
+ github: 'https://github.com/mildtomato',
+ department: 'Design, Engineering',
+ img: 'https://github.com/mildtomato.png',
+ twitter: 'https://twitter.com/JSummersMuir',
+ active: true,
+ },
+ {
+ name: 'Wen Bo Xi',
+ github: 'https://github.com/w3b6x9',
+ department: 'Engineering',
+ img: 'https://github.com/w3b6x9.png',
+ active: true,
+ },
+ {
+ name: 'Div Arora',
+ github: 'https://github.com/darora',
+ department: 'Engineering',
+ img: 'https://github.com/darora.png',
+ active: true,
+ },
+ {
+ name: 'Thor Schaeff',
+ github: 'https://github.com/thorwebdev',
+ img: 'https://github.com/thorwebdev.png',
+ department: 'DevRel',
+ twitter: 'https://twitter.com/thorwebdev',
+ active: true,
+ },
+ {
+ name: 'Mark Burggraf',
+ github: 'https://github.com/burggraf',
+ department: 'Engineering',
+ img: 'https://github.com/burggraf.png',
+ active: true,
+ },
+ {
+ name: 'Kang Ming Tay',
+ github: 'https://github.com/kangmingtay',
+ department: 'Engineering',
+ img: 'https://github.com/kangmingtay.png',
+ twitter: 'https://twitter.com/kangmingtay',
+ active: true,
+ },
+ {
+ name: 'Amy Quek',
+ github: '',
+ department: 'Marketing',
+ img: 'https://ca.slack-edge.com/TS93YE5NV-U023L5A1ER0-613a55cd13b7-512',
+ twitter: 'https://twitter.com/QuekAmy',
+ active: true,
+ },
+ {
+ name: 'Stanislav Muzhy',
+ github: 'https://github.com/abc3',
+ department: 'Engineering',
+ img: 'https://github.com/abc3.png',
+ twitter: 'https://twitter.com/abc3erl',
+ active: true,
+ },
+ {
+ name: 'Leo Tanad',
+ github: 'https://github.com/ltanady',
+ department: 'Engineering',
+ img: 'https://github.com/ltanady.png',
+ active: true,
+ },
+ {
+ name: 'Oliver Ric',
+ github: 'https://github.com/olirice',
+ department: 'Engineering',
+ img: 'https://github.com/olirice.png',
+ active: true,
+ },
+ {
+ name: 'Beng Eu',
+ github: 'https://github.com/thebengeu',
+ department: 'Engineering',
+ img: 'https://github.com/thebengeu.png',
+ twitter: 'https://twitter.com/thebengeu',
+ active: true,
+ },
+ {
+ name: 'Gurjeet Sing',
+ github: 'https://github.com/gurjeet',
+ department: 'Engineering',
+ img: 'https://github.com/gurjeet.png',
+ active: true,
+ },
+ {
+ name: 'Laura Copplestone',
+ github: 'https://github.com/??',
+ department: 'Corp',
+ img: 'https://ca.slack-edge.com/TS93YE5NV-U0267HUR09J-35f4554b6def-512',
+ active: true,
+ },
+ {
+ name: 'Jon Meyer',
+ github: 'https://github.com/dijonmusters',
+ department: 'DevRel',
+ img: 'https://github.com/dijonmusters.png',
+ twitter: 'https://twitter.com/_dijonmusters',
+ active: true,
+ },
+]
+
+export default data
diff --git a/www/data/auth.json b/www/data/auth.json
new file mode 100644
index 00000000000..79a70b1869c
--- /dev/null
+++ b/www/data/auth.json
@@ -0,0 +1,41 @@
+[
+ {
+ "name": "apple"
+ },
+ {
+ "name": "bitbucket"
+ },
+ {
+ "name": "discord"
+ },
+ {
+ "name": "facebook"
+ },
+ {
+ "name": "gitlab"
+ },
+ {
+ "name": "google"
+ },
+ {
+ "name": "messagebird"
+ },
+ {
+ "name": "microsoft"
+ },
+ {
+ "name": "slack"
+ },
+ {
+ "name": "spotify"
+ },
+ {
+ "name": "twitch"
+ },
+ {
+ "name": "twitter"
+ },
+ {
+ "name": "twilio"
+ }
+]
diff --git a/www/data/home/admin-access.json b/www/data/home/admin-access.json
new file mode 100644
index 00000000000..69f94df41b0
--- /dev/null
+++ b/www/data/home/admin-access.json
@@ -0,0 +1,26 @@
+[
+ {
+ "label": "Table editor",
+ "title": "Manage your data with the familiarity of a spreadsheet",
+ "text": "You don’t have to be a database expert to use Supabase. Our table editor makes Postgres easy to use, even for non-techies. You can do everything right in our dashboard.",
+ "video_url": "videos/tabTableEditor.mp4",
+ "cta": "Explore Table View",
+ "url": "/database"
+ },
+ {
+ "label": "SQL Editor",
+ "title": "In-built SQL editor for when you need greater control",
+ "text": "Write, save, and execute SQL queries directly on our dashboard, with templates to save you time. Run common queries and even build applications using our growing list of templates.",
+ "video_url": "videos/tabSqlEditor.mp4",
+ "cta": "Explore SQL Editor",
+ "url": "/database"
+ },
+ {
+ "label": "Auth rules",
+ "title": "User management as straight-forward as it can be",
+ "text": "Easily manage your users with Supabase Auth, with email logins, magic links, and third-party logins. Create complex access policies with SQL rules to fit your unique business needs.",
+ "video_url": "videos/tabAuthRules.mp4",
+ "cta": "Explore Auth",
+ "url": "/auth"
+ }
+]
diff --git a/www/data/home/api-examples.js b/www/data/home/api-examples.js
new file mode 100644
index 00000000000..2785259c96a
--- /dev/null
+++ b/www/data/home/api-examples.js
@@ -0,0 +1,96 @@
+export default [
+ {
+ lang: 'js',
+ title: 'Create user',
+ description: 'Sign up a new user in an example chat room',
+ code: `import { createClient } from '@supabase/supabase-js'
+
+// Initialize
+const supabaseUrl = 'https://chat-room.supabase.co'
+const supabaseKey = 'public-anon-key'
+const supabase = createClient(supabaseUrl, supabaseKey)
+
+// Create a new user
+const { user, error } = await supabase.auth.signUp({
+ email: 'example@email.com',
+ password: 'example-password',
+})
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Realtime subscriptions',
+ description: 'Receive realtime messages in an example chat room',
+ code: `import { createClient } from '@supabase/supabase-js'
+
+// Initialize
+const supabaseUrl = 'https://chat-room.supabase.co'
+const supabaseKey = 'public-anon-key'
+const supabase = createClient(supabaseUrl, supabaseKey)
+
+// Get notified of all new chat messages
+const realtime = supabase
+ .from('messages')
+ .on('INSERT', message => {
+ console.log('New message!', message)
+ })
+ .subscribe()
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Read a record',
+ description: 'Get all public rooms and their messages',
+ code: `import '@supabase/supabase-js'
+
+// Initialize
+const supabaseUrl = 'https://chat-room.supabase.co'
+const supabaseKey = 'public-anon-key'
+const supabase = createClient(supabaseUrl, supabaseKey)
+
+// Get public rooms and their messages
+const publicRooms = await supabase
+ .from('rooms')
+ .select(\`
+ name,
+ messages ( text )
+ \`)
+ .eq('public', true)
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Create a record',
+ description: 'Create a new chat room',
+ code: `import { createClient } from '@supabase/supabase-js'
+
+// Initialize
+const supabaseUrl = 'https://chat-room.supabase.co'
+const supabaseKey = 'public-anon-key'
+const supabase = createClient(supabaseUrl, supabaseKey)
+
+// Create a new chat room
+const newRoom = await supabase
+ .from('rooms')
+ .insert({ name: 'Supabase Fan Club', public: true })
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Update a record',
+ description: 'Update a user',
+ code: `import { createClient } from '@supabase/supabase-js'
+
+// Initialize
+const supabaseUrl = 'https://chat-room.supabase.co'
+const supabaseKey = 'public-anon-key'
+const supabase = createClient(supabaseUrl, supabaseKey)
+
+// Update multiple users
+const updatedUsers = await supabase
+ .from('users')
+ .eq('account_type', 'paid')
+ .update({ highlight_color: 'gold' })
+`,
+ },
+]
diff --git a/www/data/products/auth/auth-api-examples.js b/www/data/products/auth/auth-api-examples.js
new file mode 100644
index 00000000000..fa745dd414f
--- /dev/null
+++ b/www/data/products/auth/auth-api-examples.js
@@ -0,0 +1,102 @@
+export default [
+ {
+ lang: 'js',
+ title: 'Sign up',
+ description: '',
+ code: `
+ // Sign up with email
+ const { user, error } = await supabase.auth.signUp({
+ email: 'example@email.com',
+ password: 'example-password',
+ })
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Sign in',
+ description: '',
+ code: `
+ // Sign in with email
+ const { user, error } = await supabase.auth.signIn({
+ email: 'example@email.com',
+ password: 'example-password',
+ })
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Magic Links',
+ description: '',
+ code: `
+ // Sign in with magic links
+ const { user, error } = await supabase.auth.signIn({
+ email: 'example@email.com'
+ })
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'OAuth logins',
+ description: '',
+ code: `
+ // Sign in with GitHub
+ // And request extra permissions!
+ const { user, error } = await supabase.auth.signIn({
+ provider: 'github',
+ }, {
+ scopes: 'repo gist notifications'
+ })
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ },
+]
diff --git a/www/data/products/auth/auth-sql-rules-examples.js b/www/data/products/auth/auth-sql-rules-examples.js
new file mode 100644
index 00000000000..e3d1ba4bf2e
--- /dev/null
+++ b/www/data/products/auth/auth-sql-rules-examples.js
@@ -0,0 +1,84 @@
+export default [
+ {
+ lang: 'sql',
+ title: 'Allow read access',
+ detail_title: 'Public profiles are viewable by everyone',
+ detail_text: 'Create a policy that allows public access to a table',
+ badges_label: '',
+ badges: [],
+ url: '/docs/guides/auth#allow-read-access',
+ code: `
+-- 1. Create table
+create table profiles (
+ id serial primary key,
+ name text
+);
+
+-- 2. Enable RLS
+alter table profiles enable row level security;
+
+-- 3. Create Policy
+create policy "Public profiles are viewable by everyone."
+on profiles for select
+using ( true );
+`.trim(),
+ },
+ {
+ lang: 'sql',
+ title: 'Restrict updates',
+ detail_title: 'Users can update their own profiles',
+ detail_text:
+ 'Create a policy that only allows a user to update rows that match their unique ID',
+ badges_label: '',
+ badges: [],
+ url: '/docs/guides/auth#restrict-updates',
+ code: `
+-- 1. Create table
+create table profiles (
+ id serial primary key,
+ name text
+);
+
+-- 2. Enable RLS
+alter table profiles enable row level security;
+
+-- 3. Create Policy
+create policy "Users can update their own profiles."
+on profiles for update
+using ( auth.uid() = id );
+`.trim(),
+ },
+ {
+ lang: 'sql',
+ title: 'Advanced rules',
+ detail_title: 'Team members can update team details',
+ detail_text:
+ 'Create a policy that allows for team members to update only rows which match their team ID.',
+ badges_label: '',
+ badges: [],
+ url: '/docs/guides/auth#policies-with-joins',
+ code: `
+create table teams (
+ id serial primary key,
+ name text
+);
+
+create table members (
+ team_id references team.id,
+ user_id referenced auth.users.id
+);
+
+alter table teams enable row level security;
+
+-- Create Advanced Policies
+create policy "Team members can update team details"
+on teams
+for update using (
+ auth.uid() in (
+ select user_id from members
+ where team_id = id
+ )
+);
+`.trim(),
+ },
+]
diff --git a/www/data/products/database/api-examples.js b/www/data/products/database/api-examples.js
new file mode 100644
index 00000000000..b2e20f7d889
--- /dev/null
+++ b/www/data/products/database/api-examples.js
@@ -0,0 +1,57 @@
+/*
+ * description
+ */
+export default [
+ {
+ lang: 'js',
+ title: 'Create a record',
+ size: 'large',
+ code: `// Create a record
+
+// Insert new record into a table called \`rooms\`
+const { data, error } = await supabase
+ .from('rooms')
+ .insert({
+ name: 'Supabase Fan Club',
+ public: true
+ })
+
+
+
+
+
+
+
+
+
+
+
+`,
+ },
+ {
+ lang: 'js',
+ title: 'Read a record',
+ size: 'large',
+ code: `// Read a record
+
+// Retrieve all of the \`rooms\`,
+// and get all the messages for each room.
+const { data, error } = await supabase
+ .from('rooms').select(\`
+ name,
+ messages ( text )
+ \`)
+ .eq('public', true)
+
+
+
+
+
+
+
+
+
+
+`,
+ },
+]
diff --git a/www/data/products/database/extensions-examples.js b/www/data/products/database/extensions-examples.js
new file mode 100644
index 00000000000..b974eeb111f
--- /dev/null
+++ b/www/data/products/database/extensions-examples.js
@@ -0,0 +1,76 @@
+export default [
+ {
+ lang: 'sql',
+ title: 'Geographical',
+ code: `SELECT superhero.name
+FROM city, superhero
+WHERE ST_Contains(city.geom, superhero.geom)
+AND city.name = 'Gotham';
+ `,
+ detail_title: 'Spatial and Geographic objects for PostgreSQL',
+ detail_text:
+ 'PostGIS is a spatial database extender for PostgreSQL object-relational database. It adds support for geographic objects allowing location queries to be run in SQL.',
+ badges_label: 'Extensions used:',
+ badges: ['PostGIS'],
+ url: '',
+ },
+ {
+ lang: 'sql',
+ title: 'Crypto',
+ code: `-- This can be run in the SQL editor
+psql
+CREATE EXTENSION pgcrypto;
+SELECT crypt('mypass', gen_salt('bf', 4));
+crypt
+--------------------------------------------------------------
+$2a$04$1bfMQDOR6aLyD4q3KVb8/ujG7ZAkyie4d/s3ABwuZNbzkFFgXtC76
+
+-- We can now execute the statement below to store the string safely in the database:
+INSERT INTO users (user_id,enc_pass) VALUES (1,'$2a$04$1bfMQDOR6aLyD4q3KVb8/ujG7ZAkyie4d/s3ABwuZNbzkFFgXtC76');`,
+ detail_title: 'Cryptographic functions for PostgreSQL.',
+ detail_text:
+ 'The pgcrypto module is a cryptographic extension that provides a number of hashing and cryptographic functions.',
+ badges_label: 'Extensions used:',
+ badges: ['pgcrypto'],
+ url: '',
+ },
+ {
+ lang: 'sql',
+ title: 'Monitoring',
+ code: `SELECT order_details.qty,
+ order_details.item_id,
+ order_details.item_price
+FROM order_details,
+ customers
+WHERE customers.id = order_details.customer_id
+AND customers.email = 'john@supabase.io'
+
+-- You can now view pg_stat_statements
+
+SELECT *
+FROM pg_stat_statements;
+
+userid | 16384
+dbid | 16388
+query | select * from users where email = ?;
+calls | 2
+total_time | 0.000268
+rows | 2
+shared_blks_hit | 16
+shared_blks_read | 0
+shared_blks_dirtied | 0
+shared_blks_written | 0
+local_blks_hit | 0
+local_blks_read | 0
+local_blks_dirtied | 0
+local_blks_written | 0
+...
+`,
+ detail_title: 'Tracking execution statistics of all SQL statements',
+ detail_text:
+ 'The pg_stat_statements module provides a means for tracking execution statistics of all SQL statements executed by a server.',
+ badges_label: 'Extensions used:',
+ badges: ['pg_stat_statements'],
+ url: '',
+ },
+]
diff --git a/www/data/products/database/sql-view-carousel.json b/www/data/products/database/sql-view-carousel.json
new file mode 100644
index 00000000000..37159b82357
--- /dev/null
+++ b/www/data/products/database/sql-view-carousel.json
@@ -0,0 +1,30 @@
+[
+ {
+ "title": "Full SQL",
+ "label": "SQL Editor built in",
+ "img_url": "/images/product/database/sql-view/sql-editor.png",
+ "text": "Create tables, functions, join tables - A full SQL editor built into the dashboard",
+ "url": ""
+ },
+ {
+ "title": "Monaco editor",
+ "label": "Monaco editor",
+ "img_url": "/images/product/database/sql-view/manaco-editor.png",
+ "text": "Built in Monaco editor, with rich validation and autocomplete.",
+ "url": ""
+ },
+ {
+ "title": "Favorite queries",
+ "label": "Favorite queries",
+ "img_url": "/images/product/database/sql-view/favorites.png",
+ "text": "Save your favorite queries to use again and again.",
+ "url": ""
+ },
+ {
+ "title": "Export to CSV",
+ "label": "Select and Export",
+ "img_url": "/images/product/database/sql-view/export.png",
+ "text": "Any output can be exported into a CSV",
+ "url": ""
+ }
+]
diff --git a/www/data/products/database/table-view-carousel.json b/www/data/products/database/table-view-carousel.json
new file mode 100644
index 00000000000..ab6ab6072c1
--- /dev/null
+++ b/www/data/products/database/table-view-carousel.json
@@ -0,0 +1,30 @@
+[
+ {
+ "title": "The simplicity of a spreadsheet",
+ "label": "Spreadsheet like editing",
+ "img_url": "/images/product/database/table-view/spreadsheet-interface.png",
+ "text": "Add, edit, and update your data with the simplicity of a no-code tool.",
+ "url": ""
+ },
+ {
+ "title": "Create tables",
+ "label": "Create tables",
+ "img_url": "/images/product/database/table-view/create-table.png",
+ "text": "Add tables, columns and rows right in the dashboard. Without a single line SQL.",
+ "url": ""
+ },
+ {
+ "title": "Set up foreign keys",
+ "label": "Set up foreign keys",
+ "img_url": "/images/product/database/table-view/foreign-keys.png",
+ "text": "Build connections throughout your data with the full power of a Relational Database.",
+ "url": ""
+ },
+ {
+ "title": "Select and Export",
+ "label": "Select and Export",
+ "img_url": "/images/product/database/table-view/export.png",
+ "text": "Pick the rows you want and export them into a CSV. ",
+ "url": ""
+ }
+]
diff --git a/www/data/products/functions/usecase-examples.js b/www/data/products/functions/usecase-examples.js
new file mode 100644
index 00000000000..93a49b1b783
--- /dev/null
+++ b/www/data/products/functions/usecase-examples.js
@@ -0,0 +1,96 @@
+/*
+ * description
+ */
+export default [
+ {
+ lang: 'js',
+ title: 'Sending an email',
+ description: 'Send an email via SMTP directly in the function',
+ size: 'large',
+ code: `import { serve } from "https://deno.land/std@0.114.0/http/server.ts";
+import { SmtpClient } from "https://deno.land/x/smtp@v0.7.0/mod.ts";
+const client = new SmtpClient();
+const { hostname, port, username, password } = Deno.env.toObject();
+
+await client.connect({
+ hostname,
+ port: Number(port),
+ username,
+ password,
+});
+
+serve(async (_req) => {
+ await client.send({
+ from: "jonny@supabase.io",
+ to: "div@supabase.io",
+ subject: "Notifications Ui has launched",
+ content: "And this is a notification about that",
+ });
+
+ return new Response("Email sent", { status: 200 });
+});`,
+ },
+ {
+ lang: 'js',
+ title: 'Connect to database directly',
+ description: `Connect to your database via pg_bouncer`,
+ size: 'large',
+ code: `import { serve } from "https://deno.land/std@0.114.0/http/server.ts";
+import * as postgres from "https://deno.land/x/postgres@v0.14.2/mod.ts";
+
+const databaseUrl = Deno.env.get("DATABASE_URL") ?? "";
+const pool = new postgres.Pool(databaseUrl, 3, true);
+const connection = await pool.connect();
+
+serve(async (req: Request) => {
+ // sql inject your database
+ const { query } = await req.json();
+ const response = await connection.queryObject(query);
+ console.log(response);
+ return new Response("Query executed", { status: 200 });
+});`,
+ },
+ {
+ lang: 'js',
+ title: 'Read from storage',
+ description: `Read and write to any of your buckets, while also respecting storage auth policies.`,
+ size: 'large',
+ code: `import { serve } from "https://deno.land/std@0.114.0/http/server.ts";
+import { createClient } from "https://esm.sh/@supabase/supabase-js@1.33.1";
+
+serve(async (req) => {
+ const SUPABASE_URL = Deno.env.get("SUPABASE_URL") ?? "";
+ const SERVICE_KEY = Deno.env.get("SERVICE_KEY") ?? "";
+ const supabase = createClient(SUPABASE_URL, SERVICE_KEY);
+ if (req.headers.get("Authorization") === "super-secret-key") {
+ const { data } = await supabase.storage
+ .from("newbucket")
+ .download("supameme.png");
+ return new Response(data, { headers: { "content-type": "image/png" } });
+ } else {
+ return new Response("Forbidden", { status: 403 });
+ }
+});`,
+ },
+ {
+ lang: 'js',
+ title: 'Read from database',
+ description: `Read, Write, Update, Insert anything on the database`,
+ size: 'large',
+ code: `import { serve } from "https://deno.land/std@0.114.0/http/server.ts";
+import { createClient } from "https://esm.sh/@supabase/supabase-js@1.33.1";
+
+serve(async () => {
+ const SUPABASE_URL = Deno.env.get("SUPABASE_URL") ?? "";
+ const SERVICE_KEY = Deno.env.get("SERVICE_KEY") ?? "";
+ const supabase = createClient(SUPABASE_URL, SERVICE_KEY);
+ const { data } = await supabase.from("todos").select();
+ return new Response(JSON.stringify(data), {
+ status: 200,
+ headers: {
+ "Content-Type": "application/json",
+ },
+ });
+});`,
+ },
+]
diff --git a/www/data/products/storage/api-examples.js b/www/data/products/storage/api-examples.js
new file mode 100644
index 00000000000..de1a07ecde0
--- /dev/null
+++ b/www/data/products/storage/api-examples.js
@@ -0,0 +1,90 @@
+export default [
+ {
+ lang: 'js',
+ title: 'Upload a file',
+ code: `
+// Upload an image to the "avatars" bucket
+const spaceCat = event.target.files[0]
+const { data, error } = await supabase
+ .storage
+ .from('avatars')
+ .upload('space-cat.png', spaceCat)
+
+
+
+
+
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Download a file',
+ code: `
+// Download the "space-cat.png" image from the "avatars" bucket
+const { data, error } = await supabase
+ .storage
+ .from('avatars')
+ .download('space-cat.png')
+
+
+
+
+
+
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'List files',
+ code: `
+// List all the files in the "avatars" bucket
+const { data, error } = await supabase
+ .storage
+ .from('avatars')
+ .list()
+
+
+
+
+
+
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Move and rename files',
+ code: `
+// Move and rename files
+const { data, error } = await supabase
+ .storage
+ .from('avatars')
+ .move('public/space-cat.png', 'private/space-cat.png')
+
+
+
+
+
+
+
+ `,
+ },
+ {
+ lang: 'js',
+ title: 'Delete files',
+ code: `
+// Delete a list of files
+const { data, error } = await supabase
+ .storage
+ .from('avatars')
+ .remove([ 'avatar1.png', 'avatar2.png' ])
+
+
+
+
+
+
+
+
+ `,
+ },
+]
diff --git a/www/data/products/storage/dashboard-carousel.json b/www/data/products/storage/dashboard-carousel.json
new file mode 100644
index 00000000000..ffcf239f04b
--- /dev/null
+++ b/www/data/products/storage/dashboard-carousel.json
@@ -0,0 +1,32 @@
+[
+ {
+ "title": "File previews",
+ "label": "File previews",
+ "img_url": "/images/product/storage/dashboard-view/file-previews.png",
+ "text": "Preview any media type, including video and audio."
+ },
+ {
+ "title": "Column view",
+ "label": "Column view",
+ "img_url": "/images/product/storage/dashboard-view/column-view.png",
+ "text": "Slick Miller-column navigation for rapid folder exploration."
+ },
+ {
+ "title": "List view",
+ "label": "List view",
+ "img_url": "/images/product/storage/dashboard-view/list-view.png",
+ "text": "List View to find detailed File metadata at a glance."
+ },
+ {
+ "title": "Multi select actions",
+ "label": "Multi select actions",
+ "img_url": "/images/product/storage/dashboard-view/multi-column-selection.png",
+ "text": "Multi-import and multi-export. Select multiple files from multiple folders."
+ },
+ {
+ "title": "Path navigator",
+ "label": "Path navigator",
+ "img_url": "/images/product/storage/dashboard-view/path-setting.png",
+ "text": "If you know the exact path of your file, type it in and navigate directly."
+ }
+]
diff --git a/www/data/products/storage/permissions-examples.js b/www/data/products/storage/permissions-examples.js
new file mode 100644
index 00000000000..96a42444d86
--- /dev/null
+++ b/www/data/products/storage/permissions-examples.js
@@ -0,0 +1,65 @@
+export default [
+ {
+ lang: 'sql',
+ title: 'Public access to a bucket',
+ code: `create policy "Public Access"
+on storage.objects for all
+using ( bucket_id = 'avatars' );
+ `,
+ detail_title: 'Allow public CRUD access to a bucket',
+ detail_text: "This will allow any user access to the bucket named 'avatars'",
+ badges_label: '',
+ badges: [],
+ url: '',
+ },
+ {
+ lang: 'sql',
+ title: 'Public access to a folder',
+ code: `create policy "Public access to a folder"
+on storage.objects for all
+using (
+ bucket_id = 'avatars'
+ and (storage.foldername(name))[1] = 'public'
+);
+ `,
+ detail_title: 'Allow public CRUD access to a folder in a bucket',
+ detail_text:
+ "This will allow any user access to the folder named 'public' in the bucket 'avatars'",
+ badges_label: '',
+ badges: [],
+ url: '',
+ },
+ {
+ lang: 'sql',
+ title: 'Authenticated access to a bucket',
+ code: `create policy "Logged in access"
+on storage.objects
+for all using (
+ bucket_id = 'avatars'
+ and auth.role() = 'authenticated'
+);`,
+ detail_title: 'Allow any authenticated user access to a folder',
+ detail_text:
+ "This will allow any authenticated user access to the folder named 'authenticated' in the bucket 'avatars'",
+ badges_label: '',
+ badges: [],
+ url: '',
+ },
+ {
+ lang: 'sql',
+ title: 'Individual access to a file',
+ code: `create policy "Individual access"
+on storage.objects for all
+using (
+ bucket_id = 'avatars'
+ and name = 'folder/only_uid.jpg'
+ and auth.uid() = 'd8c7bce9-cfeb-497b-bd61-e66ce2cbdaa2'
+);`,
+ detail_title: 'Allow a specific user access to a file',
+ detail_text:
+ "This will allow a specific user based on the user's UID access to a file named 'only_uid.jpg'",
+ badges_label: '',
+ badges: [],
+ url: '',
+ },
+]
diff --git a/www/data/tweets/Tweets.json b/www/data/tweets/Tweets.json
new file mode 100644
index 00000000000..a0da5737f65
--- /dev/null
+++ b/www/data/tweets/Tweets.json
@@ -0,0 +1,260 @@
+[
+ {
+ "text": "DB/Backend: @supabase_io Reason: Takes care of Auth, DB hosting, API. Open source, easy to eject into something else. I love SQL. Cloud IDE is incredible for productivity.",
+ "url": "https://twitter.com/JessetheSibley/status/1369678185508593673",
+ "handle": "JessetheSibley",
+ "img_url": "/images/twitter-profiles/aNx9O0lH_400x400.jpg"
+ },
+ {
+ "text": "Been trying out this new stack. Loving it so far. Next.js (Frontend) + Stitches.js (Styling) + Radix (Primitives & Icons) + Supabase (Backend) + Vercel (Deployment) 😍 Thank you @vercel @Modulz @supabase_io for this amazing DX.",
+ "url": "https://twitter.com/VaibhavAcharya_/status/1369499616794660864",
+ "handle": "VaibhavAcharya_",
+ "img_url": "/images/twitter-profiles/mZAIoZM1_400x400.jpg"
+ },
+ {
+ "text": "OKAY OKAY FINE I'LL LOOK AT SUPABASE PROPERLY",
+ "url": "https://twitter.com/benbarbersmith/status/1369758528764776453",
+ "handle": "benbarbersmith",
+ "img_url": "/images/twitter-profiles/Jqle_tE6_400x400.jpg"
+ },
+ {
+ "text": "@supabase_io is amazing, super easy to get up and running quickly + they have multiple examples with various frameworks (chat app, auth, etc)",
+ "url": "https://twitter.com/ssw1ss/status/1366515168260337671",
+ "handle": "ssw1ss",
+ "img_url": "/images/twitter-profiles/4mD0C5Wk_400x400.jpg"
+ },
+ {
+ "text": "Been playing with @supabase_io and so far I'm liking it. I ❤️ you get full access to the database. It's very quick to get up and running, seems a nice fit for prototypes or smaller apps",
+ "url": "https://twitter.com/mattegreer/status/1341765395133415425",
+ "handle": "mattegreer",
+ "img_url": "/images/twitter-profiles/IgXniSVk_400x400.jpg"
+ },
+ {
+ "text": "Using @supabase_io with SWR by @vercel is something else 🔥",
+ "url": "https://twitter.com/eunjae_lee/status/1369788285317419009",
+ "handle": "eunjae_lee",
+ "img_url": "/images/twitter-profiles/eGjSYbQd_400x400.jpg"
+ },
+ {
+ "text": "big props to the @supabase_io team - open source is a two way street and they’re super responsive & community oriented",
+ "url": "https://twitter.com/_mateomorris/status/1369661833557196800",
+ "handle": "_mateomorris",
+ "img_url": "/images/twitter-profiles/1FyEWRE8_400x400.jpg"
+ },
+ {
+ "text": "Enjoying building on @supabase_io for a project with @lasnindrek - allows incredible development speed when bashing together an MVP",
+ "url": "https://twitter.com/geordidearns/status/1344433863804788737",
+ "handle": "geordidearns",
+ "img_url": "/images/twitter-profiles/vppimY3M_400x400.jpg"
+ },
+ {
+ "text": "Been actively working on Quill. It's been rapid, thanks to @supabase_io and @tailwindui",
+ "url": "https://twitter.com/quill_web/status/1369061125157961734",
+ "handle": "quill_web",
+ "img_url": "/images/twitter-profiles/F_8WdZbZ_400x400.jpg"
+ },
+ {
+ "text": "@supabase_io not only is it Firebase alternative, but it has SQL and it uses #elixirlang for handling realtime 😍😍😍 @josevalim did you know that? That's power of your creation 😎",
+ "url": "https://twitter.com/MartinOrszulik/status/1369252918570983424",
+ "handle": "MartinOrszulik",
+ "img_url": "/images/twitter-profiles/ext7ggBo_400x400.jpg"
+ },
+ {
+ "text": "Another month, another impressive @supabase_io release. It’s rare to see a startup ship in public so consistently.",
+ "url": "https://twitter.com/yuris/status/1366770633401491456",
+ "handle": "yuris",
+ "img_url": "/images/twitter-profiles/2ilFPL2Z_400x400.jpg"
+ },
+ {
+ "text": "There are a lot of indie hackers building in public, but it’s rare to see a startup shipping as consistently and transparently as Supabase. Their upcoming March releases look to be 🔥 Def worth a follow! also opened my eyes as to how to value add in open source.",
+ "url": "https://twitter.com/swyx/status/1366685025047994373",
+ "handle": "swyx",
+ "img_url": "/images/twitter-profiles/qhvO9V6x_400x400.jpg"
+ },
+ {
+ "text": "This weekend I made a personal record 🥇 on the less time spent creating an application with social login / permissions, database, cdn, infinite scaling, git push to deploy and for free. Thanks to @supabase_io and @vercel",
+ "url": "https://twitter.com/jperelli/status/1366195769657720834",
+ "handle": "jperelli",
+ "img_url": "/images/twitter-profiles/_ki30kYo_400x400.jpg"
+ },
+ {
+ "text": "I'm excited to know that there's a Firebase alternative OSS project, @supabase_io. It's not a mere copy, you can use Postgre. I like Firebase but always miss the power of SQL.",
+ "url": "https://twitter.com/kouariga/status/1366192045648347138",
+ "handle": "kouariga",
+ "img_url": "/images/twitter-profiles/IhXPN_CQ_400x400.jpg"
+ },
+ {
+ "text": "That’s the best part of @supabase_io! No vendor lock 😎",
+ "url": "https://twitter.com/jim_bisenius/status/1366094388816928770",
+ "handle": "jim_bisenius",
+ "img_url": "/images/twitter-profiles/rLgwUZSB_400x400.jpg"
+ },
+ {
+ "text": "Just span up a @supabase_io app for my new side project. Honestly thinking the tagline \"Firebase Alternative\" should really be \"A Far Superior Firebase Alternative\". Love writing SQL in the cloud! Big love ❤️",
+ "url": "https://twitter.com/JessetheSibley/status/1365634006608457729",
+ "handle": "JessetheSibley",
+ "img_url": "/images/twitter-profiles/aNx9O0lH_400x400.jpg"
+ },
+ {
+ "text": "Lack of count in firebase/firestore is such a nightmare and workaround solutions are crappy. I experienced it while implementing http://HelloEle.com good job Supabase 👍",
+ "url": "https://twitter.com/prakis/status/1365201855849009155",
+ "handle": "prakis",
+ "img_url": "/images/twitter-profiles/eRvqp-t0_400x400.jpg"
+ },
+ {
+ "text": "Looking for a Firebase alternative? Consider using the open-source @supabase_io. It's as simple as Firebase but I found the dashboard UX more intuitive and hey it's OSS! It's in beta so you can use it for free rn.",
+ "url": "https://twitter.com/mneelansh15/status/1368171468153118721",
+ "handle": "mneelansh15",
+ "img_url": "/images/twitter-profiles/6XKH3Rm6_400x400.jpg"
+ },
+ {
+ "text": "Me using @supabase_io for the first time right now 🤯",
+ "url": "https://twitter.com/nasiscoe/status/1365140856035024902",
+ "handle": "nasiscoe",
+ "img_url": "/images/twitter-profiles/nc2Ms5hH_400x400.jpg"
+ },
+ {
+ "text": "I'm trying @supabase_io, Firebase alternative that uses PostgreSQL (and you can use GraphQL too) in the cloud. It's incredible 😍",
+ "url": "https://twitter.com/JP__Gallegos/status/1365699468109242374",
+ "handle": "JP__Gallegos",
+ "img_url": "/images/twitter-profiles/1PH2mt6v_400x400.jpg"
+ },
+ {
+ "text": "Check out this amazing product @supabase_io. A must give try #newidea #opportunity",
+ "url": "https://twitter.com/digitaldaswani/status/1364447219642814464",
+ "handle": "digitaldaswani",
+ "img_url": "/images/twitter-profiles/w8HLdlC7_400x400.jpg"
+ },
+ {
+ "text": "I gave @supabase_io a try this weekend and I was able to create a quick dashboard to visualize the data from the PostgreSQL instance. It's super easy to use Supabase's API or the direct DB connection. Check out the tutorial 📖",
+ "url": "https://twitter.com/razvanilin/status/1363770020581412867",
+ "handle": "razvanilin",
+ "img_url": "/images/twitter-profiles/AiaH9vJ2_400x400.jpg"
+ },
+ {
+ "text": "Tried @supabase_io for the first time yesterday. Amazing tool! I was able to get my Posgres DB up in no time and their documentation on operating on the DB is super easy! 👏 Can't wait for Cloud functions to arrive! It's gonna be a great Firebase alternative!",
+ "url": "https://twitter.com/chinchang457/status/1363347740793524227",
+ "handle": "chinchang457",
+ "img_url": "/images/twitter-profiles/LTw5OCnv_400x400.jpg"
+ },
+ {
+ "text": "10/100 All day i was migrating my project from firebase to @supabase_io Because it is perfect and simple!!! I like design and API for understandable. There are in BETA now. Just try!🧪",
+ "url": "https://twitter.com/roomahhka/status/1363155396391763971",
+ "handle": "roomahhka",
+ "img_url": "/images/twitter-profiles/e_2eQt6C_400x400.jpg"
+ },
+ {
+ "text": "I gave @supabase_io a try today and I was positively impressed! Very quick setup to get a working remote database with API access and documentation generated automatically for you 👌 10/10 will play more",
+ "url": "https://twitter.com/razvanilin/status/1363002398738800640",
+ "handle": "razvanilin",
+ "img_url": "/images/twitter-profiles/AiaH9vJ2_400x400.jpg"
+ },
+ {
+ "text": "Wait. Is it so easy to write queries for @supabase_io ? It's like simple SQL stuff!",
+ "url": "https://twitter.com/T0ny_Boy/status/1362911838908911617",
+ "handle": "T0ny_Boy",
+ "img_url": "/images/twitter-profiles/UCBhUBZl_400x400.jpg"
+ },
+ {
+ "text": "Jeez, and @supabase_io have native support for magic link login?! I was going to use http://magic.link for this But if I can get my whole DB + auth + magic link support in one... Awesome",
+ "url": "https://twitter.com/louisbarclay/status/1362016666868154371",
+ "handle": "louisbarclay",
+ "img_url": "/images/twitter-profiles/6f1O8ZOW_400x400.jpg"
+ },
+ {
+ "text": "@MongoDB or @MySQL?!?! Please, let me introduce you to @supabase_io and the wonderful world of @PostgreSQL before it's too late!!",
+ "url": "https://twitter.com/jim_bisenius/status/1361772978841788416",
+ "handle": "jim_bisenius",
+ "img_url": "/images/twitter-profiles/rLgwUZSB_400x400.jpg"
+ },
+ {
+ "text": "Where has @supabase_io been all my life? 😍",
+ "url": "https://twitter.com/Elsolo244/status/1360257201911320579",
+ "handle": "Elsolo244",
+ "img_url": "/images/twitter-profiles/v6citnk33y2wpeyzrq05_400x400.jpeg"
+ },
+ {
+ "text": "Honestly Supabase is such a killer Firebase alternative.",
+ "url": "https://twitter.com/XPCheese/status/1360229397735895043",
+ "handle": "XPCheese",
+ "img_url": "/images/twitter-profiles/eYP6YXr7_400x400.jpg"
+ },
+ {
+ "text": "I think you'll love @supabase_io :-) Open-source, PostgreSQL-based & zero magic.",
+ "url": "https://twitter.com/zippoxer/status/1360021315852328961",
+ "handle": "zippoxer",
+ "img_url": "/images/twitter-profiles/6rd3xub9_400x400.png"
+ },
+ {
+ "text": "@supabase_io is the answer to all of firebase’s problems imo",
+ "url": "https://twitter.com/jim_bisenius/status/1358590362953142278",
+ "handle": "jim_bisenius",
+ "img_url": "/images/twitter-profiles/rLgwUZSB_400x400.jpg"
+ },
+ {
+ "text": "@supabase_io is insane.",
+ "url": "https://twitter.com/codewithbhargav/status/1357647840911126528",
+ "handle": "codewithbhargav",
+ "img_url": "/images/twitter-profiles/LQYfHXBp_400x400.jpg"
+ },
+ {
+ "text": "It’s fun, feels lightweight, and really quick to spin up user auth and a few tables. Almost too easy! Highly recommend.",
+ "url": "https://twitter.com/nerdburn/status/1356857261495214085",
+ "handle": "nerdburn",
+ "img_url": "/images/twitter-profiles/66VSV9Mm_400x400.png"
+ },
+ {
+ "text": "I’m probably the wrong person to ask because I pick tools based on UX. Supabase was immediately approachable: instant setup, fast web app, auth, and easy APIs. Same reason I liked Firebase when I first discovered.",
+ "url": "https://twitter.com/jasonbarone/status/1357015483619422210",
+ "handle": "jasonbarone",
+ "img_url": "/images/twitter-profiles/6zCnwpvi_400x400.jpg"
+ },
+ {
+ "text": "Now things are starting to get interesting! Firebase has long been the obvious choice for many #flutter devs for the ease of use. But their databases are NoSQL, which has its downsides... Seems like @supabase_io is working on something interesting here!",
+ "url": "https://twitter.com/RobertBrunhage/status/1356973695865085953",
+ "handle": "RobertBrunhage",
+ "img_url": "/images/twitter-profiles/5LMWEACf_400x400.jpg"
+ },
+ {
+ "text": "Honestly, I really love what @supabase_io is doing, you don't need to own a complete backend, just write your logic within your app and you'll get a powerful Postgresql at your disposal.",
+ "url": "https://twitter.com/NavicsteinR/status/1356927229217959941",
+ "handle": "NavicsteinR",
+ "img_url": "/images/twitter-profiles/w_zNZAs7_400x400.jpg"
+ },
+ {
+ "text": "Next.js, @supabase_io, @stripe, and @vercel. Supastack™",
+ "url": "https://twitter.com/jasonbarone/status/1356765411832922115",
+ "handle": "jasonbarone",
+ "img_url": "/images/twitter-profiles/6zCnwpvi_400x400.jpg"
+ },
+ {
+ "text": "I've really enjoyed the DX! Extremely fun to use, which is odd to say about a database at least for me.",
+ "url": "https://twitter.com/Soham_Asmi/status/1373086068132745217",
+ "handle": "Soham_Asmi",
+ "img_url": "/images/twitter-profiles/Os4nhKIr_400x400.jpg"
+ },
+ {
+ "text": "Supabase team is doing some awesome stuff #supabase #facts @supabase_io",
+ "url": "https://twitter.com/_strawbird/status/1372607500499841025",
+ "handle": "_strawbird",
+ "img_url": "/images/twitter-profiles/iMBvvQdn_400x400.jpg"
+ },
+ {
+ "text": "Did a website with @supabase_io last week with no prior experience with it. Up and running in 20 minutes. It's awesome to use. Thumbs up",
+ "url": "https://twitter.com/michael_webdev/status/1352885366928404481?s=20",
+ "handle": "michael_webdev",
+ "img_url": "/images/twitter-profiles/SvAyLaWV_400x400.jpg"
+ },
+ {
+ "text": "Next.js, @supabase_io, @stripe, and @vercel. Supastack™",
+ "url": "https://twitter.com/jasonbarone/status/1356765411832922115?s=20",
+ "handle": "jasonbarone",
+ "img_url": "/images/twitter-profiles/6zCnwpvi_400x400.jpg"
+ },
+ {
+ "text": "I just learned about @supabase_io and im in love 😍 Supabase is an open source Firebase alternative! EarListen (& react) to database changes 💁 Manage users & permissions 🔧 Simple UI for database interaction",
+ "url": "https://twitter.com/0xBanana/status/1373677301905362948",
+ "handle": "0xBanana",
+ "img_url": "/images/twitter-profiles/pgHIGqZ0_400x400.jpg"
+ }
+]
diff --git a/www/default-colors.js b/www/default-colors.js
new file mode 100644
index 00000000000..16352a83344
--- /dev/null
+++ b/www/default-colors.js
@@ -0,0 +1,90 @@
+module.exports = {
+ brand: {
+ brand1: 'hsla(153, 80%, 99%, 1)',
+ brand2: 'hsla(148, 88%, 97%, 1)',
+ brand3: 'hsla(148, 76%, 95%, 1)',
+ brand4: 'hsla(148, 68%, 92%, 1)',
+ brand5: 'hsla(148, 59%, 88%, 1)',
+ brand6: 'hsla(149, 43%, 82%, 1)',
+ brand7: 'hsla(149, 43%, 69%, 1)',
+ brand8: 'hsla(154, 55%, 45%, 1)',
+ brand9: 'hsla(153, 60%, 53%, 1)',
+ brand10: 'hsla(153, 50%, 50%, 1)',
+ brand11: 'hsla(153, 50%, 34%, 1)',
+ brand12: 'hsla(153, 40%, 12%, 1)',
+ },
+ brandDark: {
+ brand1: 'hsla(153, 75%, 6%, 1)',
+ brand2: 'hsla(153, 73%, 7%, 1)',
+ brand3: 'hsla(154, 69%, 9%, 1)',
+ brand4: 'hsla(154, 67%, 11%, 1)',
+ brand5: 'hsla(154, 66%, 13%, 1)',
+ brand6: 'hsla(154, 64%, 17%, 1)',
+ brand7: 'hsla(154, 62%, 22%, 1)',
+ brand8: 'hsla(153, 60%, 28%, 1)',
+ brand9: 'hsla(153, 60%, 53%, 1)',
+ brand10: 'hsla(153, 60%, 70%, 1)',
+ brand11: 'hsla(153, 60%, 50%, 1)',
+ brand12: 'hsla(153, 60%, 95%, 1)',
+ },
+ contrast: {
+ 'brand-hiContrast': 'var(--colors-brand-9)',
+ 'brand-loContrast': 'var(--colors-brand-4)',
+ },
+ scale: {
+ scale1: 'var(--colors-slate1)',
+ scale2: 'var(--colors-slate2)',
+ scale3: 'var(--colors-slate3)',
+ scale4: 'var(--colors-slate4)',
+ scale5: 'var(--colors-slate5)',
+ scale6: 'var(--colors-slate6)',
+ scale7: 'var(--colors-slate7)',
+ scale8: 'var(--colors-slate8)',
+ scale9: 'var(--colors-slate9)',
+ scale10: 'var(--colors-slate10)',
+ scale11: 'var(--colors-slate11)',
+ scale12: 'var(--colors-slate12)',
+ },
+ scaleA: {
+ scaleA1: 'var(--colors-slatea1)',
+ scaleA2: 'var(--colors-slatea2)',
+ scaleA3: 'var(--colors-slatea3)',
+ scaleA4: 'var(--colors-slatea4)',
+ scaleA5: 'var(--colors-slatea5)',
+ scaleA6: 'var(--colors-slatea6)',
+ scaleA7: 'var(--colors-slatea7)',
+ scaleA8: 'var(--colors-slatea8)',
+ scaleA9: 'var(--colors-slatea9)',
+ scaleA10: 'var(--colors-slatea10)',
+ scaleA11: 'var(--colors-slatea11)',
+ scaleA12: 'var(--colors-slatea12)',
+ },
+ scaleDark: {
+ scale1: 'var(--colors-gray1)',
+ scale2: 'var(--colors-gray2)',
+ scale3: 'var(--colors-gray3)',
+ scale4: 'var(--colors-gray4)',
+ scale5: 'var(--colors-gray5)',
+ scale6: 'var(--colors-gray6)',
+ scale7: 'var(--colors-gray7)',
+ scale8: 'var(--colors-gray8)',
+ scale9: 'var(--colors-gray9)',
+ scale10: 'var(--colors-gray10)',
+ scale11: 'var(--colors-gray11)',
+ scale12: 'var(--colors-gray12)',
+ },
+ scaleADark: {
+ scaleA1: 'var(--colors-graya1)',
+ scaleA2: 'var(--colors-graya2)',
+ scaleA3: 'var(--colors-graya3)',
+ scaleA4: 'var(--colors-graya4)',
+ scaleA5: 'var(--colors-graya5)',
+ scaleA6: 'var(--colors-graya6)',
+ scaleA7: 'var(--colors-graya7)',
+ scaleA8: 'var(--colors-graya8)',
+ scaleA9: 'var(--colors-graya9)',
+ scaleA10: 'var(--colors-graya10)',
+ scaleA11: 'var(--colors-graya11)',
+ scaleA12: 'var(--colors-graya12)',
+ },
+}
diff --git a/www/internals/generate-sitemap.mjs b/www/internals/generate-sitemap.mjs
new file mode 100644
index 00000000000..8e1234ddcd3
--- /dev/null
+++ b/www/internals/generate-sitemap.mjs
@@ -0,0 +1,82 @@
+import { writeFileSync } from 'fs'
+import { globby } from 'globby'
+import prettier from 'prettier'
+
+/*
+ * kudos to leerob from vercel
+ * https://leerob.io/blog/nextjs-sitemap-robots
+ */
+
+async function generate() {
+ const prettierConfig = await prettier.resolveConfig('./.prettierrc.js')
+ const pages = await globby([
+ 'pages/*.js',
+ 'pages/*.tsx',
+ 'pages/*/*.tsx',
+ 'data/**/*.mdx',
+ '_blog/*.mdx',
+ '!pages/index.tsx',
+ '!data/*.mdx',
+ '!pages/_*.js',
+ '!pages/*/index.tsx',
+ '!pages/api',
+ '!pages/404.js',
+ ])
+
+ const sitemap = `
+
+
+ ${pages
+ .filter((page) => !page.includes('_document.tsx'))
+ .map((page) => {
+ const path = page
+ .replace('pages', '')
+ // add a `/` for blog posts
+ .replace('_blog', '/blog')
+ .replace('.tsx', '')
+ .replace('.mdx', '')
+ // replace the paths for nested 'index' based routes
+ .replace('/auth/Auth', '/auth')
+ .replace('/database/Database', '/database')
+ .replace('/storage/Storage', '/storage')
+
+ let route = path === '/index' ? '' : path
+
+ //
+ // blog specific urls
+ //
+ if (route.includes('/blog/')) {
+ // clean blog post route from string
+ const _route = route.replace('/blog/', '')
+ // splut the url
+ let split = _route.split('')
+ // target and replace the `-` between dates
+ split[4] = '/'
+ split[7] = '/'
+ split[10] = '/'
+ // reconstruct the url
+ route = '/blog/' + split.join('')
+ }
+
+ return `
+
+ ${`https://supabase.com${route}`}
+ weekly
+ 0.5
+
+ `
+ })
+ .join('')}
+
+ `
+
+ const formatted = prettier.format(sitemap, {
+ ...prettierConfig,
+ parser: 'html',
+ })
+
+ // eslint-disable-next-line no-sync
+ writeFileSync('public/sitemap_www.xml', formatted)
+}
+
+generate()
diff --git a/www/lib/Transition.js b/www/lib/Transition.js
new file mode 100644
index 00000000000..72135b217ad
--- /dev/null
+++ b/www/lib/Transition.js
@@ -0,0 +1,108 @@
+// From: https://gist.github.com/adamwathan/3b9f3ad1a285a2d1b482769aeb862467
+
+import { CSSTransition as ReactCSSTransition } from 'react-transition-group'
+import React, { useRef, useEffect, useContext } from 'react'
+
+const TransitionContext = React.createContext({
+ parent: {},
+})
+
+function useIsInitialRender() {
+ const isInitialRender = useRef(true)
+ useEffect(() => {
+ isInitialRender.current = false
+ }, [])
+ return isInitialRender.current
+}
+
+function CSSTransition({
+ show,
+ enter = '',
+ enterFrom = '',
+ enterTo = '',
+ leave = '',
+ leaveFrom = '',
+ leaveTo = '',
+ appear,
+ children,
+}) {
+ const enterClasses = enter.split(' ').filter((s) => s.length)
+ const enterFromClasses = enterFrom.split(' ').filter((s) => s.length)
+ const enterToClasses = enterTo.split(' ').filter((s) => s.length)
+ const leaveClasses = leave.split(' ').filter((s) => s.length)
+ const leaveFromClasses = leaveFrom.split(' ').filter((s) => s.length)
+ const leaveToClasses = leaveTo.split(' ').filter((s) => s.length)
+
+ function addClasses(node, classes) {
+ classes.length && node.classList.add(...classes)
+ }
+
+ function removeClasses(node, classes) {
+ classes.length && node.classList.remove(...classes)
+ }
+
+ return (
+ {
+ node.addEventListener('transitionend', done, false)
+ }}
+ onEnter={(node) => {
+ addClasses(node, [...enterClasses, ...enterFromClasses])
+ }}
+ onEntering={(node) => {
+ removeClasses(node, enterFromClasses)
+ addClasses(node, enterToClasses)
+ }}
+ onEntered={(node) => {
+ removeClasses(node, [...enterToClasses, ...enterClasses])
+ }}
+ onExit={(node) => {
+ addClasses(node, [...leaveClasses, ...leaveFromClasses])
+ }}
+ onExiting={(node) => {
+ removeClasses(node, leaveFromClasses)
+ addClasses(node, leaveToClasses)
+ }}
+ onExited={(node) => {
+ removeClasses(node, [...leaveToClasses, ...leaveClasses])
+ }}
+ >
+ {children}
+
+ )
+}
+
+function Transition({ show, appear, ...rest }) {
+ const { parent } = useContext(TransitionContext)
+ const isInitialRender = useIsInitialRender()
+ const isChild = show === undefined
+
+ if (isChild) {
+ return (
+
+ )
+ }
+
+ return (
+
+
+
+ )
+}
+
+export default Transition
diff --git a/www/lib/api.ts b/www/lib/api.ts
new file mode 100644
index 00000000000..cf3be86f0b0
--- /dev/null
+++ b/www/lib/api.ts
@@ -0,0 +1,47 @@
+import fs from 'fs'
+import { join } from 'path'
+import matter from 'gray-matter'
+
+const postsDirectory = join(process.cwd(), '_posts')
+
+export function getPostSlugs() {
+ return fs.readdirSync(postsDirectory)
+}
+
+export function getPostBySlug(slug: string, fields: string[] = []) {
+ const realSlug = slug.replace(/\.md$/, '')
+ const fullPath = join(postsDirectory, `${realSlug}.md`)
+ const fileContents = fs.readFileSync(fullPath, 'utf8')
+ const { data, content } = matter(fileContents)
+
+ type Items = {
+ [key: string]: string
+ }
+
+ const items: Items = {}
+
+ // Ensure only the minimal needed data is exposed
+ fields.forEach((field) => {
+ if (field === 'slug') {
+ items[field] = realSlug
+ }
+ if (field === 'content') {
+ items[field] = content
+ }
+
+ if (data[field]) {
+ items[field] = data[field]
+ }
+ })
+
+ return items
+}
+
+export function getAllPosts(fields: string[] = []) {
+ const slugs = getPostSlugs()
+ const posts = slugs
+ .map((slug) => getPostBySlug(slug, fields))
+ // sort posts by date in descending order
+ .sort((post1, post2) => (post1.date > post2.date ? -1 : 1))
+ return posts
+}
diff --git a/www/lib/authors.json b/www/lib/authors.json
new file mode 100644
index 00000000000..26ed81b8b90
--- /dev/null
+++ b/www/lib/authors.json
@@ -0,0 +1,140 @@
+[
+ {
+ "author_id": "angelico_de_los_reyes",
+ "author": "Angelico de los Reyes",
+ "position": "",
+ "author_url": "https://github.com/dragarcia",
+ "author_image_url": "https://github.com/dragarcia.png"
+ },
+ {
+ "author_id": "ant_wilson",
+ "author": "Ant Wilson",
+ "position": "CTO and Co-Founder",
+ "author_url": "https://github.com/awalias",
+ "author_image_url": "https://github.com/awalias.png"
+ },
+ {
+ "author_id": "soedirgo",
+ "author": "Bobbie Soedirgo",
+ "username": "soedirgo",
+ "position": "Engineering",
+ "author_url": "https://github.com/soedirgo",
+ "author_image_url": "https://github.com/soedirgo.png"
+ },
+ {
+ "author_id": "div_arora",
+ "author": "Div Arora",
+ "username": "darora",
+ "position": "Engineering",
+ "author_url": "https://github.com/darora",
+ "author_image_url": "https://github.com/darora.png"
+ },
+ {
+ "author_id": "fracek",
+ "author": "Francesco Ceccon",
+ "username": "fracek",
+ "position": "Engineering",
+ "author_url": "https://github.com/fracek",
+ "author_image_url": "https://github.com/fracek.png"
+ },
+ {
+ "author_id": "gurjeet",
+ "author": "Gurjeet Singh",
+ "username": "gurjeet",
+ "position": "Engineering",
+ "author_url": "https://github.com/gurjeet",
+ "author_image_url": "https://github.com/gurjeet.png"
+ },
+ {
+ "author_id": "inian",
+ "author": "Inian Parameshwaran",
+ "username": "inian",
+ "position": "Engineering",
+ "author_url": "https://twitter.com/everConfusedGuy",
+ "author_image_url": "https://avatars.githubusercontent.com/u/2155545?v=4"
+ },
+ {
+ "author_id": "kangmingtay",
+ "author": "Kang Ming Tay",
+ "username": "kangmingtay",
+ "position": "Engineering",
+ "author_url": "https://github.com/kangmingtay",
+ "author_image_url": "https://github.com/kangmingtay.png"
+ },
+ {
+ "author_id": "oli_rice",
+ "author": "Oliver Rice",
+ "username": "olirice",
+ "position": "Engineering",
+ "author_url": "https://github.com/olirice",
+ "author_image_url": "https://github.com/olirice.png"
+ },
+ {
+ "author_id": "paul_copplestone",
+ "author": "Paul Copplestone",
+ "position": "CEO and Co-Founder",
+ "author_url": "https://github.com/kiwicopple",
+ "author_image_url": "https://github.com/kiwicopple.png"
+ },
+ {
+ "author_id": "rory_wilding",
+ "author": "Rory Wilding",
+ "position": "Head of Growth",
+ "author_url": "https://github.com/roryw10",
+ "author_image_url": "https://github.com/roryw10.png"
+ },
+ {
+ "author_id": "steve_chavez",
+ "author": "Steve Chavez",
+ "username": "steve-chavez",
+ "position": "Engineering & PostgREST maintainer",
+ "author_url": "https://github.com/steve-chavez",
+ "author_image_url": "https://github.com/steve-chavez.png"
+ },
+ {
+ "author_id": "supabase",
+ "author": "Supabase",
+ "position": "",
+ "author_url": "https://github.com/supabase",
+ "author_image_url": "https://github.com/supabase.png"
+ },
+ {
+ "author_id": "thor_schaeff",
+ "author": "Thor Schaeff",
+ "position": "DevRel & DX",
+ "author_url": "https://github.com/thorwebdev",
+ "author_image_url": "https://github.com/thorwebdev.png"
+ },
+ {
+ "author_id": "wenbo_xie",
+ "author": "Wen Bo Xie",
+ "username": "w3b6x9",
+ "position": "Engineering",
+ "author_url": "https://github.com/w3b6x9",
+ "author_image_url": "https://github.com/w3b6x9.png"
+ },
+ {
+ "author_id": "dthyresson",
+ "author": "David Thyresson",
+ "username": "dthyresson",
+ "position": "Engineering",
+ "author_url": "https://github.com/dthyresson",
+ "author_image_url": "https://github.com/dthyresson.png"
+ },
+ {
+ "author_id": "shanerice",
+ "author": "Shane Rice",
+ "username": "shanerice",
+ "position": "Marketing",
+ "author_url": "https://github.com/shanerice",
+ "author_image_url": "https://github.com/shanerice.png"
+ },
+ {
+ "author_id": "alaister",
+ "author": "Alaister Young",
+ "username": "alaister",
+ "position": "Engineering",
+ "author_url": "https://github.com/alaister",
+ "author_image_url": "https://github.com/alaister.png"
+ }
+]
diff --git a/www/lib/constants.ts b/www/lib/constants.ts
new file mode 100644
index 00000000000..e72ab554946
--- /dev/null
+++ b/www/lib/constants.ts
@@ -0,0 +1,2 @@
+export const APP_NAME = 'Supabase'
+export const DESCRIPTION = 'The Open Source Alternative to Firebase.'
diff --git a/www/lib/fetchWrapper.ts b/www/lib/fetchWrapper.ts
new file mode 100644
index 00000000000..6e37b549b65
--- /dev/null
+++ b/www/lib/fetchWrapper.ts
@@ -0,0 +1,19 @@
+interface DataProps {
+ referrer?: string
+ title: string
+}
+
+export const post = (url: string, data: DataProps, options = {}) => {
+ return fetch(url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json',
+ },
+ referrerPolicy: 'no-referrer-when-downgrade',
+ body: JSON.stringify(data),
+ ...options,
+ }).catch((error) => {
+ console.error('Error at fetchWrapper - post:', error)
+ })
+}
diff --git a/www/lib/helpers.tsx b/www/lib/helpers.tsx
new file mode 100644
index 00000000000..33b8fb8ed3f
--- /dev/null
+++ b/www/lib/helpers.tsx
@@ -0,0 +1,13 @@
+// get reading time
+// returns :string
+export const generateReadingTime = (text: string) => {
+ const wordsPerMinute = 200
+ const noOfWords = text.split(/\s/g).length
+ const minutes = noOfWords / wordsPerMinute
+ const readTime = Math.ceil(minutes)
+ return `${readTime} minute read`
+}
+
+export function capitalize(word: string) {
+ return word[0].toUpperCase() + word.substring(1).toLowerCase()
+}
diff --git a/www/lib/markdownToHtml.ts b/www/lib/markdownToHtml.ts
new file mode 100644
index 00000000000..4917e910448
--- /dev/null
+++ b/www/lib/markdownToHtml.ts
@@ -0,0 +1,7 @@
+import remark from 'remark'
+import html from 'remark-html'
+
+export default async function markdownToHtml(markdown: string) {
+ const result = await remark().use(html).process(markdown)
+ return result.toString()
+}
diff --git a/www/lib/posts.tsx b/www/lib/posts.tsx
new file mode 100644
index 00000000000..26b3ed8b95a
--- /dev/null
+++ b/www/lib/posts.tsx
@@ -0,0 +1,144 @@
+import fs from 'fs'
+import path from 'path'
+import matter from 'gray-matter'
+import { generateReadingTime } from './helpers'
+
+// substring amount for file names
+// based on YYYY-MM-DD format
+const FILENAME_SUBSTRING = 11
+
+type Directories = '_blog' | '_case-studies'
+
+export const getSortedPosts = (directory: Directories, limit?: number, tags?: any) => {
+ //Finding directory named "blog" from the current working directory of Node.
+ const postDirectory = path.join(process.cwd(), directory)
+
+ //Reads all the files in the post directory
+ const fileNames = fs.readdirSync(postDirectory)
+
+ // categories stored in this array
+
+ let allPostsData = fileNames.map((filename) => {
+ const slug = filename.replace('.mdx', '')
+
+ const fullPath = path.join(postDirectory, filename)
+
+ //Extracts contents of the MDX file
+ const fileContents = fs.readFileSync(fullPath, 'utf8')
+ const { data, content } = matter(fileContents)
+
+ const options: Intl.DateTimeFormatOptions = { month: 'long', day: 'numeric', year: 'numeric' }
+ const formattedDate = new Date(data.date).toLocaleDateString('en-IN', options)
+
+ const readingTime = generateReadingTime(content)
+
+ // construct url to link to blog posts
+ // based on datestamp in file name
+ let url = ''
+ if (directory === '_blog') {
+ const dates = getDatesFromFileName(filename)
+ url = `${dates.year}/${dates.month}/${dates.day}/${slug.substring(FILENAME_SUBSTRING)}`
+ } else {
+ url = `/${directory.replace('_', '')}/${slug}`
+ }
+
+ const frontmatter = {
+ ...data,
+ date: formattedDate,
+ readingTime,
+ url: url,
+ }
+ return {
+ slug,
+ ...frontmatter,
+ }
+ })
+
+ allPostsData = allPostsData.sort((a, b) => {
+ if (new Date(a.date) < new Date(b.date)) {
+ return 1
+ } else {
+ return -1
+ }
+ })
+
+ if (tags) {
+ allPostsData = allPostsData.filter((post: any) => {
+ const found = tags.some((tag: any) => post.tags.includes(tag))
+ return found
+ })
+ }
+
+ if (limit) allPostsData = allPostsData.slice(0, limit)
+
+ return allPostsData
+}
+
+// Get Slugs
+export const getAllPostSlugs = (directory: Directories) => {
+ //Finding directory named "blog" from the current working directory of Node.
+ const postDirectory = path.join(process.cwd(), directory)
+
+ const fileNames = fs.readdirSync(postDirectory)
+
+ const files = fileNames.map((filename) => {
+ const dates =
+ directory === '_blog'
+ ? getDatesFromFileName(filename)
+ : {
+ year: '2021',
+ month: '04',
+ day: '02',
+ }
+
+ return {
+ params: {
+ ...dates,
+ slug: filename
+ .replace('.mdx', '')
+ .substring(directory === '_blog' ? FILENAME_SUBSTRING : 0),
+ },
+ }
+ })
+
+ return files
+}
+
+// Get Post based on Slug
+export const getPostdata = async (slug: string, directory: string) => {
+ //Finding directory named "blog" from the current working directory of Node.
+ const postDirectory = path.join(process.cwd(), directory)
+
+ const fullPath = path.join(postDirectory, `${slug}.mdx`)
+
+ const postContent = fs.readFileSync(fullPath, 'utf8')
+
+ return postContent
+}
+
+export const getAllCategories = (directory: Directories) => {
+ const posts = getSortedPosts(directory)
+ let categories: any = []
+
+ posts.map((post: any) => {
+ // add tags into categories array
+ post.tags.map((tag: string) => {
+ if (!categories.includes(tag)) return categories.push(tag)
+ })
+ })
+
+ return categories
+}
+
+const getDatesFromFileName = (filename: string) => {
+ // extract YYYY, MM, DD from post name
+ const year = filename.substring(0, 4)
+ const month = filename.substring(5, 7)
+ const day = filename.substring(8, 10)
+
+ return {
+ year,
+ month,
+ day,
+ }
+}
diff --git a/www/lib/rss.tsx b/www/lib/rss.tsx
new file mode 100644
index 00000000000..9942ee024c3
--- /dev/null
+++ b/www/lib/rss.tsx
@@ -0,0 +1,25 @@
+const generateRssItem = (post: any): string => `
+-
+
https://supabase.com/blog/${post.url}
+ ${post.title}
+ https://supabase.com/blog/${post.url}
+ ${post.description}
+ ${new Date(post.date).toUTCString()}
+
+`
+
+export const generateRss = (posts: any[]): string => {
+ return `
+
+
+ Blog - Supabase
+ https://supabase.com
+ Latest news from Supabase
+ en
+ ${new Date(posts[0].date).toUTCString()}
+
+ ${posts.map(generateRssItem).join('')}
+
+
+`
+}
diff --git a/www/lib/supabase.ts b/www/lib/supabase.ts
new file mode 100644
index 00000000000..304c3890488
--- /dev/null
+++ b/www/lib/supabase.ts
@@ -0,0 +1,9 @@
+import { createClient } from '@supabase/supabase-js'
+
+const SUPABASE_URL = 'https://obuldanrptloktxcffvn.supabase.co'
+const SUPABASE_ANON_KEY =
+ 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYzNzY1NjAxNSwiZXhwIjoxOTUzMjMyMDE1fQ.0sfp_Njf7l4g-nOCF5a1TQE11rPqtz8Y10uctIetkBA'
+
+const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)
+
+export default supabase
diff --git a/www/next-env.d.ts b/www/next-env.d.ts
new file mode 100644
index 00000000000..4f11a03dc6c
--- /dev/null
+++ b/www/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/www/next.config.js b/www/next.config.js
new file mode 100644
index 00000000000..a99a3de6531
--- /dev/null
+++ b/www/next.config.js
@@ -0,0 +1,654 @@
+const withMDX = require('@next/mdx')()
+
+module.exports = withMDX({
+ basePath: '',
+ pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'md', 'mdx'],
+
+ trailingSlash: false,
+ images: {
+ domains: [
+ 'avatars.githubusercontent.com',
+ 'github.com',
+ 'ca.slack-edge.com',
+ 'res.cloudinary.com',
+ 'images.unsplash.com',
+ 'supabase.com',
+ 'obuldanrptloktxcffvn.supabase.co',
+ 'avatars.githubusercontent.com',
+ ],
+ },
+ async headers() {
+ return [
+ {
+ source: '/(.*)',
+ headers: [
+ {
+ key: 'Strict-Transport-Security',
+ value: '',
+ },
+ {
+ key: 'X-Robots-Tag',
+ value: 'all',
+ },
+ {
+ key: 'X-Frame-Options',
+ value: 'DENY',
+ },
+ ],
+ },
+ ]
+ },
+ async rewrites() {
+ return [
+ {
+ source: '/:path*',
+ destination: `/:path*`,
+ },
+ {
+ source: '/docs',
+ destination: `${process.env.NEXT_PUBLIC_DOCS_URL}`,
+ },
+ {
+ source: '/docs/:path*',
+ destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/:path*`,
+ },
+ // misc rewrites
+ {
+ source: '/humans.txt',
+ destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/humans.txt`,
+ },
+ {
+ source: '/lawyers.txt',
+ destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/lawyers.txt`,
+ },
+ {
+ source: '/.well-known/security.txt',
+ destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/.well-known/security.txt`,
+ },
+ {
+ source: '/oss',
+ destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/oss`,
+ },
+ {
+ source: '/feed.xml',
+ destination: `/rss.xml`,
+ },
+ ]
+ },
+ async redirects() {
+ return [
+ {
+ permanent: false,
+ source: '/blog/2021/03/08/toad-a-link-shorterner-with-simple-apis-for-low-coders',
+ destination: '/blog/2021/03/08/toad-a-link-shortener-with-simple-apis-for-low-coders',
+ },
+ {
+ permanent: false,
+ source: '/blog/2020/07/10/surviving-hacker-news',
+ destination: '/blog/2020/07/10/alpha-launch-postmortem',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/_CommonResponses',
+ destination: '/docs',
+ },
+ { permanent: false, source: '/docs/common/_DummyData', destination: '/docs' },
+ { permanent: false, source: '/docs/common/_FromFunction', destination: '/docs' },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_adj',
+ destination: '/docs/reference/javascript/rangeAdjacent',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_cd',
+ destination: '/docs/reference/javascript/containedBy',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_cs',
+ destination: '/docs/reference/javascript/contains',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_eq',
+ destination: '/docs/reference/javascript/eq',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_filter',
+ destination: '/docs/reference/javascript/filter',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_gt',
+ destination: '/docs/reference/javascript/gt',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_gte',
+ destination: '/docs/reference/javascript/gte',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_ilike',
+ destination: '/docs/reference/javascript/ilike',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_in',
+ destination: '/docs/reference/javascript/in',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_is',
+ destination: '/docs/reference/javascript/is',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_like',
+ destination: '/docs/reference/javascript/like',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_lt',
+ destination: '/docs/reference/javascript/lt',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_lte',
+ destination: '/docs/reference/javascript/lte',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_match',
+ destination: '/docs/reference/javascript/match',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_neq',
+ destination: '/docs/reference/javascript/neq',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_not',
+ destination: '/docs/reference/javascript/not',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_nxl',
+ destination: '/docs/reference/javascript/rangeGte',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_nxr',
+ destination: '/docs/reference/javascript/rangeLte',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_or',
+ destination: '/docs/reference/javascript/or',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_ova',
+ destination: '/docs/reference/javascript/overlaps',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_ovr',
+ destination: '/docs/reference/javascript/overlaps',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_sl',
+ destination: '/docs/reference/javascript/rangeLt',
+ },
+ {
+ permanent: false,
+ source: '/docs/common/filters/_sr',
+ destination: '/docs/reference/javascript/rangeGt',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/authentication',
+ destination: '/docs/guides/auth',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/delete',
+ destination: '/docs/reference/javascript/delete',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/get',
+ destination: '/docs/reference/javascript/select',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/getting-started',
+ destination: '/docs/reference/javascript/supabase-client',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/patch',
+ destination: '/docs/reference/javascript/update',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/post',
+ destination: '/docs/reference/javascript/insert',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/stored-procedures',
+ destination: '/docs/reference/javascript/rpc',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/subscribe',
+ destination: '/docs/reference/javascript/subscribe',
+ },
+ {
+ permanent: false,
+ source: '/docs/library/user-management',
+ destination: '/docs/guides/auth',
+ },
+ {
+ permanent: false,
+ source: '/docs/postgres/postgres-intro',
+ destination: '/docs/postgres/server/about',
+ },
+ {
+ permanent: false,
+ source: '/docs/realtime/about',
+ destination: '/docs/realtime/server/about',
+ },
+ { permanent: false, source: '/docs/realtime/aws', destination: '/docs/postgres/server/aws' },
+ {
+ permanent: false,
+ source: '/docs/realtime/digitalocean',
+ destination: '/docs/postgres/server/digitalocean',
+ },
+ {
+ permanent: false,
+ source: '/docs/realtime/docker',
+ destination: '/docs/postgres/server/docker',
+ },
+ {
+ permanent: false,
+ source: '/docs/realtime/source',
+ destination: '/docs/postgres/server/about',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/supabase-client',
+ destination: '/docs/reference/javascript/supabase-client',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/installing',
+ destination: '/docs/reference/javascript/installing',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/initializing',
+ destination: '/docs/reference/javascript/initializing',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/generating-types',
+ destination: '/docs/reference/javascript/generating-types',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/auth-signup',
+ destination: '/docs/reference/javascript/auth-signup',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/auth-signin',
+ destination: '/docs/reference/javascript/auth-signin',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/auth-signout',
+ destination: '/docs/reference/javascript/auth-signout',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/auth-session',
+ destination: '/docs/reference/javascript/auth-session',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/auth-user',
+ destination: '/docs/reference/javascript/auth-user',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/auth-update',
+ destination: '/docs/reference/javascript/auth-update',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/auth-onauthstatechange',
+ destination: '/docs/reference/javascript/auth-onauthstatechange',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/reset-password-email',
+ destination: '/docs/reference/javascript/reset-password-email',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/select',
+ destination: '/docs/reference/javascript/select',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/insert',
+ destination: '/docs/reference/javascript/insert',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/update',
+ destination: '/docs/reference/javascript/update',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/delete',
+ destination: '/docs/reference/javascript/delete',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/rpc',
+ destination: '/docs/reference/javascript/rpc',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/subscribe',
+ destination: '/docs/reference/javascript/subscribe',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/removesubscription',
+ destination: '/docs/reference/javascript/removesubscription',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/getsubscriptions',
+ destination: '/docs/reference/javascript/getsubscriptions',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/using-modifiers',
+ destination: '/docs/reference/javascript/using-modifiers',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/limit',
+ destination: '/docs/reference/javascript/limit',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/order',
+ destination: '/docs/reference/javascript/order',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/range',
+ destination: '/docs/reference/javascript/range',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/single',
+ destination: '/docs/reference/javascript/single',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/using-filters',
+ destination: '/docs/reference/javascript/using-filters',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/filter',
+ destination: '/docs/reference/javascript/filter',
+ },
+ { permanent: false, source: '/docs/client/or', destination: '/docs/reference/javascript/or' },
+ {
+ permanent: false,
+ source: '/docs/client/not',
+ destination: '/docs/reference/javascript/not',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/match',
+ destination: '/docs/reference/javascript/match',
+ },
+ { permanent: false, source: '/docs/client/eq', destination: '/docs/reference/javascript/eq' },
+ {
+ permanent: false,
+ source: '/docs/client/neq',
+ destination: '/docs/reference/javascript/neq',
+ },
+ { permanent: false, source: '/docs/client/gt', destination: '/docs/reference/javascript/gt' },
+ {
+ permanent: false,
+ source: '/docs/client/gte',
+ destination: '/docs/reference/javascript/gte',
+ },
+ { permanent: false, source: '/docs/client/lt', destination: '/docs/reference/javascript/lt' },
+ {
+ permanent: false,
+ source: '/docs/client/lte',
+ destination: '/docs/reference/javascript/lte',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/like',
+ destination: '/docs/reference/javascript/like',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/ilike',
+ destination: '/docs/reference/javascript/ilike',
+ },
+ { permanent: false, source: '/docs/client/is', destination: '/docs/reference/javascript/is' },
+ { permanent: false, source: '/docs/client/in', destination: '/docs/reference/javascript/in' },
+ {
+ permanent: false,
+ source: '/docs/client/gte',
+ destination: '/docs/reference/javascript/gte',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/cs',
+ destination: '/docs/reference/javascript/contains',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/cd',
+ destination: '/docs/reference/javascript/containedBy',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/sl',
+ destination: '/docs/reference/javascript/rangeLt',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/sr',
+ destination: '/docs/reference/javascript/rangeGt',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/nxl',
+ destination: '/docs/reference/javascript/rangeGte',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/nxr',
+ destination: '/docs/reference/javascript/rangeLte',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/adj',
+ destination: '/docs/reference/javascript/rangeAdjacent',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/ov',
+ destination: '/docs/reference/javascript/overlaps',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/ova',
+ destination: '/docs/reference/javascript/overlaps',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/fts',
+ destination: '/docs/reference/javascript/textSearch',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/plfts',
+ destination: '/docs/reference/javascript/textSearch',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/phfts',
+ destination: '/docs/reference/javascript/textSearch',
+ },
+ {
+ permanent: false,
+ source: '/docs/client/wfts',
+ destination: '/docs/reference/javascript/textSearch',
+ },
+ { permanent: false, source: '/blog/page/:number', destination: '/blog' },
+ { permanent: false, source: '/blog/tags', destination: '/blog' },
+ { permanent: false, source: '/docs/pricing', destination: '/pricing' },
+
+ {
+ permanent: false,
+ source: '/docs/careers',
+ destination: 'https://about.supabase.com/careers',
+ },
+ {
+ permanent: false,
+ source: '/docs/careers/:match*',
+ destination: 'https://about.supabase.com/careers//:match*',
+ },
+
+ { permanent: false, source: '/docs/resources', destination: '/docs/guides' },
+
+ {
+ permanent: false,
+ source: '/docs/reference/postgres/getting-started',
+ destination: '/docs/guides/database/introduction',
+ },
+ {
+ permanent: false,
+ source: '/reference/postgres/connection-strings',
+ destination: '/docs/guides/database/connecting/connecting-to-postgres',
+ },
+ {
+ permanent: false,
+ source: '/docs/reference/postgres/schemas',
+ destination: '/docs/guides/database/tables',
+ },
+ {
+ permanent: false,
+ source: '/docs/reference/postgres/tables',
+ destination: '/docs/guides/database/tables',
+ },
+ {
+ permanent: false,
+ source: '/docs/guides/database/resource-management',
+ destination: '/docs/guides/database/timeouts',
+ },
+ {
+ permanent: false,
+ source: '/docs/reference/postgres/database-passwords',
+ destination: '/docs/guides/database/managing-passwords',
+ },
+ {
+ permanent: false,
+ source: '/docs/reference/postgres/changing-timezones',
+ destination: '/docs/guides/database/managing-timezones',
+ },
+ {
+ permanent: false,
+ source: '/docs/reference/postgres/publications',
+ destination: '/docs/guides/database/replication',
+ },
+
+ {
+ permanent: false,
+ source: '/docs/guides/platform',
+ destination: '/docs/guides/hosting/platform',
+ },
+ {
+ permanent: false,
+ source: '/docs/guides/self-hosting',
+ destination: '/docs/guides/hosting/overview',
+ },
+ {
+ permanent: true,
+ source: '/docs/reference/javascript/delete-user',
+ destination: '/docs/reference/javascript/auth-api-deleteuser',
+ },
+ {
+ permanent: true,
+ source: '/docs/reference/javascript/reset-password-email',
+ destination: '/docs/reference/javascript/auth-api-resetpasswordforemail',
+ },
+ {
+ permanent: true,
+ source: '/oss',
+ destination: '/docs/oss',
+ },
+ {
+ permanent: true,
+ source: '/docs/reference/postgres/connection-strings',
+ destination: '/docs/guides/database/connecting-to-postgres',
+ },
+ {
+ permanent: true,
+ source: '/docs/guides/database/connecting/connecting-to-postgres',
+ destination: '/docs/guides/database/connecting-to-postgres',
+ },
+ {
+ permanent: true,
+ source: '/docs/guides/database/connecting/direct-connections',
+ destination: '/docs/guides/database/connecting-to-postgres',
+ },
+ {
+ permanent: true,
+ source: '/docs/guides/database/connecting/direct-connections',
+ destination: '/docs/guides/database/connection-pooling',
+ },
+ {
+ permanent: true,
+ source: '/docs/guides',
+ destination: '/docs/',
+ },
+ {
+ permanent: true,
+ source: '/guides/database/introduction',
+ destination: '/guides/database',
+ },
+ {
+ permanent: true,
+ source: '/guides/auth',
+ destination: '/guides/auth/intro',
+ },
+ {
+ permanent: false,
+ source: '/partners',
+ destination: '/partners/integrations',
+ },
+ ]
+ },
+})
diff --git a/www/package-lock.json b/www/package-lock.json
new file mode 100644
index 00000000000..ab1d78136bd
--- /dev/null
+++ b/www/package-lock.json
@@ -0,0 +1,15833 @@
+{
+ "name": "supabase-website",
+ "version": "0.0.2",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "supabase-website",
+ "version": "0.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@heroicons/react": "^1.0.6",
+ "@mdx-js/loader": "^1.6.22",
+ "@mdx-js/react": "^1.6.22",
+ "@next/mdx": "^10.0.7",
+ "@supabase/supabase-js": "^1.6.0",
+ "@supabase/ui": "v0.37.0-alpha.50",
+ "classnames": "^2.3.1",
+ "date-fns": "2.10.0",
+ "deepmerge": "^4.2.2",
+ "globby": "^12.0.2",
+ "gray-matter": "^4.0.2",
+ "markdown-toc": "^1.2.0",
+ "marked": "^4.0.12",
+ "next": "latest",
+ "next-mdx-remote": "^2.1.3",
+ "next-seo": "^4.20.0",
+ "nodemailer": "^6.7.3",
+ "parse-numeric-range": "^1.3.0",
+ "react": "^17.0.2",
+ "react-copy-to-clipboard": "^5.0.2",
+ "react-dom": "^17.0.2",
+ "react-ga": "^3.3.0",
+ "react-markdown": "^5.0.3",
+ "react-syntax-highlighter": "^15.5.0",
+ "react-tooltip": "^4.2.17",
+ "react-transition-group": "^4.4.1",
+ "rehype-slug": "^4.0.1",
+ "remark": "^13.0.0",
+ "remark-gfm": "^1.0.0",
+ "remark-html": "10.0.0",
+ "swiper": "^6.5.0",
+ "swr": "^0.5.4",
+ "typescript": "^4.0.3",
+ "use-debounce": "^7.0.1",
+ "uuid": "^8.3.2"
+ },
+ "devDependencies": {
+ "@tailwindcss/typography": "^0.5.2",
+ "@types/classnames": "^2.3.1",
+ "@types/jest": "^25.2.2",
+ "@types/marked": "^4.0.3",
+ "@types/node": "^14.0.1",
+ "@types/nodemailer": "^6.4.4",
+ "@types/parse-numeric-range": "^0.0.1",
+ "@types/react": "^16.9.35",
+ "@types/react-copy-to-clipboard": "^4.3.0",
+ "@types/react-dom": "^16.9.8",
+ "@types/react-syntax-highlighter": "^13.5.2",
+ "autoprefixer": "^10.4.2",
+ "file-loader": "^6.2.0",
+ "postcss": "^8.4.7",
+ "postcss-preset-env": "^6.7.0",
+ "prettier": "^2.2.1",
+ "tailwindcss": "^3.0.23"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
+ "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "dependencies": {
+ "@babel/highlight": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz",
+ "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.12.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz",
+ "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.9",
+ "@babel/types": "^7.12.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz",
+ "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==",
+ "dependencies": {
+ "@babel/types": "^7.17.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
+ "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
+ "dependencies": {
+ "@babel/helper-explode-assignable-expression": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
+ "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
+ "dependencies": {
+ "@babel/compat-data": "^7.16.4",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.17.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.17.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz",
+ "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz",
+ "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "regexpu-core": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
+ "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.13.0",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/traverse": "^7.13.0",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0-0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
+ "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
+ "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
+ "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-get-function-arity": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
+ "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
+ "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.17.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz",
+ "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.3",
+ "@babel/types": "^7.17.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
+ "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-wrap-function": "^7.16.8",
+ "@babel/types": "^7.16.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
+ "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
+ "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
+ "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
+ "dependencies": {
+ "@babel/types": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "dependencies": {
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
+ "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.8",
+ "@babel/types": "^7.16.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz",
+ "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==",
+ "dependencies": {
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.0",
+ "@babel/types": "^7.17.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+ "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz",
+ "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
+ "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
+ "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
+ "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-static-block": {
+ "version": "7.17.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz",
+ "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.17.6",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-dynamic-import": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
+ "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
+ "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-json-strings": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
+ "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
+ "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
+ "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
+ "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+ "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.12.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
+ "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
+ "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.16.10",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
+ "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
+ "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz",
+ "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
+ "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
+ "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
+ "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
+ "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
+ "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
+ "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz",
+ "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
+ "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
+ "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
+ "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
+ "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
+ "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
+ "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
+ "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
+ "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
+ "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
+ "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
+ "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
+ "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
+ "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
+ "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
+ "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
+ "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz",
+ "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz",
+ "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-jsx": "^7.16.7",
+ "@babel/types": "^7.17.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
+ "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
+ "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
+ "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
+ "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
+ "dependencies": {
+ "regenerator-transform": "^0.14.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
+ "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
+ "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
+ "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
+ "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
+ "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
+ "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz",
+ "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-typescript": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
+ "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
+ "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
+ "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
+ "dependencies": {
+ "@babel/compat-data": "^7.16.8",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
+ "@babel/plugin-proposal-class-static-block": "^7.16.7",
+ "@babel/plugin-proposal-dynamic-import": "^7.16.7",
+ "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
+ "@babel/plugin-proposal-json-strings": "^7.16.7",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.7",
+ "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-private-methods": "^7.16.11",
+ "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-transform-arrow-functions": "^7.16.7",
+ "@babel/plugin-transform-async-to-generator": "^7.16.8",
+ "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
+ "@babel/plugin-transform-block-scoping": "^7.16.7",
+ "@babel/plugin-transform-classes": "^7.16.7",
+ "@babel/plugin-transform-computed-properties": "^7.16.7",
+ "@babel/plugin-transform-destructuring": "^7.16.7",
+ "@babel/plugin-transform-dotall-regex": "^7.16.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.16.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
+ "@babel/plugin-transform-for-of": "^7.16.7",
+ "@babel/plugin-transform-function-name": "^7.16.7",
+ "@babel/plugin-transform-literals": "^7.16.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.16.7",
+ "@babel/plugin-transform-modules-amd": "^7.16.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.16.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.16.7",
+ "@babel/plugin-transform-modules-umd": "^7.16.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
+ "@babel/plugin-transform-new-target": "^7.16.7",
+ "@babel/plugin-transform-object-super": "^7.16.7",
+ "@babel/plugin-transform-parameters": "^7.16.7",
+ "@babel/plugin-transform-property-literals": "^7.16.7",
+ "@babel/plugin-transform-regenerator": "^7.16.7",
+ "@babel/plugin-transform-reserved-words": "^7.16.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.16.7",
+ "@babel/plugin-transform-spread": "^7.16.7",
+ "@babel/plugin-transform-sticky-regex": "^7.16.7",
+ "@babel/plugin-transform-template-literals": "^7.16.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.16.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.16.7",
+ "@babel/plugin-transform-unicode-regex": "^7.16.7",
+ "@babel/preset-modules": "^0.1.5",
+ "@babel/types": "^7.16.8",
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "core-js-compat": "^3.20.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz",
+ "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==",
+ "dependencies": {
+ "@babel/compat-data": "^7.17.0",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+ "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
+ "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-transform-react-display-name": "^7.16.7",
+ "@babel/plugin-transform-react-jsx": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.7",
+ "@babel/plugin-transform-react-pure-annotations": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz",
+ "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-transform-typescript": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz",
+ "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/parser": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
+ "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.3",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.17.3",
+ "@babel/types": "^7.17.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz",
+ "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@csstools/convert-colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
+ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/@headlessui/react": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.5.0.tgz",
+ "integrity": "sha512-aaRnYxBb3MU2FNJf3Ut9RMTUqqU3as0aI1lQhgo2n9Fa67wRu14iOGqx93xB+uMNVfNwZ5B3y/Ndm7qZGuFeMQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": "^16 || ^17 || ^18",
+ "react-dom": "^16 || ^17 || ^18"
+ }
+ },
+ "node_modules/@heroicons/react": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz",
+ "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==",
+ "peerDependencies": {
+ "react": ">= 16"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
+ "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8.3"
+ }
+ },
+ "node_modules/@jest/types/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@jest/types/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/types/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@jest/types/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@jest/types/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/types/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
+ "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
+ "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz",
+ "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@mdx-js/loader": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-1.6.22.tgz",
+ "integrity": "sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==",
+ "dependencies": {
+ "@mdx-js/mdx": "1.6.22",
+ "@mdx-js/react": "1.6.22",
+ "loader-utils": "2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mdx-js/mdx": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz",
+ "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==",
+ "dependencies": {
+ "@babel/core": "7.12.9",
+ "@babel/plugin-syntax-jsx": "7.12.1",
+ "@babel/plugin-syntax-object-rest-spread": "7.8.3",
+ "@mdx-js/util": "1.6.22",
+ "babel-plugin-apply-mdx-type-prop": "1.6.22",
+ "babel-plugin-extract-import-names": "1.6.22",
+ "camelcase-css": "2.0.1",
+ "detab": "2.0.4",
+ "hast-util-raw": "6.0.1",
+ "lodash.uniq": "4.5.0",
+ "mdast-util-to-hast": "10.0.1",
+ "remark-footnotes": "2.0.0",
+ "remark-mdx": "1.6.22",
+ "remark-parse": "8.0.3",
+ "remark-squeeze-paragraphs": "4.0.0",
+ "style-to-object": "0.3.0",
+ "unified": "9.2.0",
+ "unist-builder": "2.0.3",
+ "unist-util-visit": "2.0.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mdx-js/react": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz",
+ "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1 || ^17.0.0"
+ }
+ },
+ "node_modules/@mdx-js/util": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz",
+ "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/@mertasan/tailwindcss-variables": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@mertasan/tailwindcss-variables/-/tailwindcss-variables-2.0.1.tgz",
+ "integrity": "sha512-B2ViH/sfiLMzQKAAHQK5fbghnPI9YeOmwbTHNK1e75Dgt6/FQoUQnP7zUBSpvYFq67GReUfd7XneqAIAmlgw8Q==",
+ "dependencies": {
+ "lodash": "^4.17.21"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ },
+ "peerDependencies": {
+ "autoprefixer": "^10.0.2",
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.4.tgz",
+ "integrity": "sha512-7gQwotJDKnfMxxXd8xJ2vsX5AzyDxO3zou0+QOXX8/unypA6icw5+wf6A62yKZ6qQ4UZHHxS68pb6UV+wNneXg=="
+ },
+ "node_modules/@next/mdx": {
+ "version": "10.2.3",
+ "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-10.2.3.tgz",
+ "integrity": "sha512-hseekptFqOCxLbdaNDS/yelaG2Q2uaNDilnRjq8Uv/LWHuZ9F2cp7ndwTolW9acJsbDedamKRMgdw4V2Fz0pUA==",
+ "peerDependencies": {
+ "@mdx-js/loader": ">=0.15.0",
+ "@mdx-js/react": "*"
+ }
+ },
+ "node_modules/@next/swc-android-arm-eabi": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.4.tgz",
+ "integrity": "sha512-FJg/6a3s2YrUaqZ+/DJZzeZqfxbbWrynQMT1C5wlIEq9aDLXCFpPM/PiOyJh0ahxc0XPmi6uo38Poq+GJTuKWw==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-android-arm64": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.4.tgz",
+ "integrity": "sha512-LXraazvQQFBgxIg3Htny6G5V5he9EK7oS4jWtMdTGIikmD/OGByOv8ZjLuVLZLtVm3UIvaAiGtlQSLecxJoJDw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.4.tgz",
+ "integrity": "sha512-SSST/dBymecllZxcqTCcSTCu5o1NKk9I+xcvhn/O9nH6GWjgvGgGkNqLbCarCa0jJ1ukvlBA138FagyrmZ/4rQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.4.tgz",
+ "integrity": "sha512-p1lwdX0TVjaoDXQVuAkjtxVBbCL/urgxiMCBwuPDO7TikpXtSRivi+mIzBj5q7ypgICFmIAOW3TyupXeoPRAnA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm-gnueabihf": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.4.tgz",
+ "integrity": "sha512-67PZlgkCn3TDxacdVft0xqDCL7Io1/C4xbAs0+oSQ0xzp6OzN2RNpuKjHJrJgKd0DsE1XZ9sCP27Qv0591yfyg==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.4.tgz",
+ "integrity": "sha512-OnOWixhhw7aU22TQdQLYrgpgFq0oA1wGgnjAiHJ+St7MLj82KTDyM9UcymAMbGYy6nG/TFOOHdTmRMtCRNOw0g==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.4.tgz",
+ "integrity": "sha512-UoRMzPZnsAavdWtVylYxH8DNC7Uy0i6RrvNwT4PyQVdfANBn2omsUkcH5lgS2O7oaz0nAYLk1vqyZDO7+tJotA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.4.tgz",
+ "integrity": "sha512-nM+MA/frxlTLUKLJKorctdI20/ugfHRjVEEkcLp/58LGG7slNaP1E5d5dRA1yX6ISjPcQAkywas5VlGCg+uTvA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.4.tgz",
+ "integrity": "sha512-GoRHxkuW4u4yKw734B9SzxJwVdyEJosaZ62P7ifOwcujTxhgBt3y76V2nNUrsSuopcKI2ZTDjaa+2wd5zyeXbA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.4.tgz",
+ "integrity": "sha512-6TQkQze0ievXwHJcVUrIULwCYVe3ccX6T0JgZ1SiMeXpHxISN7VJF/O8uSCw1JvXZYZ6ud0CJ7nfC5HXivgfPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-ia32-msvc": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.4.tgz",
+ "integrity": "sha512-CsbX/IXuZ5VSmWCpSetG2HD6VO5FTsO39WNp2IR2Ut/uom9XtLDJAZqjQEnbUTLGHuwDKFjrIO3LkhtROXLE/g==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.4.tgz",
+ "integrity": "sha512-JtYuWzKXKLDMgE/xTcFtCm1MiCIRaAc5XYZfYX3n/ZWSI1SJS/GMm+Su0SAHJgRFavJh6U/p998YwO/iGTIgqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@radix-ui/colors": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz",
+ "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw=="
+ },
+ "node_modules/@radix-ui/popper": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/popper/-/popper-0.1.0.tgz",
+ "integrity": "sha512-uzYeElL3w7SeNMuQpXiFlBhTT+JyaNMCwDfjKkrzugEcYrf5n52PHqncNdQPUtR42hJh8V9FsqyEDbDxkeNjJQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "csstype": "^3.0.4"
+ }
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-0.1.0.tgz",
+ "integrity": "sha512-tqxZKybwN5Fa3VzZry4G6mXAAb9aAqKmPtnVbZpL0vsBwvOHTBwsjHVPXylocYLwEtBY9SCe665bYnNB515uoA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-0.1.6.tgz",
+ "integrity": "sha512-LOXlqPU6y6EMBopdRIKCWFvMPY1wPTQ4uJiX7ZVxldrMJcM7imBzI3wlRTkPCHZ3FLHmpuw+cQi3du23pzJp1g==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-collapsible": "0.1.6",
+ "@radix-ui/react-collection": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-0.1.4.tgz",
+ "integrity": "sha512-BB6XzAb7Ml7+wwpFdYVtZpK1BlMgqyafSQNGzhIpSZ4uXvXOHPlR5GP8M449JkeQzgQjv9Mp1AsJxFC0KuOtuA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "0.1.4"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-collapsible": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-0.1.6.tgz",
+ "integrity": "sha512-Gkf8VuqMc6HTLzA2AxVYnyK6aMczVLpatCjdD9Lj4wlYLXCz9KtiqZYslLMeqnQFLwLyZS0WKX/pQ8j5fioIBw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-0.1.4.tgz",
+ "integrity": "sha512-3muGI15IdgaDFjOcO7xX8a35HQRBRF6LH9pS6UCeZeRmbslkVeHyJRQr2rzICBUoX7zgIA0kXyMDbpQnJGyJTA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-slot": "0.1.2"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-0.1.0.tgz",
+ "integrity": "sha512-eyclbh+b77k+69Dk72q3694OHrn9B3QsoIRx7ywX341U9RK1ThgQjMFZoPtmZNQTksXHLNEiefR8hGVeFyInGg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-0.1.1.tgz",
+ "integrity": "sha512-PkyVX1JsLBioeu0jB9WvRpDBBLtLZohVDT3BB5CTSJqActma8S8030P57mWZb4baZifMvN7KKWPAA40UmWKkQg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-context-menu": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-0.1.6.tgz",
+ "integrity": "sha512-0qa6ABaeqD+WYI+8iT0jH0QLLcV8Kv0xI+mZL4FFnG4ec9H0v+yngb5cfBBfs9e/KM8mDzFFpaeegqsQlLNqyQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-menu": "0.1.6",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0",
+ "react-dom": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-0.1.7.tgz",
+ "integrity": "sha512-jXt8srGhHBRvEr9jhEAiwwJzWCWZoGRJ030aC9ja/gkRJbZdy0iD3FwXf+Ff4RtsZyLUMHW7VUwFOlz3Ixe1Vw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-dismissable-layer": "0.1.5",
+ "@radix-ui/react-focus-guards": "0.1.0",
+ "@radix-ui/react-focus-scope": "0.1.4",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-portal": "0.1.4",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-slot": "0.1.2",
+ "@radix-ui/react-use-controllable-state": "0.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "^2.4.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0",
+ "react-dom": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-0.1.5.tgz",
+ "integrity": "sha512-J+fYWijkX4M4QKwf9dtu1oC0U6e6CEl8WhBp3Ad23yz2Hia0XCo6Pk/mp5CAFy4QBtQedTSkhW05AdtSOEoajQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-body-pointer-events": "0.1.1",
+ "@radix-ui/react-use-callback-ref": "0.1.0",
+ "@radix-ui/react-use-escape-keydown": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-dropdown-menu": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-0.1.6.tgz",
+ "integrity": "sha512-RZhtzjWwJ4ZBN7D8ek4Zn+ilHzYuYta9yIxFnbC0pfqMnSi67IQNONo1tuuNqtFh9SRHacPKc65zo+kBBlxtdg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-menu": "0.1.6",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0",
+ "react-dom": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-0.1.0.tgz",
+ "integrity": "sha512-kRx/swAjEfBpQ3ns7J3H4uxpXuWCqN7MpALiSDOXiyo2vkWv0L9sxvbpZeTulINuE3CGMzicVMuNc/VWXjFKOg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-0.1.4.tgz",
+ "integrity": "sha512-fbA4ES3H4Wkxp+OeLhvN6SwL7mXNn/aBtUf7DRYxY9+Akrf7dRxl2ck4lgcpPsSg3zSDsEwLcY+h5cmj5yvlug==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-0.1.5.tgz",
+ "integrity": "sha512-IPc4H/63bes0IZ1GJJozSEkSWcDyhNGtKFWUpJ+XtaLyQ1X3x7Mf6fWwWhDcpqlYEP+5WtAvfqcyEsyjP+ZhBQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-menu": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-0.1.6.tgz",
+ "integrity": "sha512-ho3+bhpr3oAFkOBJ8VkUb1BcGoiZBB3OmcWPqa6i5RTUKrzNX/d6rauochu2xDlWjiRtpVuiAcsTVOeIC4FbYQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-collection": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-dismissable-layer": "0.1.5",
+ "@radix-ui/react-focus-guards": "0.1.0",
+ "@radix-ui/react-focus-scope": "0.1.4",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-popper": "0.1.4",
+ "@radix-ui/react-portal": "0.1.4",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-roving-focus": "0.1.5",
+ "@radix-ui/react-use-callback-ref": "0.1.0",
+ "@radix-ui/react-use-direction": "0.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "^2.4.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0",
+ "react-dom": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-popover": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-0.1.6.tgz",
+ "integrity": "sha512-zQzgUqW4RQDb0ItAL1xNW4K4olUrkfV3jeEPs9rG+nsDQurO+W9TT+YZ9H1mmgAJqlthyv1sBRZGdBm4YjtD6Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-dismissable-layer": "0.1.5",
+ "@radix-ui/react-focus-guards": "0.1.0",
+ "@radix-ui/react-focus-scope": "0.1.4",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-popper": "0.1.4",
+ "@radix-ui/react-portal": "0.1.4",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "^2.4.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0",
+ "react-dom": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-0.1.4.tgz",
+ "integrity": "sha512-18gDYof97t8UQa7zwklG1Dr8jIdj3u+rVOQLzPi9f5i1YQak/pVGkaqw8aY+iDUknKKuZniTk/7jbAJUYlKyOw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/popper": "0.1.0",
+ "@radix-ui/react-arrow": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-rect": "0.1.1",
+ "@radix-ui/react-use-size": "0.1.1",
+ "@radix-ui/rect": "0.1.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-0.1.4.tgz",
+ "integrity": "sha512-MO0wRy2eYRTZ/CyOri9NANCAtAtq89DEtg90gicaTlkCfdqCLEBsLb+/q66BZQTr3xX/Vq01nnVfc/TkCqoqvw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0",
+ "react-dom": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-0.1.2.tgz",
+ "integrity": "sha512-3BRlFZraooIUfRlyN+b/Xs5hq1lanOOo/+3h6Pwu2GMFjkGKKa4Rd51fcqGqnVlbr3jYg+WLuGyAV4KlgqwrQw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-0.1.4.tgz",
+ "integrity": "sha512-6gSl2IidySupIMJFjYnDIkIWRyQdbu/AHK7rbICPani+LW4b0XdxBXc46og/iZvuwW8pjCS8I2SadIerv84xYA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "0.1.2"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-0.1.5.tgz",
+ "integrity": "sha512-ClwKPS5JZE+PaHCoW7eu1onvE61pDv4kO8W4t5Ra3qMFQiTJLZMdpBQUhksN//DaVygoLirz4Samdr5Y1x1FSA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-collection": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-callback-ref": "0.1.0",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-0.1.2.tgz",
+ "integrity": "sha512-ADkqfL+agEzEguU3yS26jfB50hRrwf7U4VTwAOZEmi/g+ITcBWe12yM46ueS/UCIMI9Py+gFUaAdxgxafFvY2Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-tabs": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-0.1.5.tgz",
+ "integrity": "sha512-ieVQS1TFr0dX1XA8B+CsSFKOE7kcgEaNWWEfItxj9D1GZjn1o3WqPkW+FhQWDAWZLSKCH2PezYF3MNyO41lgJg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-roving-focus": "0.1.5",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-body-pointer-events": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-body-pointer-events/-/react-use-body-pointer-events-0.1.1.tgz",
+ "integrity": "sha512-R8leV2AWmJokTmERM8cMXFHWSiv/fzOLhG/JLmRBhLTAzOj37EQizssq4oW0Z29VcZy2tODMi9Pk/htxwb+xpA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-0.1.0.tgz",
+ "integrity": "sha512-Va041McOFFl+aV+sejvl0BS2aeHx86ND9X/rVFmEFQKTXCp6xgUK0NGUAGcgBlIjnJSbMYPGEk1xKSSlVcN2Aw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-0.1.0.tgz",
+ "integrity": "sha512-zv7CX/PgsRl46a52Tl45TwqwVJdmqnlQEQhaYMz/yBOD2sx2gCkCFSoF/z9mpnYWmS6DTLNTg5lIps3fV6EnXg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-direction": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-direction/-/react-use-direction-0.1.0.tgz",
+ "integrity": "sha512-NajpY/An9TCPSfOVkgWIdXJV+VuWl67PxB6kOKYmtNAFHvObzIoh8o0n9sAuwSAyFCZVq211FEf9gvVDRhOyiA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-0.1.0.tgz",
+ "integrity": "sha512-tDLZbTGFmvXaazUXXv8kYbiCcbAE8yKgng9s95d8fCO+Eundv0Jngbn/hKPhDDs4jj9ChwRX5cDDnlaN+ugYYQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-0.1.0.tgz",
+ "integrity": "sha512-+wdeS51Y+E1q1Wmd+1xSSbesZkpVj4jsg0BojCbopWvgq5iBvixw5vgemscdh58ep98BwUbsFYnrywFhV9yrVg==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-0.1.1.tgz",
+ "integrity": "sha512-kHNNXAsP3/PeszEmM/nxBBS9Jbo93sO+xuMTcRfwzXsmxT5gDXQzAiKbZQ0EecCPtJIzqvr7dlaQi/aP1PKYqQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/rect": "0.1.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-0.1.1.tgz",
+ "integrity": "sha512-pTgWM5qKBu6C7kfKxrKPoBI2zZYZmp2cSXzpUiGM3qEBQlMLtYhaY2JXdXUCxz+XmD1YEjc8oRwvyfsD4AG4WA==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "react": "^16.8 || ^17.0"
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-0.1.1.tgz",
+ "integrity": "sha512-g3hnE/UcOg7REdewduRPAK88EPuLZtaq7sA9ouu8S+YEtnyFRI16jgv6GZYe3VMoQLL1T171ebmEPtDjyxWLzw==",
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "node_modules/@supabase/gotrue-js": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.22.3.tgz",
+ "integrity": "sha512-w8PYtC23AQpPwwXDyd/YvEfp6O9a5Q50CGhFWNvnc6W82FayQluuJcpZ05K0rQktNvZzYxOkgOAFOm/+dvwrPQ==",
+ "dependencies": {
+ "cross-fetch": "^3.0.6"
+ }
+ },
+ "node_modules/@supabase/postgrest-js": {
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-0.36.2.tgz",
+ "integrity": "sha512-ZKQT+5ISWdsiSPDoVLnt/fiY82fUFw3lYLc2aMhx5tS3Zj6cChsWlK7NxH6ZZzo9Re/Pa/h4EoOzDZiDPywqxQ==",
+ "dependencies": {
+ "cross-fetch": "^3.0.6"
+ }
+ },
+ "node_modules/@supabase/realtime-js": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.3.6.tgz",
+ "integrity": "sha512-nkQv9A3Z6PgXl32rrQT+mG0oICSpTCTbjChh43GfSIaXXSZ10u5wMzaNqtp4jpqpyjwd8Zr2bDgwAo986T+xyw==",
+ "dependencies": {
+ "@types/websocket": "^1.0.3",
+ "websocket": "^1.0.34"
+ }
+ },
+ "node_modules/@supabase/storage-js": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-1.6.4.tgz",
+ "integrity": "sha512-vYcr1JGRf8Wr4v+lb8Ucl0bELwCZv8lT/PrYuhEKfJff6BI6/nTJp8rRZSRaDESQR8JlpaLaL+dmD/wsNqZnNQ==",
+ "dependencies": {
+ "cross-fetch": "^3.1.0"
+ }
+ },
+ "node_modules/@supabase/supabase-js": {
+ "version": "1.30.7",
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.30.7.tgz",
+ "integrity": "sha512-po1Bkkn3gYw31D3JytzcTuoQYnvBx5Cnyzy7MPnwtSEZbTIITkoy4es2iHDYuPMOjS9kAfUlfhHV3xRw3ZfIsA==",
+ "dependencies": {
+ "@supabase/gotrue-js": "^1.22.3",
+ "@supabase/postgrest-js": "^0.36.2",
+ "@supabase/realtime-js": "^1.3.6",
+ "@supabase/storage-js": "^1.6.4"
+ }
+ },
+ "node_modules/@supabase/ui": {
+ "version": "0.37.0-alpha.50",
+ "resolved": "https://registry.npmjs.org/@supabase/ui/-/ui-0.37.0-alpha.50.tgz",
+ "integrity": "sha512-d5jFxIVCRrZ6cHQ6qpuvyaexTmqMnxDWm0hg7vj9D2x5qcmySRCTC42uhpKXz5fKre2TUl38pFT+UpscWw/OyA==",
+ "dependencies": {
+ "@headlessui/react": "^1.0.0",
+ "@mertasan/tailwindcss-variables": "^2.0.1",
+ "@radix-ui/colors": "^0.1.8",
+ "@radix-ui/react-accordion": "^0.1.5",
+ "@radix-ui/react-collapsible": "^0.1.5",
+ "@radix-ui/react-context-menu": "^0.1.0",
+ "@radix-ui/react-dialog": "^0.1.5",
+ "@radix-ui/react-dropdown-menu": "^0.1.4",
+ "@radix-ui/react-popover": "^0.1.0",
+ "@radix-ui/react-portal": "^0.1.3",
+ "@radix-ui/react-tabs": "^0.1.0",
+ "@tailwindcss/forms": "^0.4.0",
+ "@tailwindcss/typography": "^0.5.0",
+ "autoprefixer": "^10.4.2",
+ "deepmerge": "^4.2.2",
+ "formik": "^2.2.9",
+ "lodash": "^4.17.20",
+ "postcss": "^8.4.5",
+ "prop-types": "^15.7.2",
+ "tailwindcss": "^3.0.15",
+ "tailwindcss-radix": "^1.6.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1 || ^17.0.1",
+ "react-dom": "^16.13.1 || ^17.0.1"
+ }
+ },
+ "node_modules/@tailwindcss/forms": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.4.1.tgz",
+ "integrity": "sha512-gS9xjCmJjUBz/eP12QlENPLnf0tCx68oYE3mri0GMP5jdtVwLbGUNSRpjsp6NzLAZzZy3ueOwrcqB78Ax6Z84A==",
+ "dependencies": {
+ "mini-svg-data-uri": "^1.2.3"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
+ }
+ },
+ "node_modules/@tailwindcss/typography": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.2.tgz",
+ "integrity": "sha512-coq8DBABRPFcVhVIk6IbKyyHUt7YTEC/C992tatFB+yEx5WGBQrCgsSFjxHUr8AWXphWckadVJbominEduYBqw==",
+ "dependencies": {
+ "lodash.castarray": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || insiders"
+ }
+ },
+ "node_modules/@types/classnames": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz",
+ "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==",
+ "deprecated": "This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.",
+ "dev": true,
+ "dependencies": {
+ "classnames": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz",
+ "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
+ "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*",
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "25.2.3",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.3.tgz",
+ "integrity": "sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw==",
+ "dev": true,
+ "dependencies": {
+ "jest-diff": "^25.2.1",
+ "pretty-format": "^25.2.1"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+ "dev": true
+ },
+ "node_modules/@types/marked": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.3.tgz",
+ "integrity": "sha512-HnMWQkLJEf/PnxZIfbm0yGJRRZYYMhb++O9M36UCTA9z53uPvVoSlAwJr3XOpDEryb7Hwl1qAx/MV6YIW1RXxg==",
+ "dev": true
+ },
+ "node_modules/@types/mdast": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
+ "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "14.18.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz",
+ "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==",
+ "dev": true
+ },
+ "node_modules/@types/nodemailer": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz",
+ "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+ },
+ "node_modules/@types/parse-numeric-range": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/parse-numeric-range/-/parse-numeric-range-0.0.1.tgz",
+ "integrity": "sha512-nI3rPGKk8BxedokP2VilnW5JyZHYNjGCUDsAZ2JQgISgDflHNUO0wXMfGYP8CkihrKYDm5tilD52XfGhO/ZFCA==",
+ "dev": true
+ },
+ "node_modules/@types/parse5": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz",
+ "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.4",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
+ "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
+ },
+ "node_modules/@types/react": {
+ "version": "16.14.23",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.23.tgz",
+ "integrity": "sha512-WngBZLuSkP4IAgPi0HOsGCHo6dn3CcuLQnCfC17VbA7YBgipZiZoTOhObwl/93DsFW0Y2a/ZXeonpW4DxirEJg==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-copy-to-clipboard": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-4.3.0.tgz",
+ "integrity": "sha512-iideNPRyroENqsOFh1i2Dv3zkviYS9r/9qD9Uh3Z9NNoAAqqa2x53i7iGndGNnJFIo20wIu7Hgh77tx1io8bgw==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "16.9.14",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.14.tgz",
+ "integrity": "sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "^16"
+ }
+ },
+ "node_modules/@types/react-syntax-highlighter": {
+ "version": "13.5.2",
+ "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.2.tgz",
+ "integrity": "sha512-sRZoKZBGKaE7CzMvTTgz+0x/aVR58ZYUTfB7HN76vC+yQnvo1FWtzNARBt0fGqcLGEVakEzMu/CtPzssmanu8Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
+ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="
+ },
+ "node_modules/@types/websocket": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz",
+ "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/websocket/node_modules/@types/node": {
+ "version": "17.0.21",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz",
+ "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
+ },
+ "node_modules/@types/yargs": {
+ "version": "15.0.14",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
+ "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "dependencies": {
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dependencies": {
+ "ansi-wrap": "0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
+ "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA=="
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.1.3.tgz",
+ "integrity": "sha512-RhVWFtKH5BiGMycI72q2RAFMLQi8JP9bLuQXgR5a8Znp7P5KOIADSJeyfI8PCVxLEp067B2HbP5JIiI/PXIZeA==",
+ "dependencies": {
+ "tslib": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.5.0"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz",
+ "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/autolinker": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz",
+ "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=",
+ "dependencies": {
+ "gulp-header": "^1.7.1"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.2",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
+ "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
+ "dependencies": {
+ "browserslist": "^4.19.1",
+ "caniuse-lite": "^1.0.30001297",
+ "fraction.js": "^4.1.2",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/babel-plugin-apply-mdx-type-prop": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz",
+ "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "7.10.4",
+ "@mdx-js/util": "1.6.22"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.6"
+ }
+ },
+ "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/babel-plugin-extract-import-names": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz",
+ "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "7.10.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
+ "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+ "dependencies": {
+ "@babel/compat-data": "^7.13.11",
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "semver": "^6.1.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
+ "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "core-js-compat": "^3.21.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+ "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/bail": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
+ "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.19.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
+ "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001312",
+ "electron-to-chromium": "^1.4.71",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.2",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/bufferutil": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz",
+ "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=6.14.2"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001313",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz",
+ "integrity": "sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
+ "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
+ "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
+ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
+ },
+ "node_modules/coffee-script": {
+ "version": "1.12.7",
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
+ "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
+ "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)",
+ "bin": {
+ "cake": "bin/cake",
+ "coffee": "bin/coffee"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/collapse-white-space": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
+ "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/concat-with-sourcemaps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/copy-to-clipboard": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
+ "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
+ "dependencies": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.21.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz",
+ "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==",
+ "dependencies": {
+ "browserslist": "^4.19.1",
+ "semver": "7.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+ "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cross-fetch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+ "dependencies": {
+ "node-fetch": "2.6.7"
+ }
+ },
+ "node_modules/css-blank-pseudo": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
+ "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.5"
+ },
+ "bin": {
+ "css-blank-pseudo": "cli.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/css-blank-pseudo/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/css-blank-pseudo/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/css-blank-pseudo/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-has-pseudo": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
+ "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.6",
+ "postcss-selector-parser": "^5.0.0-rc.4"
+ },
+ "bin": {
+ "css-has-pseudo": "cli.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/css-has-pseudo/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-has-pseudo/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-prefers-color-scheme": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
+ "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.5"
+ },
+ "bin": {
+ "css-prefers-color-scheme": "cli.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/css-prefers-color-scheme/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/css-prefers-color-scheme/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/css-prefers-color-scheme/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssdb": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
+ "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==",
+ "dev": true
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
+ "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
+ },
+ "node_modules/d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "dependencies": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz",
+ "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+ },
+ "node_modules/dequal": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
+ "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detab": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz",
+ "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==",
+ "dependencies": {
+ "repeat-string": "^1.5.4"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
+ "node_modules/detective": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
+ "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+ "dependencies": {
+ "acorn-node": "^1.6.1",
+ "defined": "^1.0.0",
+ "minimist": "^1.1.1"
+ },
+ "bin": {
+ "detective": "bin/detective.js"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/diacritics-map": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz",
+ "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68=",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
+ },
+ "node_modules/diff-sequences": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8.3"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+ "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/dom7": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
+ "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+ "dependencies": {
+ "ssr-window": "^3.0.0-alpha.1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
+ "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.76",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.76.tgz",
+ "integrity": "sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA=="
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+ "dependencies": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "dependencies": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dependencies": {
+ "fill-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-range/node_modules/fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "dependencies": {
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^3.0.0",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-range/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "node_modules/expand-range/node_modules/is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-range/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ext": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
+ "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
+ "dependencies": {
+ "type": "^2.5.0"
+ }
+ },
+ "node_modules/ext/node_modules/type": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
+ "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ=="
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flatten": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
+ "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==",
+ "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.",
+ "dev": true
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/formik": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
+ "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://opencollective.com/formik"
+ }
+ ],
+ "dependencies": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^1.10.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/formik/node_modules/deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz",
+ "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/github-slugger": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz",
+ "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ=="
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "12.2.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz",
+ "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==",
+ "dependencies": {
+ "array-union": "^3.0.1",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.7",
+ "ignore": "^5.1.9",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gray-matter": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
+ "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+ "dependencies": {
+ "js-yaml": "^3.13.1",
+ "kind-of": "^6.0.2",
+ "section-matter": "^1.0.0",
+ "strip-bom-string": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/gulp-header": {
+ "version": "1.8.12",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+ "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
+ "deprecated": "Removed event-stream from gulp-header",
+ "dependencies": {
+ "concat-with-sourcemaps": "*",
+ "lodash.template": "^4.4.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hast-to-hyperscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz",
+ "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==",
+ "dependencies": {
+ "@types/unist": "^2.0.3",
+ "comma-separated-tokens": "^1.0.0",
+ "property-information": "^5.3.0",
+ "space-separated-tokens": "^1.0.0",
+ "style-to-object": "^0.3.0",
+ "unist-util-is": "^4.0.0",
+ "web-namespaces": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-from-parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz",
+ "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==",
+ "dependencies": {
+ "@types/parse5": "^5.0.0",
+ "hastscript": "^6.0.0",
+ "property-information": "^5.0.0",
+ "vfile": "^4.0.0",
+ "vfile-location": "^3.2.0",
+ "web-namespaces": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-has-property": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz",
+ "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-heading-rank": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-1.0.1.tgz",
+ "integrity": "sha512-P6Hq7RCky9syMevlrN90QWpqWDXCxwIVOfQR2rK6P4GpY4bqjKEuCzoWSRORZ7vz+VgRpLnXimh+mkwvVFjbyQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz",
+ "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz",
+ "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "hast-util-from-parse5": "^6.0.0",
+ "hast-util-to-parse5": "^6.0.0",
+ "html-void-elements": "^1.0.0",
+ "parse5": "^6.0.0",
+ "unist-util-position": "^3.0.0",
+ "vfile": "^4.0.0",
+ "web-namespaces": "^1.0.0",
+ "xtend": "^4.0.0",
+ "zwitch": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-sanitize": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-2.0.3.tgz",
+ "integrity": "sha512-RILqWHmzU0Anmfw1KEP41LbCsJuJUVM0lQWAbTDk9+0bWqzRFXDaMdqIoRocLlOfR5NfcWyhFfZw/mGsuftwYA==",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-6.1.0.tgz",
+ "integrity": "sha512-IlC+LG2HGv0Y8js3wqdhg9O2sO4iVpRDbHOPwXd7qgeagpGsnY49i8yyazwqS35RA35WCzrBQE/n0M6GG/ewxA==",
+ "dependencies": {
+ "ccount": "^1.0.0",
+ "comma-separated-tokens": "^1.0.1",
+ "hast-util-is-element": "^1.0.0",
+ "hast-util-whitespace": "^1.0.0",
+ "html-void-elements": "^1.0.0",
+ "property-information": "^5.2.0",
+ "space-separated-tokens": "^1.0.0",
+ "stringify-entities": "^2.0.0",
+ "unist-util-is": "^3.0.0",
+ "xtend": "^4.0.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-html/node_modules/unist-util-is": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
+ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="
+ },
+ "node_modules/hast-util-to-parse5": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz",
+ "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==",
+ "dependencies": {
+ "hast-to-hyperscript": "^9.0.0",
+ "property-information": "^5.0.0",
+ "web-namespaces": "^1.0.0",
+ "xtend": "^4.0.0",
+ "zwitch": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-string": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz",
+ "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz",
+ "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/html-to-react": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.8.tgz",
+ "integrity": "sha512-BDOPUYTej5eiOco0V0wxJ5FS+Zckp2O0kb13X1SxQFzyusIeUmnxAK0Cl5M6692bmGBs1WBjh9qF3oQ2AJUZmg==",
+ "dependencies": {
+ "domhandler": "^4.0",
+ "htmlparser2": "^7.0",
+ "lodash.camelcase": "^4.3.0",
+ "ramda": "^0.28.0"
+ },
+ "peerDependencies": {
+ "react": "^16.0 || ^17.0"
+ }
+ },
+ "node_modules/html-void-elements": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz",
+ "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
+ "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.2",
+ "domutils": "^2.8.0",
+ "entities": "^3.0.1"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
+ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+ "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-plain-object/node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "node_modules/is-whitespace-character": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
+ "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-word-character": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
+ "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "node_modules/isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
+ "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^3.0.0",
+ "diff-sequences": "^25.2.6",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.5.0"
+ },
+ "engines": {
+ "node": ">= 8.3"
+ }
+ },
+ "node_modules/jest-diff/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-diff/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-diff/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jest-diff/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/jest-diff/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-diff/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8.3"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "dependencies": {
+ "set-getter": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
+ "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/list-item": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz",
+ "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=",
+ "dependencies": {
+ "expand-range": "^1.8.1",
+ "extend-shallow": "^2.0.1",
+ "is-number": "^2.1.0",
+ "repeat-string": "^1.5.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/list-item/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "node_modules/list-item/node_modules/is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/list-item/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
+ },
+ "node_modules/lodash.castarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+ "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
+ "node_modules/lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "dependencies": {
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.templatesettings": "^4.0.0"
+ }
+ },
+ "node_modules/lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+ "dependencies": {
+ "lodash._reinterpolate": "^3.0.0"
+ }
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+ },
+ "node_modules/longest-streak": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
+ "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+ "dependencies": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/markdown-escapes": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
+ "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/markdown-link": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz",
+ "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
+ "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
+ "dependencies": {
+ "repeat-string": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/markdown-toc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz",
+ "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==",
+ "dependencies": {
+ "concat-stream": "^1.5.2",
+ "diacritics-map": "^0.1.0",
+ "gray-matter": "^2.1.0",
+ "lazy-cache": "^2.0.2",
+ "list-item": "^1.1.1",
+ "markdown-link": "^0.1.1",
+ "minimist": "^1.2.0",
+ "mixin-deep": "^1.1.3",
+ "object.pick": "^1.2.0",
+ "remarkable": "^1.7.1",
+ "repeat-string": "^1.6.1",
+ "strip-color": "^0.1.0"
+ },
+ "bin": {
+ "markdown-toc": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/markdown-toc/node_modules/gray-matter": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz",
+ "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=",
+ "dependencies": {
+ "ansi-red": "^0.1.1",
+ "coffee-script": "^1.12.4",
+ "extend-shallow": "^2.0.1",
+ "js-yaml": "^3.8.1",
+ "toml": "^2.3.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/marked": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
+ "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/math-random": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A=="
+ },
+ "node_modules/mdast-add-list-metadata": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz",
+ "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==",
+ "dependencies": {
+ "unist-util-visit-parents": "1.1.2"
+ }
+ },
+ "node_modules/mdast-add-list-metadata/node_modules/unist-util-visit-parents": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz",
+ "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q=="
+ },
+ "node_modules/mdast-squeeze-paragraphs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz",
+ "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==",
+ "dependencies": {
+ "unist-util-remove": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-definitions": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
+ "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
+ "dependencies": {
+ "unist-util-visit": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz",
+ "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==",
+ "dependencies": {
+ "escape-string-regexp": "^4.0.0",
+ "unist-util-is": "^4.0.0",
+ "unist-util-visit-parents": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+ "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
+ "dependencies": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "micromark": "~2.11.0",
+ "parse-entities": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz",
+ "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==",
+ "dependencies": {
+ "mdast-util-gfm-autolink-literal": "^0.1.0",
+ "mdast-util-gfm-strikethrough": "^0.2.0",
+ "mdast-util-gfm-table": "^0.1.0",
+ "mdast-util-gfm-task-list-item": "^0.1.0",
+ "mdast-util-to-markdown": "^0.6.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz",
+ "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==",
+ "dependencies": {
+ "ccount": "^1.0.0",
+ "mdast-util-find-and-replace": "^1.1.0",
+ "micromark": "^2.11.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz",
+ "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==",
+ "dependencies": {
+ "mdast-util-to-markdown": "^0.6.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz",
+ "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==",
+ "dependencies": {
+ "markdown-table": "^2.0.0",
+ "mdast-util-to-markdown": "~0.6.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz",
+ "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==",
+ "dependencies": {
+ "mdast-util-to-markdown": "~0.6.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz",
+ "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==",
+ "dependencies": {
+ "@types/mdast": "^3.0.0",
+ "@types/unist": "^2.0.0",
+ "mdast-util-definitions": "^4.0.0",
+ "mdurl": "^1.0.0",
+ "unist-builder": "^2.0.0",
+ "unist-util-generated": "^1.0.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
+ "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+ "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz",
+ "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==",
+ "dependencies": {
+ "micromark": "~2.11.0",
+ "micromark-extension-gfm-autolink-literal": "~0.5.0",
+ "micromark-extension-gfm-strikethrough": "~0.6.5",
+ "micromark-extension-gfm-table": "~0.4.0",
+ "micromark-extension-gfm-tagfilter": "~0.3.0",
+ "micromark-extension-gfm-task-list-item": "~0.3.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz",
+ "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==",
+ "dependencies": {
+ "micromark": "~2.11.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz",
+ "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==",
+ "dependencies": {
+ "micromark": "~2.11.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz",
+ "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==",
+ "dependencies": {
+ "micromark": "~2.11.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz",
+ "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz",
+ "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==",
+ "dependencies": {
+ "micromark": "~2.11.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "dependencies": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mini-svg-data-uri": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz",
+ "integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==",
+ "bin": {
+ "mini-svg-data-uri": "cli.js"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mixin-deep/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
+ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/next": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-12.1.4.tgz",
+ "integrity": "sha512-DA4g97BM4Z0nKtDvCTm58RxdvoQyYzeg0AeVbh0N4Y/D8ELrNu47lQeEgRGF8hV4eQ+Sal90zxrJQQG/mPQ8CQ==",
+ "dependencies": {
+ "@next/env": "12.1.4",
+ "caniuse-lite": "^1.0.30001283",
+ "postcss": "8.4.5",
+ "styled-jsx": "5.0.1"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-android-arm-eabi": "12.1.4",
+ "@next/swc-android-arm64": "12.1.4",
+ "@next/swc-darwin-arm64": "12.1.4",
+ "@next/swc-darwin-x64": "12.1.4",
+ "@next/swc-linux-arm-gnueabihf": "12.1.4",
+ "@next/swc-linux-arm64-gnu": "12.1.4",
+ "@next/swc-linux-arm64-musl": "12.1.4",
+ "@next/swc-linux-x64-gnu": "12.1.4",
+ "@next/swc-linux-x64-musl": "12.1.4",
+ "@next/swc-win32-arm64-msvc": "12.1.4",
+ "@next/swc-win32-ia32-msvc": "12.1.4",
+ "@next/swc-win32-x64-msvc": "12.1.4"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^6.0.0 || ^7.0.0",
+ "react": "^17.0.2 || ^18.0.0-0",
+ "react-dom": "^17.0.2 || ^18.0.0-0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next-mdx-remote": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-2.1.4.tgz",
+ "integrity": "sha512-HHJasFVgPGjWXW3tWC37NCvHcQUOjJgVUMdwxgVbshwgtDLrGmupNkist/iamDLlvVibU52B9rqM9VAWofq7cA==",
+ "dependencies": {
+ "@babel/core": "^7.12.10",
+ "@babel/preset-env": "^7.12.11",
+ "@babel/preset-react": "^7.12.10",
+ "@babel/preset-typescript": "^7.12.7",
+ "@mdx-js/mdx": "^1.6.22",
+ "@mdx-js/react": "^1.6.22"
+ },
+ "peerDependencies": {
+ "react": ">=16.x <=17.x",
+ "react-dom": ">=16.x <=17.x"
+ }
+ },
+ "node_modules/next-mdx-remote/node_modules/@babel/core": {
+ "version": "7.17.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz",
+ "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==",
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.3",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helpers": "^7.17.2",
+ "@babel/parser": "^7.17.3",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.3",
+ "@babel/types": "^7.17.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.1.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/next-mdx-remote/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/next-seo": {
+ "version": "4.29.0",
+ "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-4.29.0.tgz",
+ "integrity": "sha512-xmwzcz4uHaYJ8glbuhs6FSBQ7z3irmdPYdJJ5saWm72Uy3o+mPKGaPCXQetTCE6/xxVnpoDV4yFtFlEjUcljSg==",
+ "peerDependencies": {
+ "next": "^8.1.1-canary.54 || >=9.0.0",
+ "react": ">=16.0.0",
+ "react-dom": ">=16.0.0"
+ }
+ },
+ "node_modules/next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.5",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+ "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+ "dependencies": {
+ "nanoid": "^3.1.30",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz",
+ "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg=="
+ },
+ "node_modules/nodemailer": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz",
+ "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+ "dev": true
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.pick/node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-numeric-range": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz",
+ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="
+ },
+ "node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz",
+ "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==",
+ "dependencies": {
+ "nanoid": "^3.3.1",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
+ "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^6.0.2"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-attribute-case-insensitive/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-color-functional-notation": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
+ "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-color-functional-notation/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-color-functional-notation/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-color-functional-notation/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-color-gray": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
+ "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
+ "dev": true,
+ "dependencies": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.5",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-color-gray/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-color-gray/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-color-gray/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
+ "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.14",
+ "postcss-values-parser": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-color-hex-alpha/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-color-mod-function": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
+ "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
+ "dev": true,
+ "dependencies": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-color-mod-function/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-color-mod-function/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-color-mod-function/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
+ "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-color-rebeccapurple/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-custom-media": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
+ "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.14"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-custom-media/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-custom-media/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-custom-media/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-custom-properties": {
+ "version": "8.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
+ "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.17",
+ "postcss-values-parser": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-custom-properties/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-custom-properties/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-custom-properties/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-custom-selectors": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
+ "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-custom-selectors/node_modules/cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-custom-selectors/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-custom-selectors/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-custom-selectors/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
+ "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-dir-pseudo-class/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-double-position-gradients": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
+ "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.5",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-double-position-gradients/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-double-position-gradients/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-double-position-gradients/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-env-function": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
+ "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-env-function/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-env-function/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-env-function/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-focus-visible": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
+ "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-focus-visible/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-focus-visible/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-focus-visible/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-focus-within": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
+ "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-focus-within/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-focus-within/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-focus-within/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-font-variant": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz",
+ "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "node_modules/postcss-font-variant/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-font-variant/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-font-variant/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-gap-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
+ "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-gap-properties/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-gap-properties/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-gap-properties/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-image-set-function": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
+ "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-image-set-function/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-image-set-function/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-image-set-function/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-initial": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz",
+ "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "node_modules/postcss-initial/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-initial/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-initial/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
+ "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-lab-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
+ "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
+ "dev": true,
+ "dependencies": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-lab-function/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-lab-function/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-lab-function/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz",
+ "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==",
+ "dependencies": {
+ "lilconfig": "^2.0.4",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
+ "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-logical/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-logical/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-logical/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-media-minmax": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
+ "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-media-minmax/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-media-minmax/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-media-minmax/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
+ "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.6"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
+ "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-nesting/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-nesting/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
+ "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-overflow-shorthand/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-page-break": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
+ "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "node_modules/postcss-page-break/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-page-break/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-page-break/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-place": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
+ "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-place/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-place/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-place/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-preset-env": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.1.tgz",
+ "integrity": "sha512-rlRkgX9t0v2On33n7TK8pnkcYOATGQSv48J2RS8GsXhqtg+xk6AummHP88Y5mJo0TLJelBjePvSjScTNkj3+qw==",
+ "dev": true,
+ "dependencies": {
+ "autoprefixer": "^9.6.1",
+ "browserslist": "^4.6.4",
+ "caniuse-lite": "^1.0.30000981",
+ "css-blank-pseudo": "^0.1.4",
+ "css-has-pseudo": "^0.10.0",
+ "css-prefers-color-scheme": "^3.1.1",
+ "cssdb": "^4.4.0",
+ "postcss": "^7.0.17",
+ "postcss-attribute-case-insensitive": "^4.0.1",
+ "postcss-color-functional-notation": "^2.0.1",
+ "postcss-color-gray": "^5.0.0",
+ "postcss-color-hex-alpha": "^5.0.3",
+ "postcss-color-mod-function": "^3.0.3",
+ "postcss-color-rebeccapurple": "^4.0.1",
+ "postcss-custom-media": "^7.0.8",
+ "postcss-custom-properties": "^8.0.11",
+ "postcss-custom-selectors": "^5.1.2",
+ "postcss-dir-pseudo-class": "^5.0.0",
+ "postcss-double-position-gradients": "^1.0.0",
+ "postcss-env-function": "^2.0.2",
+ "postcss-focus-visible": "^4.0.0",
+ "postcss-focus-within": "^3.0.0",
+ "postcss-font-variant": "^4.0.0",
+ "postcss-gap-properties": "^2.0.0",
+ "postcss-image-set-function": "^3.0.1",
+ "postcss-initial": "^3.0.0",
+ "postcss-lab-function": "^2.0.1",
+ "postcss-logical": "^3.0.0",
+ "postcss-media-minmax": "^4.0.0",
+ "postcss-nesting": "^7.0.0",
+ "postcss-overflow-shorthand": "^2.0.0",
+ "postcss-page-break": "^2.0.0",
+ "postcss-place": "^4.0.1",
+ "postcss-pseudo-class-any-link": "^6.0.0",
+ "postcss-replace-overflow-wrap": "^3.0.0",
+ "postcss-selector-matches": "^4.0.0",
+ "postcss-selector-not": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-preset-env/node_modules/autoprefixer": {
+ "version": "9.8.8",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
+ "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "picocolors": "^0.2.1",
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ },
+ "node_modules/postcss-preset-env/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-preset-env/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-preset-env/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
+ "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-pseudo-class-any-link/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
+ "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-replace-overflow-wrap/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-selector-matches": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
+ "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "postcss": "^7.0.2"
+ }
+ },
+ "node_modules/postcss-selector-matches/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-selector-matches/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-selector-matches/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-selector-not": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz",
+ "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "postcss": "^7.0.2"
+ }
+ },
+ "node_modules/postcss-selector-not/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "node_modules/postcss-selector-not/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-selector-not/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
+ "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "node_modules/postcss-values-parser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
+ "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
+ "dev": true,
+ "dependencies": {
+ "flatten": "^1.0.2",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6.14.4"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
+ "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
+ "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^25.5.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ },
+ "engines": {
+ "node": ">= 8.3"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/pretty-format/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ramda": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz",
+ "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ramda"
+ }
+ },
+ "node_modules/randomatic": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+ "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+ "dependencies": {
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "math-random": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/randomatic/node_modules/is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
+ "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-copy-to-clipboard": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz",
+ "integrity": "sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ==",
+ "dependencies": {
+ "copy-to-clipboard": "^3",
+ "prop-types": "^15.5.8"
+ },
+ "peerDependencies": {
+ "react": "^15.3.0 || ^16.0.0 || ^17.0.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
+ "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "scheduler": "^0.20.2"
+ },
+ "peerDependencies": {
+ "react": "17.0.2"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
+ "node_modules/react-ga": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.0.tgz",
+ "integrity": "sha512-o8RScHj6Lb8cwy3GMrVH6NJvL+y0zpJvKtc0+wmH7Bt23rszJmnqEQxRbyrqUzk9DTJIHoP42bfO5rswC9SWBQ==",
+ "peerDependencies": {
+ "prop-types": "^15.6.0",
+ "react": "^15.6.2 || ^16.0 || ^17"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-markdown": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-5.0.3.tgz",
+ "integrity": "sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w==",
+ "dependencies": {
+ "@types/mdast": "^3.0.3",
+ "@types/unist": "^2.0.3",
+ "html-to-react": "^1.3.4",
+ "mdast-add-list-metadata": "1.0.1",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.8.6",
+ "remark-parse": "^9.0.0",
+ "unified": "^9.0.0",
+ "unist-util-visit": "^2.0.0",
+ "xtend": "^4.0.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16",
+ "react": ">=16"
+ }
+ },
+ "node_modules/react-markdown/node_modules/remark-parse": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+ "dependencies": {
+ "mdast-util-from-markdown": "^0.8.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.4.tgz",
+ "integrity": "sha512-EyC5ohYhaeKbThMSQxuN2i+QC5HqV3AJvNZKEdiATITexu0gHm00+5ko0ltNS1ajYJVeDgVG2baRSCei0AUWlQ==",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.1.0",
+ "react-style-singleton": "^2.1.0",
+ "tslib": "^1.0.0",
+ "use-callback-ref": "^1.2.3",
+ "use-sidecar": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=8.5.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz",
+ "integrity": "sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg==",
+ "dependencies": {
+ "react-style-singleton": "^2.1.0",
+ "tslib": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.5.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0",
+ "react": "^16.8.0 || ^17.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz",
+ "integrity": "sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA==",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.5.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0",
+ "react": "^16.8.0 || ^17.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-syntax-highlighter": {
+ "version": "15.5.0",
+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz",
+ "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==",
+ "dependencies": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ },
+ "peerDependencies": {
+ "react": ">= 0.14.0"
+ }
+ },
+ "node_modules/react-tooltip": {
+ "version": "4.2.21",
+ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.21.tgz",
+ "integrity": "sha512-zSLprMymBDowknr0KVDiJ05IjZn9mQhhg4PRsqln0OZtURAJ1snt1xi5daZfagsh6vfsziZrc9pErPTDY1ACig==",
+ "dependencies": {
+ "prop-types": "^15.7.2",
+ "uuid": "^7.0.3"
+ },
+ "engines": {
+ "npm": ">=6.13"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0",
+ "react-dom": ">=16.0.0"
+ }
+ },
+ "node_modules/react-tooltip/node_modules/uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz",
+ "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "dependencies": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
+ "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz",
+ "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.0.1",
+ "regjsgen": "^0.6.0",
+ "regjsparser": "^0.8.2",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
+ "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA=="
+ },
+ "node_modules/regjsparser": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
+ "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/rehype-slug": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-4.0.1.tgz",
+ "integrity": "sha512-KIlJALf9WfHFF21icwTd2yI2IP+RQRweaxH9ChVGQwRYy36+hiomG4ZSe0yQRyCt+D/vE39LbAcOI/h4O4GPhA==",
+ "dependencies": {
+ "github-slugger": "^1.1.1",
+ "hast-util-has-property": "^1.0.0",
+ "hast-util-heading-rank": "^1.0.0",
+ "hast-util-to-string": "^1.0.0",
+ "unist-util-visit": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
+ "dependencies": {
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-footnotes": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz",
+ "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz",
+ "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==",
+ "dependencies": {
+ "mdast-util-gfm": "^0.1.0",
+ "micromark-extension-gfm": "^0.3.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-html": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-10.0.0.tgz",
+ "integrity": "sha512-TbSQuedRFjAhXSk1NAbfaTqDK0jKAjfgn82D2ZYFFT8XpJ80uwXc8yVwK/Tl2eqboTMPxzNzCIss4kIucE5M8w==",
+ "dependencies": {
+ "hast-util-sanitize": "^2.0.0",
+ "hast-util-to-html": "^6.0.0",
+ "mdast-util-to-hast": "^6.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "node_modules/remark-html/node_modules/mdast-util-definitions": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz",
+ "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==",
+ "dependencies": {
+ "unist-util-visit": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-html/node_modules/mdast-util-to-hast": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-6.0.2.tgz",
+ "integrity": "sha512-GjcOimC9qHI0yNFAQdBesrZXzUkRdFleQlcoU8+TVNfDW6oLUazUx8MgUoTaUyCJzBOnE5AOgqhpURrSlf0QwQ==",
+ "dependencies": {
+ "collapse-white-space": "^1.0.0",
+ "detab": "^2.0.0",
+ "mdast-util-definitions": "^1.2.0",
+ "mdurl": "^1.0.1",
+ "trim": "0.0.1",
+ "trim-lines": "^1.0.0",
+ "unist-builder": "^1.0.1",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "node_modules/remark-html/node_modules/unist-builder": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz",
+ "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==",
+ "dependencies": {
+ "object-assign": "^4.1.0"
+ }
+ },
+ "node_modules/remark-html/node_modules/unist-util-is": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
+ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="
+ },
+ "node_modules/remark-html/node_modules/unist-util-visit": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
+ "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
+ "dependencies": {
+ "unist-util-visit-parents": "^2.0.0"
+ }
+ },
+ "node_modules/remark-html/node_modules/unist-util-visit-parents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
+ "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
+ "dependencies": {
+ "unist-util-is": "^3.0.0"
+ }
+ },
+ "node_modules/remark-mdx": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz",
+ "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==",
+ "dependencies": {
+ "@babel/core": "7.12.9",
+ "@babel/helper-plugin-utils": "7.10.4",
+ "@babel/plugin-proposal-object-rest-spread": "7.12.1",
+ "@babel/plugin-syntax-jsx": "7.12.1",
+ "@mdx-js/util": "1.6.22",
+ "is-alphabetical": "1.0.4",
+ "remark-parse": "8.0.3",
+ "unified": "9.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+ },
+ "node_modules/remark-parse": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz",
+ "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==",
+ "dependencies": {
+ "ccount": "^1.0.0",
+ "collapse-white-space": "^1.0.2",
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "is-word-character": "^1.0.0",
+ "markdown-escapes": "^1.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "trim": "0.0.1",
+ "trim-trailing-lines": "^1.0.0",
+ "unherit": "^1.0.4",
+ "unist-util-remove-position": "^2.0.0",
+ "vfile-location": "^3.0.0",
+ "xtend": "^4.0.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-squeeze-paragraphs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz",
+ "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==",
+ "dependencies": {
+ "mdast-squeeze-paragraphs": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
+ "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
+ "dependencies": {
+ "mdast-util-to-markdown": "^0.6.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark/node_modules/remark-parse": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+ "dependencies": {
+ "mdast-util-from-markdown": "^0.8.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remarkable": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz",
+ "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==",
+ "dependencies": {
+ "argparse": "^1.0.10",
+ "autolinker": "~0.28.0"
+ },
+ "bin": {
+ "remarkable": "bin/remarkable.js"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/repeat-element": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+ "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "dependencies": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/scheduler": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+ "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/section-matter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
+ "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/set-getter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
+ "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==",
+ "dependencies": {
+ "to-object-path": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "node_modules/ssr-window": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
+ "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
+ },
+ "node_modules/state-toggle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
+ "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz",
+ "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==",
+ "dependencies": {
+ "character-entities-html4": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.2",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "node_modules/strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-color": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz",
+ "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz",
+ "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
+ "dependencies": {
+ "inline-style-parser": "0.1.1"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.1.tgz",
+ "integrity": "sha512-+PIZ/6Uk40mphiQJJI1202b+/dYeTVd9ZnMPR80pgiWbjIwvN2zIp4r9et0BgqBuShh48I0gttPlAXA7WVvBxw==",
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/swiper": {
+ "version": "6.8.4",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-6.8.4.tgz",
+ "integrity": "sha512-O+buF9Q+sMA0H7luMS8R59hCaJKlpo8PXhQ6ZYu6Rn2v9OsFd4d1jmrv14QvxtQpKAvL/ZiovEeANI/uDGet7g==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/vladimirkharlampidi"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "hasInstallScript": true,
+ "dependencies": {
+ "dom7": "^3.0.0",
+ "ssr-window": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 4.7.0"
+ }
+ },
+ "node_modules/swr": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-0.5.7.tgz",
+ "integrity": "sha512-Jh1Efgu8nWZV9rU4VLUMzBzcwaZgi4znqbVXvAtUy/0JzSiN6bNjLaJK8vhY/Rtp7a83dosz5YuehfBNwC/ZoQ==",
+ "dependencies": {
+ "dequal": "2.0.2"
+ },
+ "peerDependencies": {
+ "react": "^16.11.0 || ^17.0.0"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz",
+ "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==",
+ "dependencies": {
+ "arg": "^5.0.1",
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.3",
+ "color-name": "^1.1.4",
+ "cosmiconfig": "^7.0.1",
+ "detective": "^5.2.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^2.2.0",
+ "postcss": "^8.4.6",
+ "postcss-js": "^4.0.0",
+ "postcss-load-config": "^3.1.0",
+ "postcss-nested": "5.0.6",
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0",
+ "quick-lru": "^5.1.1",
+ "resolve": "^1.22.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ },
+ "peerDependencies": {
+ "autoprefixer": "^10.0.2",
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/tailwindcss-radix": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tailwindcss-radix/-/tailwindcss-radix-1.6.0.tgz",
+ "integrity": "sha512-5oBgGCVGsITMiUVlc6Euj4kt03l8htLJxVT9AXbkFxcJiXLtQxJriFq/8R+3s63OKit/ynCVdkqvlnW6H7iG1g=="
+ },
+ "node_modules/tailwindcss/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/tailwindcss/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-object-path/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "node_modules/to-object-path/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
+ },
+ "node_modules/toml": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz",
+ "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ=="
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ },
+ "node_modules/trim": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
+ "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
+ },
+ "node_modules/trim-lines": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz",
+ "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trim-trailing-lines": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz",
+ "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
+ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz",
+ "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unherit": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
+ "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
+ "dependencies": {
+ "inherits": "^2.0.0",
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unified": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
+ "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
+ "dependencies": {
+ "bail": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-buffer": "^2.0.0",
+ "is-plain-obj": "^2.0.0",
+ "trough": "^1.0.0",
+ "vfile": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "node_modules/unist-builder": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz",
+ "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-generated": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz",
+ "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
+ "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz",
+ "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==",
+ "dependencies": {
+ "unist-util-is": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove-position": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
+ "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
+ "dependencies": {
+ "unist-util-visit": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "dependencies": {
+ "@types/unist": "^2.0.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+ "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^4.0.0",
+ "unist-util-visit-parents": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
+ "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz",
+ "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==",
+ "engines": {
+ "node": ">=8.5.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0",
+ "react": "^16.8.0 || ^17.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-debounce": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-7.0.1.tgz",
+ "integrity": "sha512-fOrzIw2wstbAJuv8PC9Vg4XgwyTLEOdq4y/Z3IhVl8DAE4svRcgyEUvrEXu+BMNgMoc3YND6qLT61kkgEKXh7Q==",
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.5.tgz",
+ "integrity": "sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA==",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=8.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0"
+ }
+ },
+ "node_modules/utf-8-validate": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz",
+ "integrity": "sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-gyp-build": "^4.3.0"
+ },
+ "engines": {
+ "node": ">=6.14.2"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+ "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "is-buffer": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0",
+ "vfile-message": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-location": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
+ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/web-namespaces": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz",
+ "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ },
+ "node_modules/websocket": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
+ "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
+ "dependencies": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/websocket/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/websocket/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yaeti": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
+ "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=",
+ "engines": {
+ "node": ">=0.10.32"
+ }
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
+ "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.0"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
+ "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "requires": {
+ "@babel/highlight": "^7.16.7"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz",
+ "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng=="
+ },
+ "@babel/core": {
+ "version": "7.12.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz",
+ "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.9",
+ "@babel/types": "^7.12.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz",
+ "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==",
+ "requires": {
+ "@babel/types": "^7.17.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+ "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
+ "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz",
+ "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==",
+ "requires": {
+ "@babel/compat-data": "^7.16.4",
+ "@babel/helper-validator-option": "^7.16.7",
+ "browserslist": "^4.17.5",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/helper-create-class-features-plugin": {
+ "version": "7.17.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz",
+ "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7"
+ }
+ },
+ "@babel/helper-create-regexp-features-plugin": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz",
+ "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "regexpu-core": "^5.0.1"
+ }
+ },
+ "@babel/helper-define-polyfill-provider": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
+ "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.13.0",
+ "@babel/helper-module-imports": "^7.12.13",
+ "@babel/helper-plugin-utils": "^7.13.0",
+ "@babel/traverse": "^7.13.0",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
+ "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
+ "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
+ "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
+ "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
+ "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz",
+ "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+ "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.17.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz",
+ "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==",
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.3",
+ "@babel/types": "^7.17.0"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
+ "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+ "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA=="
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-wrap-function": "^7.16.8",
+ "@babel/types": "^7.16.8"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
+ "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-member-expression-to-functions": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/traverse": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz",
+ "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
+ "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
+ "requires": {
+ "@babel/types": "^7.16.0"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
+ "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "requires": {
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ=="
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
+ "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
+ "requires": {
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.16.8",
+ "@babel/types": "^7.16.8"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz",
+ "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==",
+ "requires": {
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.0",
+ "@babel/types": "^7.17.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.16.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
+ "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz",
+ "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA=="
+ },
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
+ "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
+ "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ }
+ },
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
+ "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-proposal-class-static-block": {
+ "version": "7.17.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz",
+ "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.17.6",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-dynamic-import": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
+ "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
+ "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-json-strings": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
+ "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
+ "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
+ "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
+ "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+ "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.12.1"
+ }
+ },
+ "@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
+ "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-optional-chaining": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
+ "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-private-methods": {
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
+ "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.16.10",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
+ "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
+ "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ }
+ },
+ "@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz",
+ "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-typescript": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
+ "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
+ "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
+ "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-remap-async-to-generator": "^7.16.8"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
+ "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
+ "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
+ "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-optimise-call-expression": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
+ "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz",
+ "integrity": "sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-dotall-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
+ "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
+ "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
+ "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
+ "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
+ "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
+ "requires": {
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
+ "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-member-expression-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
+ "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
+ "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz",
+ "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-simple-access": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-systemjs": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz",
+ "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==",
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-umd": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
+ "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
+ "requires": {
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
+ "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-new-target": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
+ "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
+ "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-replace-supers": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
+ "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-property-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
+ "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-react-display-name": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz",
+ "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-react-jsx": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz",
+ "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-jsx": "^7.16.7",
+ "@babel/types": "^7.17.0"
+ },
+ "dependencies": {
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
+ "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ }
+ }
+ },
+ "@babel/plugin-transform-react-jsx-development": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
+ "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
+ "requires": {
+ "@babel/plugin-transform-react-jsx": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
+ "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
+ "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
+ "requires": {
+ "regenerator-transform": "^0.14.2"
+ }
+ },
+ "@babel/plugin-transform-reserved-words": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
+ "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
+ "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
+ "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
+ "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
+ "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
+ "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-typescript": {
+ "version": "7.16.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz",
+ "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==",
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-typescript": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-unicode-escapes": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
+ "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
+ "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.16.11",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
+ "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
+ "requires": {
+ "@babel/compat-data": "^7.16.8",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
+ "@babel/plugin-proposal-class-static-block": "^7.16.7",
+ "@babel/plugin-proposal-dynamic-import": "^7.16.7",
+ "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
+ "@babel/plugin-proposal-json-strings": "^7.16.7",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.7",
+ "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.7",
+ "@babel/plugin-proposal-private-methods": "^7.16.11",
+ "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-transform-arrow-functions": "^7.16.7",
+ "@babel/plugin-transform-async-to-generator": "^7.16.8",
+ "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
+ "@babel/plugin-transform-block-scoping": "^7.16.7",
+ "@babel/plugin-transform-classes": "^7.16.7",
+ "@babel/plugin-transform-computed-properties": "^7.16.7",
+ "@babel/plugin-transform-destructuring": "^7.16.7",
+ "@babel/plugin-transform-dotall-regex": "^7.16.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.16.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
+ "@babel/plugin-transform-for-of": "^7.16.7",
+ "@babel/plugin-transform-function-name": "^7.16.7",
+ "@babel/plugin-transform-literals": "^7.16.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.16.7",
+ "@babel/plugin-transform-modules-amd": "^7.16.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.16.8",
+ "@babel/plugin-transform-modules-systemjs": "^7.16.7",
+ "@babel/plugin-transform-modules-umd": "^7.16.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
+ "@babel/plugin-transform-new-target": "^7.16.7",
+ "@babel/plugin-transform-object-super": "^7.16.7",
+ "@babel/plugin-transform-parameters": "^7.16.7",
+ "@babel/plugin-transform-property-literals": "^7.16.7",
+ "@babel/plugin-transform-regenerator": "^7.16.7",
+ "@babel/plugin-transform-reserved-words": "^7.16.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.16.7",
+ "@babel/plugin-transform-spread": "^7.16.7",
+ "@babel/plugin-transform-sticky-regex": "^7.16.7",
+ "@babel/plugin-transform-template-literals": "^7.16.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.16.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.16.7",
+ "@babel/plugin-transform-unicode-regex": "^7.16.7",
+ "@babel/preset-modules": "^0.1.5",
+ "@babel/types": "^7.16.8",
+ "babel-plugin-polyfill-corejs2": "^0.3.0",
+ "babel-plugin-polyfill-corejs3": "^0.5.0",
+ "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "core-js-compat": "^3.20.2",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz",
+ "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==",
+ "requires": {
+ "@babel/compat-data": "^7.17.0",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.16.7"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "@babel/preset-modules": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+ "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
+ "@babel/preset-react": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
+ "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-transform-react-display-name": "^7.16.7",
+ "@babel/plugin-transform-react-jsx": "^7.16.7",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.7",
+ "@babel/plugin-transform-react-pure-annotations": "^7.16.7"
+ }
+ },
+ "@babel/preset-typescript": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz",
+ "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-validator-option": "^7.16.7",
+ "@babel/plugin-transform-typescript": "^7.16.7"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz",
+ "integrity": "sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==",
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.16.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
+ "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+ "requires": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/parser": "^7.16.7",
+ "@babel/types": "^7.16.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.17.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
+ "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
+ "requires": {
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.3",
+ "@babel/helper-environment-visitor": "^7.16.7",
+ "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-hoist-variables": "^7.16.7",
+ "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/parser": "^7.17.3",
+ "@babel/types": "^7.17.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.17.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz",
+ "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.16.7",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@csstools/convert-colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
+ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==",
+ "dev": true
+ },
+ "@headlessui/react": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.5.0.tgz",
+ "integrity": "sha512-aaRnYxBb3MU2FNJf3Ut9RMTUqqU3as0aI1lQhgo2n9Fa67wRu14iOGqx93xB+uMNVfNwZ5B3y/Ndm7qZGuFeMQ==",
+ "requires": {}
+ },
+ "@heroicons/react": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz",
+ "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==",
+ "requires": {}
+ },
+ "@jest/types": {
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
+ "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
+ "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew=="
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
+ "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg=="
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz",
+ "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==",
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@mdx-js/loader": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-1.6.22.tgz",
+ "integrity": "sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q==",
+ "requires": {
+ "@mdx-js/mdx": "1.6.22",
+ "@mdx-js/react": "1.6.22",
+ "loader-utils": "2.0.0"
+ }
+ },
+ "@mdx-js/mdx": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz",
+ "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==",
+ "requires": {
+ "@babel/core": "7.12.9",
+ "@babel/plugin-syntax-jsx": "7.12.1",
+ "@babel/plugin-syntax-object-rest-spread": "7.8.3",
+ "@mdx-js/util": "1.6.22",
+ "babel-plugin-apply-mdx-type-prop": "1.6.22",
+ "babel-plugin-extract-import-names": "1.6.22",
+ "camelcase-css": "2.0.1",
+ "detab": "2.0.4",
+ "hast-util-raw": "6.0.1",
+ "lodash.uniq": "4.5.0",
+ "mdast-util-to-hast": "10.0.1",
+ "remark-footnotes": "2.0.0",
+ "remark-mdx": "1.6.22",
+ "remark-parse": "8.0.3",
+ "remark-squeeze-paragraphs": "4.0.0",
+ "style-to-object": "0.3.0",
+ "unified": "9.2.0",
+ "unist-builder": "2.0.3",
+ "unist-util-visit": "2.0.3"
+ }
+ },
+ "@mdx-js/react": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz",
+ "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==",
+ "requires": {}
+ },
+ "@mdx-js/util": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz",
+ "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA=="
+ },
+ "@mertasan/tailwindcss-variables": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@mertasan/tailwindcss-variables/-/tailwindcss-variables-2.0.1.tgz",
+ "integrity": "sha512-B2ViH/sfiLMzQKAAHQK5fbghnPI9YeOmwbTHNK1e75Dgt6/FQoUQnP7zUBSpvYFq67GReUfd7XneqAIAmlgw8Q==",
+ "requires": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "@next/env": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.4.tgz",
+ "integrity": "sha512-7gQwotJDKnfMxxXd8xJ2vsX5AzyDxO3zou0+QOXX8/unypA6icw5+wf6A62yKZ6qQ4UZHHxS68pb6UV+wNneXg=="
+ },
+ "@next/mdx": {
+ "version": "10.2.3",
+ "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-10.2.3.tgz",
+ "integrity": "sha512-hseekptFqOCxLbdaNDS/yelaG2Q2uaNDilnRjq8Uv/LWHuZ9F2cp7ndwTolW9acJsbDedamKRMgdw4V2Fz0pUA==",
+ "requires": {}
+ },
+ "@next/swc-android-arm-eabi": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.4.tgz",
+ "integrity": "sha512-FJg/6a3s2YrUaqZ+/DJZzeZqfxbbWrynQMT1C5wlIEq9aDLXCFpPM/PiOyJh0ahxc0XPmi6uo38Poq+GJTuKWw==",
+ "optional": true
+ },
+ "@next/swc-android-arm64": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.4.tgz",
+ "integrity": "sha512-LXraazvQQFBgxIg3Htny6G5V5he9EK7oS4jWtMdTGIikmD/OGByOv8ZjLuVLZLtVm3UIvaAiGtlQSLecxJoJDw==",
+ "optional": true
+ },
+ "@next/swc-darwin-arm64": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.4.tgz",
+ "integrity": "sha512-SSST/dBymecllZxcqTCcSTCu5o1NKk9I+xcvhn/O9nH6GWjgvGgGkNqLbCarCa0jJ1ukvlBA138FagyrmZ/4rQ==",
+ "optional": true
+ },
+ "@next/swc-darwin-x64": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.4.tgz",
+ "integrity": "sha512-p1lwdX0TVjaoDXQVuAkjtxVBbCL/urgxiMCBwuPDO7TikpXtSRivi+mIzBj5q7ypgICFmIAOW3TyupXeoPRAnA==",
+ "optional": true
+ },
+ "@next/swc-linux-arm-gnueabihf": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.4.tgz",
+ "integrity": "sha512-67PZlgkCn3TDxacdVft0xqDCL7Io1/C4xbAs0+oSQ0xzp6OzN2RNpuKjHJrJgKd0DsE1XZ9sCP27Qv0591yfyg==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-gnu": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.4.tgz",
+ "integrity": "sha512-OnOWixhhw7aU22TQdQLYrgpgFq0oA1wGgnjAiHJ+St7MLj82KTDyM9UcymAMbGYy6nG/TFOOHdTmRMtCRNOw0g==",
+ "optional": true
+ },
+ "@next/swc-linux-arm64-musl": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.4.tgz",
+ "integrity": "sha512-UoRMzPZnsAavdWtVylYxH8DNC7Uy0i6RrvNwT4PyQVdfANBn2omsUkcH5lgS2O7oaz0nAYLk1vqyZDO7+tJotA==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-gnu": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.4.tgz",
+ "integrity": "sha512-nM+MA/frxlTLUKLJKorctdI20/ugfHRjVEEkcLp/58LGG7slNaP1E5d5dRA1yX6ISjPcQAkywas5VlGCg+uTvA==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-musl": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.4.tgz",
+ "integrity": "sha512-GoRHxkuW4u4yKw734B9SzxJwVdyEJosaZ62P7ifOwcujTxhgBt3y76V2nNUrsSuopcKI2ZTDjaa+2wd5zyeXbA==",
+ "optional": true
+ },
+ "@next/swc-win32-arm64-msvc": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.4.tgz",
+ "integrity": "sha512-6TQkQze0ievXwHJcVUrIULwCYVe3ccX6T0JgZ1SiMeXpHxISN7VJF/O8uSCw1JvXZYZ6ud0CJ7nfC5HXivgfPg==",
+ "optional": true
+ },
+ "@next/swc-win32-ia32-msvc": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.4.tgz",
+ "integrity": "sha512-CsbX/IXuZ5VSmWCpSetG2HD6VO5FTsO39WNp2IR2Ut/uom9XtLDJAZqjQEnbUTLGHuwDKFjrIO3LkhtROXLE/g==",
+ "optional": true
+ },
+ "@next/swc-win32-x64-msvc": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.4.tgz",
+ "integrity": "sha512-JtYuWzKXKLDMgE/xTcFtCm1MiCIRaAc5XYZfYX3n/ZWSI1SJS/GMm+Su0SAHJgRFavJh6U/p998YwO/iGTIgqQ==",
+ "optional": true
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@radix-ui/colors": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz",
+ "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw=="
+ },
+ "@radix-ui/popper": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/popper/-/popper-0.1.0.tgz",
+ "integrity": "sha512-uzYeElL3w7SeNMuQpXiFlBhTT+JyaNMCwDfjKkrzugEcYrf5n52PHqncNdQPUtR42hJh8V9FsqyEDbDxkeNjJQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "csstype": "^3.0.4"
+ }
+ },
+ "@radix-ui/primitive": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-0.1.0.tgz",
+ "integrity": "sha512-tqxZKybwN5Fa3VzZry4G6mXAAb9aAqKmPtnVbZpL0vsBwvOHTBwsjHVPXylocYLwEtBY9SCe665bYnNB515uoA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-accordion": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-0.1.6.tgz",
+ "integrity": "sha512-LOXlqPU6y6EMBopdRIKCWFvMPY1wPTQ4uJiX7ZVxldrMJcM7imBzI3wlRTkPCHZ3FLHmpuw+cQi3du23pzJp1g==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-collapsible": "0.1.6",
+ "@radix-ui/react-collection": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ }
+ },
+ "@radix-ui/react-arrow": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-0.1.4.tgz",
+ "integrity": "sha512-BB6XzAb7Ml7+wwpFdYVtZpK1BlMgqyafSQNGzhIpSZ4uXvXOHPlR5GP8M449JkeQzgQjv9Mp1AsJxFC0KuOtuA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "0.1.4"
+ }
+ },
+ "@radix-ui/react-collapsible": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-0.1.6.tgz",
+ "integrity": "sha512-Gkf8VuqMc6HTLzA2AxVYnyK6aMczVLpatCjdD9Lj4wlYLXCz9KtiqZYslLMeqnQFLwLyZS0WKX/pQ8j5fioIBw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ }
+ },
+ "@radix-ui/react-collection": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-0.1.4.tgz",
+ "integrity": "sha512-3muGI15IdgaDFjOcO7xX8a35HQRBRF6LH9pS6UCeZeRmbslkVeHyJRQr2rzICBUoX7zgIA0kXyMDbpQnJGyJTA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-slot": "0.1.2"
+ }
+ },
+ "@radix-ui/react-compose-refs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-0.1.0.tgz",
+ "integrity": "sha512-eyclbh+b77k+69Dk72q3694OHrn9B3QsoIRx7ywX341U9RK1ThgQjMFZoPtmZNQTksXHLNEiefR8hGVeFyInGg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-context": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-0.1.1.tgz",
+ "integrity": "sha512-PkyVX1JsLBioeu0jB9WvRpDBBLtLZohVDT3BB5CTSJqActma8S8030P57mWZb4baZifMvN7KKWPAA40UmWKkQg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-context-menu": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-0.1.6.tgz",
+ "integrity": "sha512-0qa6ABaeqD+WYI+8iT0jH0QLLcV8Kv0xI+mZL4FFnG4ec9H0v+yngb5cfBBfs9e/KM8mDzFFpaeegqsQlLNqyQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-menu": "0.1.6",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ }
+ },
+ "@radix-ui/react-dialog": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-0.1.7.tgz",
+ "integrity": "sha512-jXt8srGhHBRvEr9jhEAiwwJzWCWZoGRJ030aC9ja/gkRJbZdy0iD3FwXf+Ff4RtsZyLUMHW7VUwFOlz3Ixe1Vw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-dismissable-layer": "0.1.5",
+ "@radix-ui/react-focus-guards": "0.1.0",
+ "@radix-ui/react-focus-scope": "0.1.4",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-portal": "0.1.4",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-slot": "0.1.2",
+ "@radix-ui/react-use-controllable-state": "0.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "^2.4.0"
+ }
+ },
+ "@radix-ui/react-dismissable-layer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-0.1.5.tgz",
+ "integrity": "sha512-J+fYWijkX4M4QKwf9dtu1oC0U6e6CEl8WhBp3Ad23yz2Hia0XCo6Pk/mp5CAFy4QBtQedTSkhW05AdtSOEoajQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-body-pointer-events": "0.1.1",
+ "@radix-ui/react-use-callback-ref": "0.1.0",
+ "@radix-ui/react-use-escape-keydown": "0.1.0"
+ }
+ },
+ "@radix-ui/react-dropdown-menu": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-0.1.6.tgz",
+ "integrity": "sha512-RZhtzjWwJ4ZBN7D8ek4Zn+ilHzYuYta9yIxFnbC0pfqMnSi67IQNONo1tuuNqtFh9SRHacPKc65zo+kBBlxtdg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-menu": "0.1.6",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ }
+ },
+ "@radix-ui/react-focus-guards": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-0.1.0.tgz",
+ "integrity": "sha512-kRx/swAjEfBpQ3ns7J3H4uxpXuWCqN7MpALiSDOXiyo2vkWv0L9sxvbpZeTulINuE3CGMzicVMuNc/VWXjFKOg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-focus-scope": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-0.1.4.tgz",
+ "integrity": "sha512-fbA4ES3H4Wkxp+OeLhvN6SwL7mXNn/aBtUf7DRYxY9+Akrf7dRxl2ck4lgcpPsSg3zSDsEwLcY+h5cmj5yvlug==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ }
+ },
+ "@radix-ui/react-id": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-0.1.5.tgz",
+ "integrity": "sha512-IPc4H/63bes0IZ1GJJozSEkSWcDyhNGtKFWUpJ+XtaLyQ1X3x7Mf6fWwWhDcpqlYEP+5WtAvfqcyEsyjP+ZhBQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ }
+ },
+ "@radix-ui/react-menu": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-0.1.6.tgz",
+ "integrity": "sha512-ho3+bhpr3oAFkOBJ8VkUb1BcGoiZBB3OmcWPqa6i5RTUKrzNX/d6rauochu2xDlWjiRtpVuiAcsTVOeIC4FbYQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-collection": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-dismissable-layer": "0.1.5",
+ "@radix-ui/react-focus-guards": "0.1.0",
+ "@radix-ui/react-focus-scope": "0.1.4",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-popper": "0.1.4",
+ "@radix-ui/react-portal": "0.1.4",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-roving-focus": "0.1.5",
+ "@radix-ui/react-use-callback-ref": "0.1.0",
+ "@radix-ui/react-use-direction": "0.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "^2.4.0"
+ }
+ },
+ "@radix-ui/react-popover": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-0.1.6.tgz",
+ "integrity": "sha512-zQzgUqW4RQDb0ItAL1xNW4K4olUrkfV3jeEPs9rG+nsDQurO+W9TT+YZ9H1mmgAJqlthyv1sBRZGdBm4YjtD6Q==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-dismissable-layer": "0.1.5",
+ "@radix-ui/react-focus-guards": "0.1.0",
+ "@radix-ui/react-focus-scope": "0.1.4",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-popper": "0.1.4",
+ "@radix-ui/react-portal": "0.1.4",
+ "@radix-ui/react-presence": "0.1.2",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-controllable-state": "0.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "^2.4.0"
+ }
+ },
+ "@radix-ui/react-popper": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-0.1.4.tgz",
+ "integrity": "sha512-18gDYof97t8UQa7zwklG1Dr8jIdj3u+rVOQLzPi9f5i1YQak/pVGkaqw8aY+iDUknKKuZniTk/7jbAJUYlKyOw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/popper": "0.1.0",
+ "@radix-ui/react-arrow": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-rect": "0.1.1",
+ "@radix-ui/react-use-size": "0.1.1",
+ "@radix-ui/rect": "0.1.1"
+ }
+ },
+ "@radix-ui/react-portal": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-0.1.4.tgz",
+ "integrity": "sha512-MO0wRy2eYRTZ/CyOri9NANCAtAtq89DEtg90gicaTlkCfdqCLEBsLb+/q66BZQTr3xX/Vq01nnVfc/TkCqoqvw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ }
+ },
+ "@radix-ui/react-presence": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-0.1.2.tgz",
+ "integrity": "sha512-3BRlFZraooIUfRlyN+b/Xs5hq1lanOOo/+3h6Pwu2GMFjkGKKa4Rd51fcqGqnVlbr3jYg+WLuGyAV4KlgqwrQw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ }
+ },
+ "@radix-ui/react-primitive": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-0.1.4.tgz",
+ "integrity": "sha512-6gSl2IidySupIMJFjYnDIkIWRyQdbu/AHK7rbICPani+LW4b0XdxBXc46og/iZvuwW8pjCS8I2SadIerv84xYA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-slot": "0.1.2"
+ }
+ },
+ "@radix-ui/react-roving-focus": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-0.1.5.tgz",
+ "integrity": "sha512-ClwKPS5JZE+PaHCoW7eu1onvE61pDv4kO8W4t5Ra3qMFQiTJLZMdpBQUhksN//DaVygoLirz4Samdr5Y1x1FSA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-collection": "0.1.4",
+ "@radix-ui/react-compose-refs": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-use-callback-ref": "0.1.0",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ }
+ },
+ "@radix-ui/react-slot": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-0.1.2.tgz",
+ "integrity": "sha512-ADkqfL+agEzEguU3yS26jfB50hRrwf7U4VTwAOZEmi/g+ITcBWe12yM46ueS/UCIMI9Py+gFUaAdxgxafFvY2Q==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-compose-refs": "0.1.0"
+ }
+ },
+ "@radix-ui/react-tabs": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-0.1.5.tgz",
+ "integrity": "sha512-ieVQS1TFr0dX1XA8B+CsSFKOE7kcgEaNWWEfItxj9D1GZjn1o3WqPkW+FhQWDAWZLSKCH2PezYF3MNyO41lgJg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/primitive": "0.1.0",
+ "@radix-ui/react-context": "0.1.1",
+ "@radix-ui/react-id": "0.1.5",
+ "@radix-ui/react-primitive": "0.1.4",
+ "@radix-ui/react-roving-focus": "0.1.5",
+ "@radix-ui/react-use-controllable-state": "0.1.0"
+ }
+ },
+ "@radix-ui/react-use-body-pointer-events": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-body-pointer-events/-/react-use-body-pointer-events-0.1.1.tgz",
+ "integrity": "sha512-R8leV2AWmJokTmERM8cMXFHWSiv/fzOLhG/JLmRBhLTAzOj37EQizssq4oW0Z29VcZy2tODMi9Pk/htxwb+xpA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-layout-effect": "0.1.0"
+ }
+ },
+ "@radix-ui/react-use-callback-ref": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-0.1.0.tgz",
+ "integrity": "sha512-Va041McOFFl+aV+sejvl0BS2aeHx86ND9X/rVFmEFQKTXCp6xgUK0NGUAGcgBlIjnJSbMYPGEk1xKSSlVcN2Aw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-use-controllable-state": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-0.1.0.tgz",
+ "integrity": "sha512-zv7CX/PgsRl46a52Tl45TwqwVJdmqnlQEQhaYMz/yBOD2sx2gCkCFSoF/z9mpnYWmS6DTLNTg5lIps3fV6EnXg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ }
+ },
+ "@radix-ui/react-use-direction": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-direction/-/react-use-direction-0.1.0.tgz",
+ "integrity": "sha512-NajpY/An9TCPSfOVkgWIdXJV+VuWl67PxB6kOKYmtNAFHvObzIoh8o0n9sAuwSAyFCZVq211FEf9gvVDRhOyiA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-use-escape-keydown": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-0.1.0.tgz",
+ "integrity": "sha512-tDLZbTGFmvXaazUXXv8kYbiCcbAE8yKgng9s95d8fCO+Eundv0Jngbn/hKPhDDs4jj9ChwRX5cDDnlaN+ugYYQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/react-use-callback-ref": "0.1.0"
+ }
+ },
+ "@radix-ui/react-use-layout-effect": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-0.1.0.tgz",
+ "integrity": "sha512-+wdeS51Y+E1q1Wmd+1xSSbesZkpVj4jsg0BojCbopWvgq5iBvixw5vgemscdh58ep98BwUbsFYnrywFhV9yrVg==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/react-use-rect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-0.1.1.tgz",
+ "integrity": "sha512-kHNNXAsP3/PeszEmM/nxBBS9Jbo93sO+xuMTcRfwzXsmxT5gDXQzAiKbZQ0EecCPtJIzqvr7dlaQi/aP1PKYqQ==",
+ "requires": {
+ "@babel/runtime": "^7.13.10",
+ "@radix-ui/rect": "0.1.1"
+ }
+ },
+ "@radix-ui/react-use-size": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-0.1.1.tgz",
+ "integrity": "sha512-pTgWM5qKBu6C7kfKxrKPoBI2zZYZmp2cSXzpUiGM3qEBQlMLtYhaY2JXdXUCxz+XmD1YEjc8oRwvyfsD4AG4WA==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@radix-ui/rect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-0.1.1.tgz",
+ "integrity": "sha512-g3hnE/UcOg7REdewduRPAK88EPuLZtaq7sA9ouu8S+YEtnyFRI16jgv6GZYe3VMoQLL1T171ebmEPtDjyxWLzw==",
+ "requires": {
+ "@babel/runtime": "^7.13.10"
+ }
+ },
+ "@supabase/gotrue-js": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.22.3.tgz",
+ "integrity": "sha512-w8PYtC23AQpPwwXDyd/YvEfp6O9a5Q50CGhFWNvnc6W82FayQluuJcpZ05K0rQktNvZzYxOkgOAFOm/+dvwrPQ==",
+ "requires": {
+ "cross-fetch": "^3.0.6"
+ }
+ },
+ "@supabase/postgrest-js": {
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-0.36.2.tgz",
+ "integrity": "sha512-ZKQT+5ISWdsiSPDoVLnt/fiY82fUFw3lYLc2aMhx5tS3Zj6cChsWlK7NxH6ZZzo9Re/Pa/h4EoOzDZiDPywqxQ==",
+ "requires": {
+ "cross-fetch": "^3.0.6"
+ }
+ },
+ "@supabase/realtime-js": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.3.6.tgz",
+ "integrity": "sha512-nkQv9A3Z6PgXl32rrQT+mG0oICSpTCTbjChh43GfSIaXXSZ10u5wMzaNqtp4jpqpyjwd8Zr2bDgwAo986T+xyw==",
+ "requires": {
+ "@types/websocket": "^1.0.3",
+ "websocket": "^1.0.34"
+ }
+ },
+ "@supabase/storage-js": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-1.6.4.tgz",
+ "integrity": "sha512-vYcr1JGRf8Wr4v+lb8Ucl0bELwCZv8lT/PrYuhEKfJff6BI6/nTJp8rRZSRaDESQR8JlpaLaL+dmD/wsNqZnNQ==",
+ "requires": {
+ "cross-fetch": "^3.1.0"
+ }
+ },
+ "@supabase/supabase-js": {
+ "version": "1.30.7",
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.30.7.tgz",
+ "integrity": "sha512-po1Bkkn3gYw31D3JytzcTuoQYnvBx5Cnyzy7MPnwtSEZbTIITkoy4es2iHDYuPMOjS9kAfUlfhHV3xRw3ZfIsA==",
+ "requires": {
+ "@supabase/gotrue-js": "^1.22.3",
+ "@supabase/postgrest-js": "^0.36.2",
+ "@supabase/realtime-js": "^1.3.6",
+ "@supabase/storage-js": "^1.6.4"
+ }
+ },
+ "@supabase/ui": {
+ "version": "0.37.0-alpha.50",
+ "resolved": "https://registry.npmjs.org/@supabase/ui/-/ui-0.37.0-alpha.50.tgz",
+ "integrity": "sha512-d5jFxIVCRrZ6cHQ6qpuvyaexTmqMnxDWm0hg7vj9D2x5qcmySRCTC42uhpKXz5fKre2TUl38pFT+UpscWw/OyA==",
+ "requires": {
+ "@headlessui/react": "^1.0.0",
+ "@mertasan/tailwindcss-variables": "^2.0.1",
+ "@radix-ui/colors": "^0.1.8",
+ "@radix-ui/react-accordion": "^0.1.5",
+ "@radix-ui/react-collapsible": "^0.1.5",
+ "@radix-ui/react-context-menu": "^0.1.0",
+ "@radix-ui/react-dialog": "^0.1.5",
+ "@radix-ui/react-dropdown-menu": "^0.1.4",
+ "@radix-ui/react-popover": "^0.1.0",
+ "@radix-ui/react-portal": "^0.1.3",
+ "@radix-ui/react-tabs": "^0.1.0",
+ "@tailwindcss/forms": "^0.4.0",
+ "@tailwindcss/typography": "^0.5.0",
+ "autoprefixer": "^10.4.2",
+ "deepmerge": "^4.2.2",
+ "formik": "^2.2.9",
+ "fsevents": "^2.3.2",
+ "lodash": "^4.17.20",
+ "postcss": "^8.4.5",
+ "prop-types": "^15.7.2",
+ "tailwindcss": "^3.0.15",
+ "tailwindcss-radix": "^1.6.0"
+ }
+ },
+ "@tailwindcss/forms": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.4.1.tgz",
+ "integrity": "sha512-gS9xjCmJjUBz/eP12QlENPLnf0tCx68oYE3mri0GMP5jdtVwLbGUNSRpjsp6NzLAZzZy3ueOwrcqB78Ax6Z84A==",
+ "requires": {
+ "mini-svg-data-uri": "^1.2.3"
+ }
+ },
+ "@tailwindcss/typography": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.2.tgz",
+ "integrity": "sha512-coq8DBABRPFcVhVIk6IbKyyHUt7YTEC/C992tatFB+yEx5WGBQrCgsSFjxHUr8AWXphWckadVJbominEduYBqw==",
+ "requires": {
+ "lodash.castarray": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2"
+ }
+ },
+ "@types/classnames": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz",
+ "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==",
+ "dev": true,
+ "requires": {
+ "classnames": "*"
+ }
+ },
+ "@types/hast": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz",
+ "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==",
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
+ "@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
+ "dev": true
+ },
+ "@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "@types/istanbul-reports": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
+ "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "*",
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "@types/jest": {
+ "version": "25.2.3",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.3.tgz",
+ "integrity": "sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw==",
+ "dev": true,
+ "requires": {
+ "jest-diff": "^25.2.1",
+ "pretty-format": "^25.2.1"
+ }
+ },
+ "@types/json-schema": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+ "dev": true
+ },
+ "@types/marked": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.3.tgz",
+ "integrity": "sha512-HnMWQkLJEf/PnxZIfbm0yGJRRZYYMhb++O9M36UCTA9z53uPvVoSlAwJr3XOpDEryb7Hwl1qAx/MV6YIW1RXxg==",
+ "dev": true
+ },
+ "@types/mdast": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
+ "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==",
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
+ "@types/node": {
+ "version": "14.18.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz",
+ "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==",
+ "dev": true
+ },
+ "@types/nodemailer": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz",
+ "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+ },
+ "@types/parse-numeric-range": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/parse-numeric-range/-/parse-numeric-range-0.0.1.tgz",
+ "integrity": "sha512-nI3rPGKk8BxedokP2VilnW5JyZHYNjGCUDsAZ2JQgISgDflHNUO0wXMfGYP8CkihrKYDm5tilD52XfGhO/ZFCA==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz",
+ "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw=="
+ },
+ "@types/prop-types": {
+ "version": "15.7.4",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
+ "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
+ },
+ "@types/react": {
+ "version": "16.14.23",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.23.tgz",
+ "integrity": "sha512-WngBZLuSkP4IAgPi0HOsGCHo6dn3CcuLQnCfC17VbA7YBgipZiZoTOhObwl/93DsFW0Y2a/ZXeonpW4DxirEJg==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-copy-to-clipboard": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-4.3.0.tgz",
+ "integrity": "sha512-iideNPRyroENqsOFh1i2Dv3zkviYS9r/9qD9Uh3Z9NNoAAqqa2x53i7iGndGNnJFIo20wIu7Hgh77tx1io8bgw==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/react-dom": {
+ "version": "16.9.14",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.14.tgz",
+ "integrity": "sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==",
+ "dev": true,
+ "requires": {
+ "@types/react": "^16"
+ }
+ },
+ "@types/react-syntax-highlighter": {
+ "version": "13.5.2",
+ "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.2.tgz",
+ "integrity": "sha512-sRZoKZBGKaE7CzMvTTgz+0x/aVR58ZYUTfB7HN76vC+yQnvo1FWtzNARBt0fGqcLGEVakEzMu/CtPzssmanu8Q==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
+ },
+ "@types/unist": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz",
+ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="
+ },
+ "@types/websocket": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz",
+ "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==",
+ "requires": {
+ "@types/node": "*"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "17.0.21",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz",
+ "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
+ }
+ }
+ },
+ "@types/yargs": {
+ "version": "15.0.14",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
+ "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "@types/yargs-parser": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+ },
+ "acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+ "requires": {
+ "acorn": "^7.0.0",
+ "acorn-walk": "^7.0.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arg": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
+ "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA=="
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "aria-hidden": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.1.3.tgz",
+ "integrity": "sha512-RhVWFtKH5BiGMycI72q2RAFMLQi8JP9bLuQXgR5a8Znp7P5KOIADSJeyfI8PCVxLEp067B2HbP5JIiI/PXIZeA==",
+ "requires": {
+ "tslib": "^1.0.0"
+ }
+ },
+ "array-union": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz",
+ "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw=="
+ },
+ "autolinker": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz",
+ "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=",
+ "requires": {
+ "gulp-header": "^1.7.1"
+ }
+ },
+ "autoprefixer": {
+ "version": "10.4.2",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
+ "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
+ "requires": {
+ "browserslist": "^4.19.1",
+ "caniuse-lite": "^1.0.30001297",
+ "fraction.js": "^4.1.2",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "babel-plugin-apply-mdx-type-prop": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz",
+ "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "7.10.4",
+ "@mdx-js/util": "1.6.22"
+ },
+ "dependencies": {
+ "@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+ }
+ }
+ },
+ "babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "requires": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "babel-plugin-extract-import-names": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz",
+ "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==",
+ "requires": {
+ "@babel/helper-plugin-utils": "7.10.4"
+ },
+ "dependencies": {
+ "@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+ }
+ }
+ },
+ "babel-plugin-polyfill-corejs2": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
+ "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+ "requires": {
+ "@babel/compat-data": "^7.13.11",
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "semver": "^6.1.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "babel-plugin-polyfill-corejs3": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
+ "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "core-js-compat": "^3.21.0"
+ }
+ },
+ "babel-plugin-polyfill-regenerator": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
+ "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+ "requires": {
+ "@babel/helper-define-polyfill-provider": "^0.3.1"
+ }
+ },
+ "bail": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
+ "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ=="
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.19.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
+ "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
+ "requires": {
+ "caniuse-lite": "^1.0.30001312",
+ "electron-to-chromium": "^1.4.71",
+ "escalade": "^3.1.1",
+ "node-releases": "^2.0.2",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "bufferutil": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz",
+ "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==",
+ "requires": {
+ "node-gyp-build": "^4.3.0"
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ },
+ "camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001313",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz",
+ "integrity": "sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q=="
+ },
+ "ccount": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
+ "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg=="
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
+ },
+ "character-entities-html4": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
+ "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g=="
+ },
+ "character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
+ },
+ "character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "classnames": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
+ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
+ },
+ "coffee-script": {
+ "version": "1.12.7",
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
+ "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw=="
+ },
+ "collapse-white-space": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
+ "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ=="
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "requires": {
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "copy-to-clipboard": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
+ "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
+ "requires": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
+ "core-js-compat": {
+ "version": "3.21.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz",
+ "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==",
+ "requires": {
+ "browserslist": "^4.19.1",
+ "semver": "7.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
+ }
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "cosmiconfig": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+ "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ }
+ },
+ "cross-fetch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+ "requires": {
+ "node-fetch": "2.6.7"
+ }
+ },
+ "css-blank-pseudo": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
+ "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.5"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "css-has-pseudo": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
+ "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.6",
+ "postcss-selector-parser": "^5.0.0-rc.4"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "css-prefers-color-scheme": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
+ "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.5"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "cssdb": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
+ "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==",
+ "dev": true
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+ },
+ "csstype": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
+ "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
+ },
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "date-fns": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz",
+ "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA=="
+ },
+ "debug": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+ },
+ "dequal": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
+ "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug=="
+ },
+ "detab": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz",
+ "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==",
+ "requires": {
+ "repeat-string": "^1.5.4"
+ }
+ },
+ "detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
+ "detective": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
+ "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+ "requires": {
+ "acorn-node": "^1.6.1",
+ "defined": "^1.0.0",
+ "minimist": "^1.1.1"
+ }
+ },
+ "diacritics-map": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz",
+ "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68="
+ },
+ "didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
+ },
+ "diff-sequences": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "requires": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+ "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
+ }
+ }
+ },
+ "dom7": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
+ "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+ "requires": {
+ "ssr-window": "^3.0.0-alpha.1"
+ }
+ },
+ "domelementtype": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
+ },
+ "domhandler": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
+ "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
+ "requires": {
+ "domelementtype": "^2.2.0"
+ }
+ },
+ "domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.76",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.76.tgz",
+ "integrity": "sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA=="
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+ },
+ "entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.53",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
+ "requires": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "requires": {
+ "fill-range": "^2.1.0"
+ },
+ "dependencies": {
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "requires": {
+ "is-number": "^2.1.0",
+ "isobject": "^2.0.0",
+ "randomatic": "^3.0.0",
+ "repeat-element": "^1.1.2",
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "ext": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
+ "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
+ "requires": {
+ "type": "^2.5.0"
+ },
+ "dependencies": {
+ "type": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz",
+ "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
+ "requires": {
+ "format": "^0.2.0"
+ }
+ },
+ "file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "flatten": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz",
+ "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==",
+ "dev": true
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs="
+ },
+ "formik": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
+ "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
+ "requires": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^1.10.0"
+ },
+ "dependencies": {
+ "deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="
+ }
+ }
+ },
+ "fraction.js": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz",
+ "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="
+ },
+ "github-slugger": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz",
+ "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ=="
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+ },
+ "globby": {
+ "version": "12.2.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz",
+ "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==",
+ "requires": {
+ "array-union": "^3.0.1",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.7",
+ "ignore": "^5.1.9",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ }
+ },
+ "gray-matter": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
+ "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
+ "requires": {
+ "js-yaml": "^3.13.1",
+ "kind-of": "^6.0.2",
+ "section-matter": "^1.0.0",
+ "strip-bom-string": "^1.0.0"
+ }
+ },
+ "gulp-header": {
+ "version": "1.8.12",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+ "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
+ "requires": {
+ "concat-with-sourcemaps": "*",
+ "lodash.template": "^4.4.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ },
+ "hast-to-hyperscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz",
+ "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==",
+ "requires": {
+ "@types/unist": "^2.0.3",
+ "comma-separated-tokens": "^1.0.0",
+ "property-information": "^5.3.0",
+ "space-separated-tokens": "^1.0.0",
+ "style-to-object": "^0.3.0",
+ "unist-util-is": "^4.0.0",
+ "web-namespaces": "^1.0.0"
+ }
+ },
+ "hast-util-from-parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz",
+ "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==",
+ "requires": {
+ "@types/parse5": "^5.0.0",
+ "hastscript": "^6.0.0",
+ "property-information": "^5.0.0",
+ "vfile": "^4.0.0",
+ "vfile-location": "^3.2.0",
+ "web-namespaces": "^1.0.0"
+ }
+ },
+ "hast-util-has-property": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz",
+ "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg=="
+ },
+ "hast-util-heading-rank": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-1.0.1.tgz",
+ "integrity": "sha512-P6Hq7RCky9syMevlrN90QWpqWDXCxwIVOfQR2rK6P4GpY4bqjKEuCzoWSRORZ7vz+VgRpLnXimh+mkwvVFjbyQ=="
+ },
+ "hast-util-is-element": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz",
+ "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ=="
+ },
+ "hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="
+ },
+ "hast-util-raw": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz",
+ "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==",
+ "requires": {
+ "@types/hast": "^2.0.0",
+ "hast-util-from-parse5": "^6.0.0",
+ "hast-util-to-parse5": "^6.0.0",
+ "html-void-elements": "^1.0.0",
+ "parse5": "^6.0.0",
+ "unist-util-position": "^3.0.0",
+ "vfile": "^4.0.0",
+ "web-namespaces": "^1.0.0",
+ "xtend": "^4.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "hast-util-sanitize": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-2.0.3.tgz",
+ "integrity": "sha512-RILqWHmzU0Anmfw1KEP41LbCsJuJUVM0lQWAbTDk9+0bWqzRFXDaMdqIoRocLlOfR5NfcWyhFfZw/mGsuftwYA==",
+ "requires": {
+ "xtend": "^4.0.0"
+ }
+ },
+ "hast-util-to-html": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-6.1.0.tgz",
+ "integrity": "sha512-IlC+LG2HGv0Y8js3wqdhg9O2sO4iVpRDbHOPwXd7qgeagpGsnY49i8yyazwqS35RA35WCzrBQE/n0M6GG/ewxA==",
+ "requires": {
+ "ccount": "^1.0.0",
+ "comma-separated-tokens": "^1.0.1",
+ "hast-util-is-element": "^1.0.0",
+ "hast-util-whitespace": "^1.0.0",
+ "html-void-elements": "^1.0.0",
+ "property-information": "^5.2.0",
+ "space-separated-tokens": "^1.0.0",
+ "stringify-entities": "^2.0.0",
+ "unist-util-is": "^3.0.0",
+ "xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "unist-util-is": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
+ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="
+ }
+ }
+ },
+ "hast-util-to-parse5": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz",
+ "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==",
+ "requires": {
+ "hast-to-hyperscript": "^9.0.0",
+ "property-information": "^5.0.0",
+ "web-namespaces": "^1.0.0",
+ "xtend": "^4.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "hast-util-to-string": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz",
+ "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w=="
+ },
+ "hast-util-whitespace": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz",
+ "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A=="
+ },
+ "hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "requires": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ }
+ },
+ "highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="
+ },
+ "hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "requires": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "html-to-react": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.8.tgz",
+ "integrity": "sha512-BDOPUYTej5eiOco0V0wxJ5FS+Zckp2O0kb13X1SxQFzyusIeUmnxAK0Cl5M6692bmGBs1WBjh9qF3oQ2AJUZmg==",
+ "requires": {
+ "domhandler": "^4.0",
+ "htmlparser2": "^7.0",
+ "lodash.camelcase": "^4.3.0",
+ "ramda": "^0.28.0"
+ }
+ },
+ "html-void-elements": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz",
+ "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w=="
+ },
+ "htmlparser2": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
+ "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.2",
+ "domutils": "^2.8.0",
+ "entities": "^3.0.1"
+ }
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "inline-style-parser": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
+ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
+ },
+ "is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "requires": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+ },
+ "is-core-module": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+ "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "is-whitespace-character": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
+ "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w=="
+ },
+ "is-word-character": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
+ "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "jest-diff": {
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
+ "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
+ "dev": true,
+ "requires": {
+ "chalk": "^3.0.0",
+ "diff-sequences": "^25.2.6",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.5.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jest-get-type": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ },
+ "lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "requires": {
+ "set-getter": "^0.1.0"
+ }
+ },
+ "lilconfig": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
+ "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA=="
+ },
+ "lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "list-item": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz",
+ "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=",
+ "requires": {
+ "expand-range": "^1.8.1",
+ "extend-shallow": "^2.0.1",
+ "is-number": "^2.1.0",
+ "repeat-string": "^1.5.2"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
+ },
+ "lodash.castarray": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+ "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU="
+ },
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
+ "lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.templatesettings": "^4.0.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0"
+ }
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+ },
+ "longest-streak": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
+ "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg=="
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+ "requires": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
+ }
+ },
+ "markdown-escapes": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
+ "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg=="
+ },
+ "markdown-link": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz",
+ "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88="
+ },
+ "markdown-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
+ "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
+ "requires": {
+ "repeat-string": "^1.0.0"
+ }
+ },
+ "markdown-toc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz",
+ "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==",
+ "requires": {
+ "concat-stream": "^1.5.2",
+ "diacritics-map": "^0.1.0",
+ "gray-matter": "^2.1.0",
+ "lazy-cache": "^2.0.2",
+ "list-item": "^1.1.1",
+ "markdown-link": "^0.1.1",
+ "minimist": "^1.2.0",
+ "mixin-deep": "^1.1.3",
+ "object.pick": "^1.2.0",
+ "remarkable": "^1.7.1",
+ "repeat-string": "^1.6.1",
+ "strip-color": "^0.1.0"
+ },
+ "dependencies": {
+ "gray-matter": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz",
+ "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=",
+ "requires": {
+ "ansi-red": "^0.1.1",
+ "coffee-script": "^1.12.4",
+ "extend-shallow": "^2.0.1",
+ "js-yaml": "^3.8.1",
+ "toml": "^2.3.2"
+ }
+ }
+ }
+ },
+ "marked": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
+ "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ=="
+ },
+ "math-random": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A=="
+ },
+ "mdast-add-list-metadata": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz",
+ "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==",
+ "requires": {
+ "unist-util-visit-parents": "1.1.2"
+ },
+ "dependencies": {
+ "unist-util-visit-parents": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz",
+ "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q=="
+ }
+ }
+ },
+ "mdast-squeeze-paragraphs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz",
+ "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==",
+ "requires": {
+ "unist-util-remove": "^2.0.0"
+ }
+ },
+ "mdast-util-definitions": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
+ "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
+ "requires": {
+ "unist-util-visit": "^2.0.0"
+ }
+ },
+ "mdast-util-find-and-replace": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz",
+ "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==",
+ "requires": {
+ "escape-string-regexp": "^4.0.0",
+ "unist-util-is": "^4.0.0",
+ "unist-util-visit-parents": "^3.0.0"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+ }
+ }
+ },
+ "mdast-util-from-markdown": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+ "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
+ "requires": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "micromark": "~2.11.0",
+ "parse-entities": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ }
+ },
+ "mdast-util-gfm": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz",
+ "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==",
+ "requires": {
+ "mdast-util-gfm-autolink-literal": "^0.1.0",
+ "mdast-util-gfm-strikethrough": "^0.2.0",
+ "mdast-util-gfm-table": "^0.1.0",
+ "mdast-util-gfm-task-list-item": "^0.1.0",
+ "mdast-util-to-markdown": "^0.6.1"
+ }
+ },
+ "mdast-util-gfm-autolink-literal": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz",
+ "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==",
+ "requires": {
+ "ccount": "^1.0.0",
+ "mdast-util-find-and-replace": "^1.1.0",
+ "micromark": "^2.11.3"
+ }
+ },
+ "mdast-util-gfm-strikethrough": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz",
+ "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==",
+ "requires": {
+ "mdast-util-to-markdown": "^0.6.0"
+ }
+ },
+ "mdast-util-gfm-table": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz",
+ "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==",
+ "requires": {
+ "markdown-table": "^2.0.0",
+ "mdast-util-to-markdown": "~0.6.0"
+ }
+ },
+ "mdast-util-gfm-task-list-item": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz",
+ "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==",
+ "requires": {
+ "mdast-util-to-markdown": "~0.6.0"
+ }
+ },
+ "mdast-util-to-hast": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz",
+ "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==",
+ "requires": {
+ "@types/mdast": "^3.0.0",
+ "@types/unist": "^2.0.0",
+ "mdast-util-definitions": "^4.0.0",
+ "mdurl": "^1.0.0",
+ "unist-builder": "^2.0.0",
+ "unist-util-generated": "^1.0.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^2.0.0"
+ }
+ },
+ "mdast-util-to-markdown": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
+ "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w=="
+ },
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+ },
+ "micromark": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+ "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
+ "requires": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "micromark-extension-gfm": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz",
+ "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==",
+ "requires": {
+ "micromark": "~2.11.0",
+ "micromark-extension-gfm-autolink-literal": "~0.5.0",
+ "micromark-extension-gfm-strikethrough": "~0.6.5",
+ "micromark-extension-gfm-table": "~0.4.0",
+ "micromark-extension-gfm-tagfilter": "~0.3.0",
+ "micromark-extension-gfm-task-list-item": "~0.3.0"
+ }
+ },
+ "micromark-extension-gfm-autolink-literal": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz",
+ "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==",
+ "requires": {
+ "micromark": "~2.11.3"
+ }
+ },
+ "micromark-extension-gfm-strikethrough": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz",
+ "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==",
+ "requires": {
+ "micromark": "~2.11.0"
+ }
+ },
+ "micromark-extension-gfm-table": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz",
+ "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==",
+ "requires": {
+ "micromark": "~2.11.0"
+ }
+ },
+ "micromark-extension-gfm-tagfilter": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz",
+ "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q=="
+ },
+ "micromark-extension-gfm-task-list-item": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz",
+ "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==",
+ "requires": {
+ "micromark": "~2.11.0"
+ }
+ },
+ "micromatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.2.3"
+ }
+ },
+ "mini-svg-data-uri": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz",
+ "integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA=="
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "nanoid": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
+ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
+ },
+ "next": {
+ "version": "12.1.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-12.1.4.tgz",
+ "integrity": "sha512-DA4g97BM4Z0nKtDvCTm58RxdvoQyYzeg0AeVbh0N4Y/D8ELrNu47lQeEgRGF8hV4eQ+Sal90zxrJQQG/mPQ8CQ==",
+ "requires": {
+ "@next/env": "12.1.4",
+ "@next/swc-android-arm-eabi": "12.1.4",
+ "@next/swc-android-arm64": "12.1.4",
+ "@next/swc-darwin-arm64": "12.1.4",
+ "@next/swc-darwin-x64": "12.1.4",
+ "@next/swc-linux-arm-gnueabihf": "12.1.4",
+ "@next/swc-linux-arm64-gnu": "12.1.4",
+ "@next/swc-linux-arm64-musl": "12.1.4",
+ "@next/swc-linux-x64-gnu": "12.1.4",
+ "@next/swc-linux-x64-musl": "12.1.4",
+ "@next/swc-win32-arm64-msvc": "12.1.4",
+ "@next/swc-win32-ia32-msvc": "12.1.4",
+ "@next/swc-win32-x64-msvc": "12.1.4",
+ "caniuse-lite": "^1.0.30001283",
+ "postcss": "8.4.5",
+ "styled-jsx": "5.0.1"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.4.5",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+ "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+ "requires": {
+ "nanoid": "^3.1.30",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.1"
+ }
+ }
+ }
+ },
+ "next-mdx-remote": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-2.1.4.tgz",
+ "integrity": "sha512-HHJasFVgPGjWXW3tWC37NCvHcQUOjJgVUMdwxgVbshwgtDLrGmupNkist/iamDLlvVibU52B9rqM9VAWofq7cA==",
+ "requires": {
+ "@babel/core": "^7.12.10",
+ "@babel/preset-env": "^7.12.11",
+ "@babel/preset-react": "^7.12.10",
+ "@babel/preset-typescript": "^7.12.7",
+ "@mdx-js/mdx": "^1.6.22",
+ "@mdx-js/react": "^1.6.22"
+ },
+ "dependencies": {
+ "@babel/core": {
+ "version": "7.17.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz",
+ "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==",
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.16.7",
+ "@babel/generator": "^7.17.3",
+ "@babel/helper-compilation-targets": "^7.16.7",
+ "@babel/helper-module-transforms": "^7.16.7",
+ "@babel/helpers": "^7.17.2",
+ "@babel/parser": "^7.17.3",
+ "@babel/template": "^7.16.7",
+ "@babel/traverse": "^7.17.3",
+ "@babel/types": "^7.17.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.1.2",
+ "semver": "^6.3.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ }
+ }
+ },
+ "next-seo": {
+ "version": "4.29.0",
+ "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-4.29.0.tgz",
+ "integrity": "sha512-xmwzcz4uHaYJ8glbuhs6FSBQ7z3irmdPYdJJ5saWm72Uy3o+mPKGaPCXQetTCE6/xxVnpoDV4yFtFlEjUcljSg==",
+ "requires": {}
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+ },
+ "node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "requires": {
+ "whatwg-url": "^5.0.0"
+ }
+ },
+ "node-gyp-build": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz",
+ "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q=="
+ },
+ "node-releases": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg=="
+ },
+ "nodemailer": {
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz",
+ "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g=="
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "requires": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "parse-numeric-range": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz",
+ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="
+ },
+ "parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+ },
+ "postcss": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz",
+ "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==",
+ "requires": {
+ "nanoid": "^3.3.1",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "postcss-attribute-case-insensitive": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
+ "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^6.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-color-functional-notation": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
+ "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-color-gray": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
+ "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
+ "dev": true,
+ "requires": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.5",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-color-hex-alpha": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
+ "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.14",
+ "postcss-values-parser": "^2.0.1"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-color-mod-function": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
+ "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
+ "dev": true,
+ "requires": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-color-rebeccapurple": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
+ "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-custom-media": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
+ "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.14"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-custom-properties": {
+ "version": "8.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
+ "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.17",
+ "postcss-values-parser": "^2.0.1"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-custom-selectors": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
+ "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-dir-pseudo-class": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
+ "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-double-position-gradients": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
+ "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.5",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-env-function": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
+ "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-focus-visible": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
+ "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-focus-within": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
+ "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-font-variant": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz",
+ "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-gap-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
+ "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-image-set-function": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
+ "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-initial": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz",
+ "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-js": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
+ "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+ "requires": {
+ "camelcase-css": "^2.0.1"
+ }
+ },
+ "postcss-lab-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
+ "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
+ "dev": true,
+ "requires": {
+ "@csstools/convert-colors": "^1.4.0",
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-load-config": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz",
+ "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==",
+ "requires": {
+ "lilconfig": "^2.0.4",
+ "yaml": "^1.10.2"
+ }
+ },
+ "postcss-logical": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
+ "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-media-minmax": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
+ "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-nested": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
+ "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+ "requires": {
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "postcss-nesting": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
+ "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-overflow-shorthand": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
+ "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-page-break": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
+ "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-place": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
+ "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-values-parser": "^2.0.0"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-preset-env": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.1.tgz",
+ "integrity": "sha512-rlRkgX9t0v2On33n7TK8pnkcYOATGQSv48J2RS8GsXhqtg+xk6AummHP88Y5mJo0TLJelBjePvSjScTNkj3+qw==",
+ "dev": true,
+ "requires": {
+ "autoprefixer": "^9.6.1",
+ "browserslist": "^4.6.4",
+ "caniuse-lite": "^1.0.30000981",
+ "css-blank-pseudo": "^0.1.4",
+ "css-has-pseudo": "^0.10.0",
+ "css-prefers-color-scheme": "^3.1.1",
+ "cssdb": "^4.4.0",
+ "postcss": "^7.0.17",
+ "postcss-attribute-case-insensitive": "^4.0.1",
+ "postcss-color-functional-notation": "^2.0.1",
+ "postcss-color-gray": "^5.0.0",
+ "postcss-color-hex-alpha": "^5.0.3",
+ "postcss-color-mod-function": "^3.0.3",
+ "postcss-color-rebeccapurple": "^4.0.1",
+ "postcss-custom-media": "^7.0.8",
+ "postcss-custom-properties": "^8.0.11",
+ "postcss-custom-selectors": "^5.1.2",
+ "postcss-dir-pseudo-class": "^5.0.0",
+ "postcss-double-position-gradients": "^1.0.0",
+ "postcss-env-function": "^2.0.2",
+ "postcss-focus-visible": "^4.0.0",
+ "postcss-focus-within": "^3.0.0",
+ "postcss-font-variant": "^4.0.0",
+ "postcss-gap-properties": "^2.0.0",
+ "postcss-image-set-function": "^3.0.1",
+ "postcss-initial": "^3.0.0",
+ "postcss-lab-function": "^2.0.1",
+ "postcss-logical": "^3.0.0",
+ "postcss-media-minmax": "^4.0.0",
+ "postcss-nesting": "^7.0.0",
+ "postcss-overflow-shorthand": "^2.0.0",
+ "postcss-page-break": "^2.0.0",
+ "postcss-place": "^4.0.1",
+ "postcss-pseudo-class-any-link": "^6.0.0",
+ "postcss-replace-overflow-wrap": "^3.0.0",
+ "postcss-selector-matches": "^4.0.0",
+ "postcss-selector-not": "^4.0.0"
+ },
+ "dependencies": {
+ "autoprefixer": {
+ "version": "9.8.8",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
+ "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "picocolors": "^0.2.1",
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-pseudo-class-any-link": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
+ "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2",
+ "postcss-selector-parser": "^5.0.0-rc.3"
+ },
+ "dependencies": {
+ "cssesc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^2.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-replace-overflow-wrap": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
+ "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-selector-matches": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
+ "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-selector-not": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz",
+ "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
+ "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "postcss-values-parser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
+ "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
+ "dev": true,
+ "requires": {
+ "flatten": "^1.0.2",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "prettier": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
+ "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "25.5.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
+ "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.5.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "requires": {
+ "xtend": "^4.0.0"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+ },
+ "quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
+ },
+ "ramda": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz",
+ "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA=="
+ },
+ "randomatic": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+ "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+ "requires": {
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "math-random": "^1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ }
+ }
+ },
+ "react": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
+ "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "react-copy-to-clipboard": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz",
+ "integrity": "sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ==",
+ "requires": {
+ "copy-to-clipboard": "^3",
+ "prop-types": "^15.5.8"
+ }
+ },
+ "react-dom": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
+ "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "scheduler": "^0.20.2"
+ }
+ },
+ "react-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
+ "react-ga": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.0.tgz",
+ "integrity": "sha512-o8RScHj6Lb8cwy3GMrVH6NJvL+y0zpJvKtc0+wmH7Bt23rszJmnqEQxRbyrqUzk9DTJIHoP42bfO5rswC9SWBQ==",
+ "requires": {}
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "react-markdown": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-5.0.3.tgz",
+ "integrity": "sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w==",
+ "requires": {
+ "@types/mdast": "^3.0.3",
+ "@types/unist": "^2.0.3",
+ "html-to-react": "^1.3.4",
+ "mdast-add-list-metadata": "1.0.1",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.8.6",
+ "remark-parse": "^9.0.0",
+ "unified": "^9.0.0",
+ "unist-util-visit": "^2.0.0",
+ "xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "remark-parse": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+ "requires": {
+ "mdast-util-from-markdown": "^0.8.0"
+ }
+ }
+ }
+ },
+ "react-remove-scroll": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.4.tgz",
+ "integrity": "sha512-EyC5ohYhaeKbThMSQxuN2i+QC5HqV3AJvNZKEdiATITexu0gHm00+5ko0ltNS1ajYJVeDgVG2baRSCei0AUWlQ==",
+ "requires": {
+ "react-remove-scroll-bar": "^2.1.0",
+ "react-style-singleton": "^2.1.0",
+ "tslib": "^1.0.0",
+ "use-callback-ref": "^1.2.3",
+ "use-sidecar": "^1.0.1"
+ }
+ },
+ "react-remove-scroll-bar": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz",
+ "integrity": "sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg==",
+ "requires": {
+ "react-style-singleton": "^2.1.0",
+ "tslib": "^1.0.0"
+ }
+ },
+ "react-style-singleton": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz",
+ "integrity": "sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA==",
+ "requires": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^1.0.0"
+ }
+ },
+ "react-syntax-highlighter": {
+ "version": "15.5.0",
+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz",
+ "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==",
+ "requires": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ }
+ },
+ "react-tooltip": {
+ "version": "4.2.21",
+ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.2.21.tgz",
+ "integrity": "sha512-zSLprMymBDowknr0KVDiJ05IjZn9mQhhg4PRsqln0OZtURAJ1snt1xi5daZfagsh6vfsziZrc9pErPTDY1ACig==",
+ "requires": {
+ "prop-types": "^15.7.2",
+ "uuid": "^7.0.3"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="
+ }
+ }
+ },
+ "react-transition-group": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz",
+ "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "requires": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "regenerate-unicode-properties": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
+ "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
+ "requires": {
+ "regenerate": "^1.4.2"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ },
+ "regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "requires": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "regexpu-core": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz",
+ "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==",
+ "requires": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.0.1",
+ "regjsgen": "^0.6.0",
+ "regjsparser": "^0.8.2",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.0.0"
+ }
+ },
+ "regjsgen": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
+ "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA=="
+ },
+ "regjsparser": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
+ "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+ }
+ }
+ },
+ "rehype-slug": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-4.0.1.tgz",
+ "integrity": "sha512-KIlJALf9WfHFF21icwTd2yI2IP+RQRweaxH9ChVGQwRYy36+hiomG4ZSe0yQRyCt+D/vE39LbAcOI/h4O4GPhA==",
+ "requires": {
+ "github-slugger": "^1.1.1",
+ "hast-util-has-property": "^1.0.0",
+ "hast-util-heading-rank": "^1.0.0",
+ "hast-util-to-string": "^1.0.0",
+ "unist-util-visit": "^2.0.0"
+ }
+ },
+ "remark": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
+ "requires": {
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
+ },
+ "dependencies": {
+ "remark-parse": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+ "requires": {
+ "mdast-util-from-markdown": "^0.8.0"
+ }
+ }
+ }
+ },
+ "remark-footnotes": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz",
+ "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ=="
+ },
+ "remark-gfm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz",
+ "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==",
+ "requires": {
+ "mdast-util-gfm": "^0.1.0",
+ "micromark-extension-gfm": "^0.3.0"
+ }
+ },
+ "remark-html": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-10.0.0.tgz",
+ "integrity": "sha512-TbSQuedRFjAhXSk1NAbfaTqDK0jKAjfgn82D2ZYFFT8XpJ80uwXc8yVwK/Tl2eqboTMPxzNzCIss4kIucE5M8w==",
+ "requires": {
+ "hast-util-sanitize": "^2.0.0",
+ "hast-util-to-html": "^6.0.0",
+ "mdast-util-to-hast": "^6.0.0",
+ "xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "mdast-util-definitions": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz",
+ "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==",
+ "requires": {
+ "unist-util-visit": "^1.0.0"
+ }
+ },
+ "mdast-util-to-hast": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-6.0.2.tgz",
+ "integrity": "sha512-GjcOimC9qHI0yNFAQdBesrZXzUkRdFleQlcoU8+TVNfDW6oLUazUx8MgUoTaUyCJzBOnE5AOgqhpURrSlf0QwQ==",
+ "requires": {
+ "collapse-white-space": "^1.0.0",
+ "detab": "^2.0.0",
+ "mdast-util-definitions": "^1.2.0",
+ "mdurl": "^1.0.1",
+ "trim": "0.0.1",
+ "trim-lines": "^1.0.0",
+ "unist-builder": "^1.0.1",
+ "unist-util-generated": "^1.1.0",
+ "unist-util-position": "^3.0.0",
+ "unist-util-visit": "^1.1.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "unist-builder": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz",
+ "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==",
+ "requires": {
+ "object-assign": "^4.1.0"
+ }
+ },
+ "unist-util-is": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
+ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="
+ },
+ "unist-util-visit": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
+ "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
+ "requires": {
+ "unist-util-visit-parents": "^2.0.0"
+ }
+ },
+ "unist-util-visit-parents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
+ "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
+ "requires": {
+ "unist-util-is": "^3.0.0"
+ }
+ }
+ }
+ },
+ "remark-mdx": {
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz",
+ "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==",
+ "requires": {
+ "@babel/core": "7.12.9",
+ "@babel/helper-plugin-utils": "7.10.4",
+ "@babel/plugin-proposal-object-rest-spread": "7.12.1",
+ "@babel/plugin-syntax-jsx": "7.12.1",
+ "@mdx-js/util": "1.6.22",
+ "is-alphabetical": "1.0.4",
+ "remark-parse": "8.0.3",
+ "unified": "9.2.0"
+ },
+ "dependencies": {
+ "@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+ }
+ }
+ },
+ "remark-parse": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz",
+ "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==",
+ "requires": {
+ "ccount": "^1.0.0",
+ "collapse-white-space": "^1.0.2",
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "is-word-character": "^1.0.0",
+ "markdown-escapes": "^1.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "trim": "0.0.1",
+ "trim-trailing-lines": "^1.0.0",
+ "unherit": "^1.0.4",
+ "unist-util-remove-position": "^2.0.0",
+ "vfile-location": "^3.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "remark-squeeze-paragraphs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz",
+ "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==",
+ "requires": {
+ "mdast-squeeze-paragraphs": "^4.0.0"
+ }
+ },
+ "remark-stringify": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
+ "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
+ "requires": {
+ "mdast-util-to-markdown": "^0.6.0"
+ }
+ },
+ "remarkable": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz",
+ "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==",
+ "requires": {
+ "argparse": "^1.0.10",
+ "autolinker": "~0.28.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+ "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ=="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "resolve": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+ "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "requires": {
+ "is-core-module": "^2.8.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "scheduler": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+ "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "schema-utils": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "section-matter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
+ "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "kind-of": "^6.0.0"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "set-getter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
+ "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==",
+ "requires": {
+ "to-object-path": "^0.3.0"
+ }
+ },
+ "slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+ },
+ "space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "ssr-window": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
+ "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
+ },
+ "state-toggle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
+ "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ=="
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "stringify-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-2.0.0.tgz",
+ "integrity": "sha512-fqqhZzXyAM6pGD9lky/GOPq6V4X0SeTAFBl0iXb/BzOegl40gpf/bV3QQP7zULNYvjr6+Dx8SCaDULjVoOru0A==",
+ "requires": {
+ "character-entities-html4": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.2",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "strip-bom-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+ "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI="
+ },
+ "strip-color": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz",
+ "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s="
+ },
+ "style-to-object": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz",
+ "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
+ "requires": {
+ "inline-style-parser": "0.1.1"
+ }
+ },
+ "styled-jsx": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.1.tgz",
+ "integrity": "sha512-+PIZ/6Uk40mphiQJJI1202b+/dYeTVd9ZnMPR80pgiWbjIwvN2zIp4r9et0BgqBuShh48I0gttPlAXA7WVvBxw==",
+ "requires": {}
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ },
+ "swiper": {
+ "version": "6.8.4",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-6.8.4.tgz",
+ "integrity": "sha512-O+buF9Q+sMA0H7luMS8R59hCaJKlpo8PXhQ6ZYu6Rn2v9OsFd4d1jmrv14QvxtQpKAvL/ZiovEeANI/uDGet7g==",
+ "requires": {
+ "dom7": "^3.0.0",
+ "ssr-window": "^3.0.0"
+ }
+ },
+ "swr": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-0.5.7.tgz",
+ "integrity": "sha512-Jh1Efgu8nWZV9rU4VLUMzBzcwaZgi4znqbVXvAtUy/0JzSiN6bNjLaJK8vhY/Rtp7a83dosz5YuehfBNwC/ZoQ==",
+ "requires": {
+ "dequal": "2.0.2"
+ }
+ },
+ "tailwindcss": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz",
+ "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==",
+ "requires": {
+ "arg": "^5.0.1",
+ "chalk": "^4.1.2",
+ "chokidar": "^3.5.3",
+ "color-name": "^1.1.4",
+ "cosmiconfig": "^7.0.1",
+ "detective": "^5.2.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^2.2.0",
+ "postcss": "^8.4.6",
+ "postcss-js": "^4.0.0",
+ "postcss-load-config": "^3.1.0",
+ "postcss-nested": "5.0.6",
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0",
+ "quick-lru": "^5.1.1",
+ "resolve": "^1.22.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "tailwindcss-radix": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tailwindcss-radix/-/tailwindcss-radix-1.6.0.tgz",
+ "integrity": "sha512-5oBgGCVGsITMiUVlc6Euj4kt03l8htLJxVT9AXbkFxcJiXLtQxJriFq/8R+3s63OKit/ynCVdkqvlnW6H7iG1g=="
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
+ },
+ "toml": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz",
+ "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ=="
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ },
+ "trim": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
+ "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
+ },
+ "trim-lines": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz",
+ "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA=="
+ },
+ "trim-trailing-lines": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz",
+ "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ=="
+ },
+ "trough": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
+ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "typescript": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz",
+ "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg=="
+ },
+ "unherit": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
+ "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
+ "requires": {
+ "inherits": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ=="
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw=="
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ=="
+ },
+ "unified": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
+ "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
+ "requires": {
+ "bail": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-buffer": "^2.0.0",
+ "is-plain-obj": "^2.0.0",
+ "trough": "^1.0.0",
+ "vfile": "^4.0.0"
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "unist-builder": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz",
+ "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw=="
+ },
+ "unist-util-generated": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz",
+ "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg=="
+ },
+ "unist-util-is": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg=="
+ },
+ "unist-util-position": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
+ "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA=="
+ },
+ "unist-util-remove": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz",
+ "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==",
+ "requires": {
+ "unist-util-is": "^4.0.0"
+ }
+ },
+ "unist-util-remove-position": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
+ "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
+ "requires": {
+ "unist-util-visit": "^2.0.0"
+ }
+ },
+ "unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "requires": {
+ "@types/unist": "^2.0.2"
+ }
+ },
+ "unist-util-visit": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+ "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^4.0.0",
+ "unist-util-visit-parents": "^3.0.0"
+ }
+ },
+ "unist-util-visit-parents": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
+ "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "unist-util-is": "^4.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "use-callback-ref": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz",
+ "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==",
+ "requires": {}
+ },
+ "use-debounce": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-7.0.1.tgz",
+ "integrity": "sha512-fOrzIw2wstbAJuv8PC9Vg4XgwyTLEOdq4y/Z3IhVl8DAE4svRcgyEUvrEXu+BMNgMoc3YND6qLT61kkgEKXh7Q==",
+ "requires": {}
+ },
+ "use-sidecar": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.5.tgz",
+ "integrity": "sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA==",
+ "requires": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^1.9.3"
+ }
+ },
+ "utf-8-validate": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz",
+ "integrity": "sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==",
+ "requires": {
+ "node-gyp-build": "^4.3.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ },
+ "vfile": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+ "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "is-buffer": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0",
+ "vfile-message": "^2.0.0"
+ }
+ },
+ "vfile-location": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
+ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA=="
+ },
+ "vfile-message": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ }
+ },
+ "web-namespaces": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz",
+ "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw=="
+ },
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ },
+ "websocket": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
+ "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
+ "requires": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "requires": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "yaeti": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
+ "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
+ },
+ "yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw=="
+ }
+ }
+}
diff --git a/www/package.json b/www/package.json
new file mode 100644
index 00000000000..78b16d046f4
--- /dev/null
+++ b/www/package.json
@@ -0,0 +1,72 @@
+{
+ "name": "supabase-website",
+ "version": "0.0.2",
+ "description": "Supabase main website",
+ "private": true,
+ "scripts": {
+ "dev": "next",
+ "build": "next build",
+ "export": "next export",
+ "start": "next start",
+ "typecheck": "tsc",
+ "prettier": "prettier --write \"./{pages,components,lib,stores,styles,tests}/**/*.{ts,tsx,md,js,jsx,json}\"",
+ "postbuild": "node ./internals/generate-sitemap.mjs"
+ },
+ "dependencies": {
+ "@heroicons/react": "^1.0.6",
+ "@mdx-js/loader": "^1.6.22",
+ "@mdx-js/react": "^1.6.22",
+ "@next/mdx": "^10.0.7",
+ "@supabase/supabase-js": "^1.6.0",
+ "@supabase/ui": "v0.37.0-alpha.50",
+ "classnames": "^2.3.1",
+ "date-fns": "2.10.0",
+ "deepmerge": "^4.2.2",
+ "globby": "^12.0.2",
+ "gray-matter": "^4.0.2",
+ "markdown-toc": "^1.2.0",
+ "marked": "^4.0.12",
+ "next": "latest",
+ "next-mdx-remote": "^2.1.3",
+ "next-seo": "^4.20.0",
+ "nodemailer": "^6.7.3",
+ "parse-numeric-range": "^1.3.0",
+ "react": "^17.0.2",
+ "react-copy-to-clipboard": "^5.0.2",
+ "react-dom": "^17.0.2",
+ "react-ga": "^3.3.0",
+ "react-markdown": "^5.0.3",
+ "react-syntax-highlighter": "^15.5.0",
+ "react-tooltip": "^4.2.17",
+ "react-transition-group": "^4.4.1",
+ "rehype-slug": "^4.0.1",
+ "remark": "^13.0.0",
+ "remark-gfm": "^1.0.0",
+ "remark-html": "10.0.0",
+ "swiper": "^6.5.0",
+ "swr": "^0.5.4",
+ "typescript": "^4.0.3",
+ "use-debounce": "^7.0.1",
+ "uuid": "^8.3.2"
+ },
+ "devDependencies": {
+ "@tailwindcss/typography": "^0.5.2",
+ "@types/classnames": "^2.3.1",
+ "@types/jest": "^25.2.2",
+ "@types/marked": "^4.0.3",
+ "@types/node": "^14.0.1",
+ "@types/nodemailer": "^6.4.4",
+ "@types/parse-numeric-range": "^0.0.1",
+ "@types/react": "^16.9.35",
+ "@types/react-copy-to-clipboard": "^4.3.0",
+ "@types/react-dom": "^16.9.8",
+ "@types/react-syntax-highlighter": "^13.5.2",
+ "autoprefixer": "^10.4.2",
+ "file-loader": "^6.2.0",
+ "postcss": "^8.4.7",
+ "postcss-preset-env": "^6.7.0",
+ "prettier": "^2.2.1",
+ "tailwindcss": "^3.0.23"
+ },
+ "license": "MIT"
+}
diff --git a/www/pages/404.tsx b/www/pages/404.tsx
new file mode 100644
index 00000000000..e53c9983b36
--- /dev/null
+++ b/www/pages/404.tsx
@@ -0,0 +1,77 @@
+import Image from 'next/image'
+import { useEffect, useState } from 'react'
+import Link from 'next/link'
+import { Button } from '@supabase/ui'
+
+import DefaultLayout from '../components/Layouts/Default'
+
+import { useTheme } from '~/components/Providers'
+
+const Error404 = () => {
+ const [show404, setShow404] = useState(false)
+ const { isDarkMode } = useTheme()
+
+ useEffect(() => {
+ setTimeout(() => {
+ setShow404(true)
+ }, 500)
+ }, [])
+
+ return (
+
+
+
+
+
+ 404
+
+
+
+
+
Looking for something? 🔍
+
+ We couldn't find the page that you're looking for!
+
+
+
+
+
+ Head back
+
+
+
+
+
+
+ )
+}
+
+export default Error404
diff --git a/www/pages/_app.tsx b/www/pages/_app.tsx
new file mode 100644
index 00000000000..9f6c1479191
--- /dev/null
+++ b/www/pages/_app.tsx
@@ -0,0 +1,75 @@
+import { APP_NAME, DESCRIPTION } from 'lib/constants'
+import { DefaultSeo } from 'next-seo'
+import { AppProps } from 'next/app'
+import { useRouter } from 'next/router'
+import { useEffect } from 'react'
+import Meta from '~/components/Favicons'
+import '../styles/index.css'
+import { post } from './../lib/fetchWrapper'
+import { ThemeProvider } from '~/components/Providers'
+
+export default function MyApp({ Component, pageProps }: AppProps) {
+ const router = useRouter()
+
+ function telemetry() {
+ return post(`https://api.supabase.io/platform/telemetry/page`, {
+ referrer: document.referrer,
+ title: document.title,
+ })
+ }
+
+ useEffect(() => {
+ // `routeChangeComplete` won't run for the first page load unless the query string is
+ // hydrated later on, so here we log a page view if this is the first render and
+ // there's no query string
+ if (!router.asPath.includes('?')) {
+ telemetry()
+ }
+ }, [])
+
+ useEffect(() => {
+ function handleRouteChange() {
+ telemetry()
+ }
+
+ // Listen for page changes after a navigation or when the query changes
+ router.events.on('routeChangeComplete', handleRouteChange)
+ return () => {
+ router.events.off('routeChangeComplete', handleRouteChange)
+ }
+ }, [router.events])
+
+ const site_title = `The Open Source Firebase Alternative | ${APP_NAME}`
+ const { basePath } = useRouter()
+
+ return (
+ <>
+
+
+
+
+
+ >
+ )
+}
diff --git a/www/pages/_document.tsx b/www/pages/_document.tsx
new file mode 100644
index 00000000000..60704077b96
--- /dev/null
+++ b/www/pages/_document.tsx
@@ -0,0 +1,15 @@
+import Document, { Html, Head, Main, NextScript } from 'next/document'
+
+export default class MyDocument extends Document {
+ render() {
+ return (
+
+
+
+
+
+
+
+ )
+ }
+}
diff --git a/www/pages/auth/Auth.module.css b/www/pages/auth/Auth.module.css
new file mode 100644
index 00000000000..3dd7008e1bd
--- /dev/null
+++ b/www/pages/auth/Auth.module.css
@@ -0,0 +1,7 @@
+/* .github-icon svg {
+ fill: currentColor;
+} */
+
+.github-icon {
+ @apply text-white;
+}
diff --git a/www/pages/auth/Auth.tsx b/www/pages/auth/Auth.tsx
new file mode 100644
index 00000000000..9c2c973f6d3
--- /dev/null
+++ b/www/pages/auth/Auth.tsx
@@ -0,0 +1,311 @@
+import { createClient } from '@supabase/supabase-js'
+import {
+ Button,
+ IconArrowUpRight,
+ IconBriefcase,
+ IconEye,
+ IconKey,
+ IconLink,
+ IconShield,
+ IconX,
+ Space,
+} from '@supabase/ui'
+import ApiExamples from 'data/products/auth/auth-api-examples'
+import AuthSqlRulesExamples from 'data/products/auth/auth-sql-rules-examples'
+import Solutions from 'data/Solutions.json'
+import { NextSeo } from 'next-seo'
+import Image from 'next/image'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import AuthComponentExample from '~/components/AuthWidget/AuthComponentExample'
+import SplitCodeBlockCarousel from '~/components/Carousels/SplitCodeBlockCarousel'
+import CTABanner from '~/components/CTABanner'
+import FeatureColumn from '~/components/FeatureColumn'
+import FloatingIcons from '~/components/FloatingIcons'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import ProductIcon from '~/components/ProductIcon'
+import APISection from '~/components/Sections/APISection'
+import GithubExamples from '~/components/Sections/GithubExamples'
+import ProductHeader from '~/components/Sections/ProductHeader'
+import AuthProviders from '~/data/auth.json'
+
+function AuthPage() {
+ // base path for images
+ const { basePath } = useRouter()
+
+ // supabase auth widget project details
+ const supabase = createClient(
+ 'https://rsnibhkhsbfnncjmwnkj.supabase.co',
+ 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlhdCI6MTYxNTIxNDE1MywiZXhwIjoxOTMwNzkwMTUzfQ.OQEbAaTfgDdLCCht251P2JRD3QDnui6nsU8N-tZA_Mc'
+ )
+
+ const meta_title = 'Auth | Built-in user management'
+ const meta_description =
+ 'Authentication that you can afford that is built in to your supabase project.'
+
+ return (
+ <>
+
+
+
+ Open Source Auth
+ (with tons of integrations)
+ ,
+ ]}
+ subheader={[
+ 'Every Supabase project comes with a complete User Management system that works without any additional tools.',
+ "Including PostgreSQL's policy engine, for fine-grained access rules.",
+ ]}
+ image={[
+
+
+
,
+
+
+
,
+ ]}
+ documentation_url={'/docs/guides/auth'}
+ />
+
+
+
+
+
+
+
+ {AuthProviders.map((auth) => {
+ return (
+
+
+
+ )
+ })}
+
+
+
All the social providers
+
+ Enable social logins with the click of a button. Google, Facebook, GitHub, Azure,
+ Gitlab, Twitter, Discord, and many more.
+
+
+
+
+
+
+
Fully integrated
+
+ Incredibly simple Auth, without a single external authentication service. Built-in
+ Authentication, Authorization, and User Management.
+
+
+
+
+
+
+
Own your data
+
+ User data stored in your Supabase database so you never have to worry about 3rd
+ party privacy issues. Host your data in 8 different locations.
+
+
+
+
+
+
+
+
+ APIs that you can understand. With powerful libraries that work on client and
+ server-side applications.
+
+ {/* I think less is more here ... */}
+ {/*
+ With powerful client libraries that work on both client and server-side
+ applications.
+
*/}
+ ,
+ ]}
+ footer={[
+
+
+ }
+ title="Enterprise logins"
+ text="Support for SAML, Azure. More enterprise providers and SSO coming soon."
+ />
+
+
+ }
+ title="Social login scopes"
+ text="Request additional user data permissions when using social logins."
+ />
+
+
,
+ ]}
+ documentation_link={'/docs/guides/auth'}
+ />
+
+
+
+
+
+
+
+
User permissions without the middleware
+
+
+ Supabase Auth works without any additional servers. Build Authorization rules with
+ Postgres' Row Level Security, controlling who can create, edit and delete specific
+ rows in your database.
+
+
Policies can be written in SQL or using the dashboard online.
+
+
+
+ }>
+ Explore documentation
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+
+
+
+
+
+
+
+
+
+
+
React Auth
+
+
+ Pre-built auth widgets to get started in minutes.
+
+
+ Supabase provides React libraries which handle common scenarios, including logging
+ in, signing up, magic link and forgot password forms.
+
+
+
+
+ }>
+ Explore documentation
+
+
+
+
+
+
+ }
+ title="Social login support"
+ text="Support for social logins are built in and the component "
+ />
+
+
+ }
+ title="User context hooks"
+ text="Access the auth status from any component."
+ />
+
+
+
+
+ */}
+
+
+ >
+ )
+}
+
+export default AuthPage
diff --git a/www/pages/auth/index.tsx b/www/pages/auth/index.tsx
new file mode 100644
index 00000000000..43806d558f9
--- /dev/null
+++ b/www/pages/auth/index.tsx
@@ -0,0 +1,3 @@
+import Auth from './Auth'
+
+export default Auth
diff --git a/www/pages/beta.tsx b/www/pages/beta.tsx
new file mode 100644
index 00000000000..bc9cc2d297f
--- /dev/null
+++ b/www/pages/beta.tsx
@@ -0,0 +1,1054 @@
+import Container from 'components/Container'
+import CountUp from 'components/CountUp'
+import CTABanner from 'components/CTABanner/index'
+import FlyOut from 'components/UI/FlyOut'
+import { AlphaNumbers, IntroductionSegments, PerformanceComparisonData } from 'data/BetaPage'
+import authors from 'lib/authors.json'
+import { APP_NAME, DESCRIPTION } from 'lib/constants'
+import { NextSeo } from 'next-seo'
+import Head from 'next/head'
+import Link from 'next/link'
+import Image from 'next/image'
+import { useRouter } from 'next/router'
+import { useEffect, useRef, useState } from 'react'
+import Layout from '~/components/Layouts/Default'
+
+const site_title = `${APP_NAME} | We are now in Beta`
+
+// Dark text: text-dark-400
+// Light text: text-dark-300
+
+type Props = {
+ darkMode: boolean
+}
+
+const NavFlyOutMenu = (props: any) => {
+ const { scrollTo } = props
+ const segments = IntroductionSegments.map((segment: any) => segment.chapters)
+
+ return (
+ <>
+
+ {segments.flat().map((segment: any) => (
+
scrollTo(segment.key)}
+ className={`
+ col-span-12 lg:col-span-4 px-4 lg:px-6 py-4 lg:py-10 text-dark-300 dark:text-dark-400 cursor-pointer bg-white dark:bg-dark-600
+ hover:bg-dark-100 dark:hover:bg-dark-500 border-dark-300 dark:border-dark-400 border-t sm:border-l border-dashed`}
+ >
+
+
+ 0{segment.no}
+
+ {segment.name}
+
+
+ ))}
+
+ >
+ )
+}
+
+const VideoShot = (props: any) => {
+ const { src } = props
+ return (
+
+
+
+
+ Your browser does not support the video tag
+
+
+
+ )
+}
+
+const HamburgerMenu = (props: any) => {
+ const { openMenu } = props
+ return (
+
+
+
+
+
+
+
+ )
+}
+
+const SectionHeader = (props: any) => {
+ const { sectionNumber, header } = props
+ return (
+
+ 0{sectionNumber}
+
{header}
+
+ )
+}
+
+const Hero = (props: Props) => {
+ const { basePath } = useRouter()
+ const { darkMode } = props
+ return (
+
+
+
+
Supabase is an open source Firebase alternative.
+
+ Today, we're moving to Beta
+
+
+ Published December 3rd, 2020
+
+
+
+
+ )
+}
+
+const Introduction = () => {
+ return (
+
+
+
+
+ After the launch of our{' '}
+
+ Alpha
+ {' '}
+ Program in June,
+
+
+
+
+
+ we've been fortunate to work with thousands of early adopters on improving both our Open
+ Source, and Hosted offerings. Companies like{' '}
+
+ Xendit
+
+ ,{' '}
+
+ Monitoro
+
+ , and{' '}
+
+ TAYFA
+ {' '}
+ are using Supabase to ship more products, faster.
+
+
+
+
+
+ Alpha Program in Numbers
+
+
+
+
+ {AlphaNumbers.map((stat: any, idx: number) => (
+
+
+
+
+
+ {stat.value}
+
+ {stat.unit && {stat.unit} }
+
+
+
+
+ ))}
+
+
+ )
+}
+
+const TableOfContents = (props: any) => {
+ const { scrollTo } = props
+ return (
+
+
+
+
+ Supabase Beta is starting
+ now.
+
+
+
+ {IntroductionSegments.map((segment: any, segmentIdx: number) => (
+
+
+
{segment.description}
+
+
+
+ {segment.chapters.map((chapter: any, idx: number) => (
+
scrollTo(chapter.key)}
+ >
+
{`0${chapter.no}`}
+
+ {chapter.name}
+
+
+ ))}
+
+
+ ))}
+
+
+
+ )
+}
+
+const Performance = () => {
+ const Bar = (props: any) => {
+ const { color, finalPercentage, duration = 2000 } = props
+ const countTo = parseInt(finalPercentage, 10)
+ const [count, setCount] = useState(0)
+ const [animTriggered, setAnimTriggered] = useState(false)
+
+ const easeOutQuad = (t: number) => t * (2 - t)
+ const frameDuration = 1000 / 60
+
+ useEffect(() => {
+ let frame = 0
+ const totalFrames = Math.round(duration / frameDuration)
+
+ async function handleScroll() {
+ const reference = document.getElementById('performanceCharts')
+ if (reference && !animTriggered) {
+ const yOffset = reference.getBoundingClientRect().top - window.innerHeight + 20
+ if (yOffset <= 0) {
+ setAnimTriggered(true)
+ setCount(0)
+ const counter = setInterval(() => {
+ frame++
+ const progress = easeOutQuad(frame / totalFrames)
+ setCount(countTo * progress)
+
+ if (frame === totalFrames) clearInterval(counter)
+ }, frameDuration)
+ }
+ }
+ }
+
+ window.addEventListener('scroll', handleScroll, { passive: true })
+ return () => window.removeEventListener('scroll', handleScroll)
+ }, [animTriggered])
+
+ return
+ }
+
+ const ComparisonChart = () => {
+ const maxValue = 1600
+ return (
+
+ )
+ }
+
+ return (
+
+ )
+}
+
+const Security = () => {
+ return (
+
+
+
+
+
+
+
+ As an infrastructure provider, security has been a priority from day one. While we had
+ to resolve brute force attacks on our customers' databases, we internally run pen
+ tests to ensure that our own systems are air-tight.
+
+
+ Approaching the launch of our Beta period, we worked with security advisors and
+ specialists globally to enforce new measures and processes:
+
+
+
+ Employed DigitalXRAID to run a full Pen Test on both our internal and customer
+ infrastructure. We immediately patched one medium priority issue and are currently
+ in the process of resolving the minor and informational issues.
+
+
+ Published a disclosure policy so that ethical hackers can help us find
+ vulnerabilities in our systems. We've received reports from this initiative already,
+ and we'll continue to formalize our bounty program throughout the Beta.
+
+
+ We now run an ongoing internal Capture the Flag competition, where team members are
+ challenged to breach various components of our systems.
+
+
+ Adopted the{' '}
+
+ Snyk
+ {' '}
+ dependency monitor as part of our SSDLC on several key component of our system, to
+ help locate potential vulnerabilities in third party Open Source dependencies.
+
+
+ Worked with several of the open source tools that we use to improve their own
+ security. For example, PostgREST{' '}
+
+ now uses
+ {' '}
+ "parametrized" inputs, where they were previously "escaped".
+
+
+
+
+
+
+ )
+}
+
+const Reliability = () => {
+ const { basePath } = useRouter()
+ return (
+
+
+
+
+
+
+
+ During Alpha we experienced 2 availability incidents, neither affecting customer
+ access to their data. These were:
+
+
+
+ A third-party CDN API outage. As a result, subdomains were not created for new
+ projects.
+
+
+ Cloud resource limits. We maxed out our Virtual Machines limits in some popular
+ regions, and we hit the maximum number of subdomains allowed by our DNS provider.
+ These limitations are artificial and our cloud providers quickly lifted them.
+
+
+
+ Availability is one of our highest priority goals. We're continuing efforts to
+ maximize uptime and ensure user data is backed up in a secure and encrypted location.
+
+
+ We're launching{' '}
+
+ https://status.supabase.com
+ {' '}
+ to keep track of uptime across all of our services and critical infrastructure.
+
+
+
+
+
+ For our Alpha & Beta Users we take free, encrypted daily database backups up to 20GB.
+ They are available to download at any time via the dashboard.
+
+
+
+
+
+ )
+}
+
+const NewFeaturesAndIntegrations = () => {
+ const { basePath } = useRouter()
+ return (
+
+
+
+
+
+
+
+ If you're new to Supabase, here's a few of the things you get when you choose us as
+ your backend.
+
+
+
+
+ Auth
+
+
+ If you're new to Supabase, here's a few of the things you get when you choose us
+ as your backend. We provide{' '}
+
+ JavaScript
+ {' '}
+ (and{' '}
+
+ HTTP
+
+ ) APIs for your users to sign in and out of your application. You can define the
+ rows in your database that logged-in users can access (e.g. only his or her
+ shopping cart). We even provide account confirmation, recovery, and invite email
+ templates which you can customize on the dashboard, and we handle the
+ transactional emails for you. We support passwordless links, and we offer several
+ OAuth providers including Google, GitHub, with more on the way.
+
+
+
+
+
+ Realtime
+
+
+ You can{' '}
+
+ subscribe to changes in your database
+ {' '}
+ over websockets, receiving your data in realtime. Companies are using Supabase to
+ build chat applications, trigger notifications, and pipe data to analytics
+ dashboards whenever it changes in their database.
+
+
+
+
+ CRUD API
+
+
+ You can use your database immediately, without an ORM or an API backend. We
+ support GraphQL-like{' '}
+
+ querying from multiple tables
+ {' '}
+ in a single request, and you can even{' '}
+
+ invoke complex functions
+
+ .
+
+
+
+
+ Quickstart Templates
+
+
+ If you're unfamiliar with SQL, we provide a set of Quickstart Templates to get you
+ building quickly. Very soon you'll be able to deploy entire apps (front and back
+ end) with just the click of a button.
+
+
+
+
+ Table View
+
+
+ View and edit your data like a spreadsheet from within the Supabase dashboard.
+ Build your schema, create complex relationships, and import and export to csv.
+
+
+
+
+
+ SQL Editor
+
+
+ No need to install third party SQL tools, you can run queries directly from the
+ Supabase Dashboard.
+
+
+
+
+
+
+
+
+ )
+}
+
+const BetaPricing = () => (
+
+
+
+
+
+
+
For up to date pricing info see: https://supabase.com/pricing
+
+ We're working closely with many open source projects, infrastructure providers, and of
+ course our Alpha Users, to provide a predictable and sustainable pricing model.
+
+
Our key aims going into this exercise were:
+
+
+ To continue offering free Supabase instances for Students, Hobbyists, and Early
+ Adopters
+
+
+ To price based on predictable metrics (no shock bills
+ at the end of the month)
+
+
+ To grow with our users, providing a pricing model that supports their growth and allow
+ them to create value for their customers
+
+
+
We are committing to the following initiatives:
+
+
+ All Alpha Users will receive credits equivalent of 2 years of base tier usage. These
+ will automatically be credited to your account if you signed up prior to December
+ 2020.
+
+
+ All Beta Users (new users from December 2020) will receive 1 year of base tier usage
+ for free.
+
+
+ University (and participating code school) Students will be eligible for 2 years of
+ base tier usage (Code Schools can contact{' '}
+
+ rory@supabase.io
+
+ )
+
+
+ Early stage startups participating in selected incubator programs can claim additional
+ credits which can be applied to products outside of the base tier.
+
+
+
+ The Supabase Base Tier is now called the Supabase Pro tier as per the{' '}
+
+ pricing page
+
+ .
+
+
+
+
+
+)
+
+const OpenSource = () => (
+
+
+
+
+
+
+
+ Great software is multi generational and stretches beyond any single company.
+
+
+ Supabase is a collection of many projects, and we rely on making contributors to help us
+ build and improve. Because of this, we aim to make open source more accessible and
+ attractive to anyone who wants to contribute.
+
+
+ Every dollar that is given to Supabase in{' '}
+
+ sponsorship
+ {' '}
+ will be funneled back to the community to support the next generation of Open Source
+ maintainers.
+
+
+ One of the biggest barriers to Open Source is knowing exactly how to get started. We're{' '}
+
+ partnering with Strive School
+ {' '}
+ to educate the next generation of programmers in Open Source - providing tutorials,
+ Founder Office Hours, and other free resources.
+
+
+ If you teach programming, and you're interested in offering OSS tuition to your
+ students, we're actively looking for more education partners. Email{' '}
+
+ rory@supabase.io
+ {' '}
+ to find out more.
+
+
+ Come and get involved in{' '}
+
+ our GitHub.
+ {' '}
+
+
+
+
+
+)
+
+const FundingPartners = () => (
+
+
+
+
+
+
+ Building a platform that can offer all the amazing features of Firebase will take
+ resources - more than most open source tools. Ours will be a long journey and it will
+ require the help of many experienced engineers.
+
+
+ The partners we choose for this journey must be aligned with our ethos as an open source
+ company. In a few weeks we'll release the full details of our Seed round. Today, we're
+ happy to announce one key partner who needs no introduction: Mozilla.
+
+
+ Open source is at the very core of what Mozilla do - we're humbled and excited to work
+ with them.
+
+
+ Follow us on{' '}
+
+ Twitter
+ {' '}
+ and we'll let you know when we announce the details of the round.
+
+
+
+
+
+)
+
+const ScalingOurTeam = () => (
+
+
+
+
+
+
+
+ We are extremely proud of our team. We're a mix of 11 engineers, from 8 different
+ countries. Half of the team are previous founders - collectively we've founded 15
+ companies, generating millions in revenue.
+
+
+ We're also passionate about tech and open source. We hire open source maintainers to
+ work full time on the products we use, and we spend every Friday dogfooding Supabase to
+ make it better.
+
+
+ We are hiring across multiple positions including PostgreSQL engineers, Cloud engineers,
+ SRE's, and Developer Advocates. We are a fully remote team, spanning 4 continents and 10
+ nationalities. If you are interested and think you can be a factor in the success of
+ Supabase, get in touch at{' '}
+
+ work@supabase.io
+
+ .
+
+
+
+
+
+)
+
+const WhatsNext = () => (
+
+
+
+
+
+
+
+ If you watch our repos you'll see that development never stops, we ship every day (and
+ night!). We're constantly improving Supabase based on user feedback. Alongside
+ performance, security, and reliability improvements, here are some new features we're
+ working on for 2021:
+
+
+ Storage - Making blob storage easier than ever before
+
+ Functions - write and deploy serverless functions that have access to your Supabase
+ context
+
+
+ Local Emulator - Making local development more accessible with a quick start CLI for
+ any environment
+
+
+ High Availability - Database and API replicas spread globally to serve a global user
+ base
+
+
+ Multicloud - Spread your Supabase instances across multiple datacenter providers to
+ protect against outages
+
+
+ Self Hosted - 'Bring your own cloud' is essential for some businesses, and so we're
+ working on easy-deploy tooling for customers with this requirement
+
+
+ More client libraries - members of the community are helping us build client libraries
+ for many different languages including TypeScript, Python, Dart, C#, and Rust. Come
+ and help us bring Supabase to your favorite language or framework.
+
+
+
+ We depend on your feedback to continually improve Supabase. Email us at{' '}
+
+ support@supabase.io
+ {' '}
+ or join the{' '}
+
+ discussion
+ {' '}
+ on GitHub to let us know how we can help you build things faster.
+
+
+
+
+
+)
+
+const SUPABASE_AUTHOR_INDEX = 12
+
+const Beta = (props: Props) => {
+ const [menuOpen, setMenuOpen] = useState(false)
+ const { basePath } = useRouter()
+ const { darkMode } = props
+
+ const references: any = {
+ performance: useRef(null),
+ security: useRef(null),
+ reliability: useRef(null),
+ features: useRef(null),
+ pricing: useRef(null),
+ openSource: useRef(null),
+ fundingPartners: useRef(null),
+ scaling: useRef(null),
+ next: useRef(null),
+ }
+
+ const scrollTo = (key: string) => {
+ if (references[key]) {
+ references[key].current.scrollIntoView({ behavior: 'smooth', block: 'start' })
+ }
+ }
+
+ return (
+
+
+ {site_title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
setMenuOpen(!menuOpen)} />
+
+
setMenuOpen(false)}
+ className="lg:col-span-1"
+ singleBgColor={true}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Beta
diff --git a/www/pages/blog.tsx b/www/pages/blog.tsx
new file mode 100644
index 00000000000..386e5afabb2
--- /dev/null
+++ b/www/pages/blog.tsx
@@ -0,0 +1,202 @@
+import fs from 'fs'
+import { useEffect, useState } from 'react'
+
+import { useRouter } from 'next/router'
+import Image from 'next/image'
+import Link from 'next/link'
+
+import { NextSeo } from 'next-seo'
+import { generateRss } from '~/lib/rss'
+import { getSortedPosts, getAllCategories } from '~/lib/posts'
+import authors from 'lib/authors.json'
+
+import DefaultLayout from '~/components/Layouts/Default'
+import { Tabs } from '@supabase/ui'
+import PostTypes from '~/types/post'
+import BlogListItem from '~/components/Blog/BlogListItem'
+
+export async function getStaticProps() {
+ const allPostsData = getSortedPosts('_blog')
+ const categories = getAllCategories('_blog')
+ const rss = generateRss(allPostsData)
+
+ // create a rss feed in public directory
+ // rss feed is added via component in render return
+ fs.writeFileSync('./public/rss.xml', rss)
+
+ return {
+ props: {
+ blogs: allPostsData,
+ categories,
+ },
+ }
+}
+
+function Blog(props: any) {
+ const [category, setCategory] = useState('all')
+ const [blogs, setBlogs] = useState(props.blogs)
+
+ const router = useRouter()
+
+ useEffect(() => {
+ // contruct an array of blog posts
+ // not inluding the first blog post
+ const shiftedBlogs = [...props.blogs]
+ shiftedBlogs.shift()
+
+ setBlogs(
+ category === 'all'
+ ? shiftedBlogs
+ : props.blogs.filter((post: any) => {
+ const found = post.tags.includes(category)
+ return found
+ })
+ )
+ }, [category])
+
+ useEffect(() => {
+ return props.categories.unshift('all')
+ }, [])
+
+ // append 'all' category
+ // const categories = props.categories.push('all')
+ const meta_title = 'Supabase Blog: Open Source Firebase alternative Blog'
+ const meta_description = 'Get all your Supabase News on the Supabase blog.'
+
+ return (
+ <>
+
+
+
+
+
+ {props.blogs.slice(0, 1).map((blog: any, i: number) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ {props.categories.map((categoryId: string) => (
+
+ {/* {categoryId}
*/}
+ <>>
+
+ ))}
+
+
+
+
+
+
+ {blogs.map((blog: PostTypes, idx: number) => (
+
+
+
+ ))}
+
+
{' '}
+
+
+ >
+ )
+}
+
+function FeaturedThumb(blog: PostTypes) {
+ // @ts-ignore
+ const authorArray = blog.author.split(',')
+
+ const author = []
+ for (let i = 0; i < authorArray.length; i++) {
+ // @ts-ignore
+ author.push(
+ authors.find((authors: any) => {
+ // @ts-ignore
+ return authors.author_id === authorArray[i]
+ })
+ )
+ }
+
+ return (
+
+ )
+}
+
+export default Blog
diff --git a/www/pages/blog/[year]/[month]/[day]/[slug].module.css b/www/pages/blog/[year]/[month]/[day]/[slug].module.css
new file mode 100644
index 00000000000..f5f939a0445
--- /dev/null
+++ b/www/pages/blog/[year]/[month]/[day]/[slug].module.css
@@ -0,0 +1,46 @@
+/* .toc a {
+ text-decoration: none !important;
+ font-weight: 400 !important;
+}
+
+.toc > ul > li {
+ padding-left: 0 !important;
+}
+
+.toc li {
+ @apply text-sm !important;
+ padding-left: 1rem !important;
+}
+
+.toc ul > li:before {
+ content: '';
+ position: absolute;
+ background-color: none;
+ border-radius: 50%;
+ width: 0 !important;
+ height: 0 !important;
+ top: 0.6875em;
+ left: 0.25em;
+}
+
+.header:hover svg,
+.header svg:hover {
+ display: inline-block;
+}
+
+.article h1,
+.article h2,
+.article h3,
+.article h4,
+.article h5 {
+ font-weight: 500 !important;
+}
+
+.article {
+ @apply mb-16;
+}
+
+.article > div > pre {
+ padding: 0;
+ background: none;
+} */
diff --git a/www/pages/blog/[year]/[month]/[day]/[slug].tsx b/www/pages/blog/[year]/[month]/[day]/[slug].tsx
new file mode 100644
index 00000000000..2c5e98dc567
--- /dev/null
+++ b/www/pages/blog/[year]/[month]/[day]/[slug].tsx
@@ -0,0 +1,434 @@
+import { Badge, Card, Divider, IconChevronLeft, IconFile, Space } from '@supabase/ui'
+import matter from 'gray-matter'
+import authors from 'lib/authors.json'
+import hydrate from 'next-mdx-remote/hydrate'
+import renderToString from 'next-mdx-remote/render-to-string'
+import { NextSeo } from 'next-seo'
+import Link from 'next/link'
+import Image from 'next/image'
+import { useRouter } from 'next/router'
+import React from 'react'
+import ReactMarkdown from 'react-markdown'
+import CodeBlock from '~/components/CodeBlock/CodeBlock'
+import CTABanner from '~/components/CTABanner'
+import DefaultLayout from '~/components/Layouts/Default'
+import Quote from '~/components/Quote'
+import ImageGrid from '~/components/ImageGrid'
+import { generateReadingTime } from '~/lib/helpers'
+import { getAllPostSlugs, getPostdata, getSortedPosts } from '~/lib/posts'
+import blogStyles from './[slug].module.css'
+
+// import all components used in blog articles here
+// for instance, if you use a button, you must add `Button` in the components object below.
+const components = {
+ CodeBlock,
+ Quote,
+ code: (props: any) => {
+ return
+ },
+ ImageGrid,
+}
+
+// plugins for next-mdx-remote
+const gfm = require('remark-gfm')
+const slug = require('rehype-slug')
+
+// table of contents extractor
+const toc = require('markdown-toc')
+
+export async function getStaticPaths() {
+ const paths = getAllPostSlugs('_blog')
+ return {
+ paths,
+ fallback: false,
+ }
+}
+
+export async function getStaticProps({ params }: any) {
+ const filePath = `${params.year}-${params.month}-${params.day}-${params.slug}`
+ const postContent = await getPostdata(filePath, '_blog')
+ const { data, content } = matter(postContent)
+
+ const mdxSource: any = await renderToString(content, {
+ components,
+ scope: data,
+ mdxOptions: {
+ remarkPlugins: [gfm],
+ rehypePlugins: [slug],
+ },
+ })
+
+ const relatedPosts = getSortedPosts('_blog', 5, mdxSource.scope.tags)
+
+ const allPosts = getSortedPosts('_blog')
+
+ const currentIndex = allPosts
+ .map(function (e) {
+ return e.slug
+ })
+ .indexOf(filePath)
+
+ const nextPost = allPosts[currentIndex + 1]
+ const prevPost = allPosts[currentIndex - 1]
+
+ return {
+ props: {
+ prevPost: currentIndex === 0 ? null : prevPost ? prevPost : null,
+ nextPost: currentIndex === allPosts.length ? null : nextPost ? nextPost : null,
+ relatedPosts,
+ blog: {
+ slug: `${params.year}/${params.month}/${params.day}/${params.slug}`,
+ content: mdxSource,
+ ...data,
+ toc: toc(content, { maxdepth: data.toc_depth ? data.toc_depth : 2 }),
+ },
+ },
+ }
+}
+
+function BlogPostPage(props: any) {
+ // @ts-ignore
+ const content = hydrate(props.blog.content, { components })
+ const authorArray = props.blog.author.split(',')
+
+ const author = []
+ for (let i = 0; i < authorArray.length; i++) {
+ author.push(
+ // @ts-ignore
+ authors.find((authors: string) => {
+ // @ts-ignore
+ return authors.author_id === authorArray[i]
+ })
+ )
+ }
+
+ const { basePath } = useRouter()
+
+ const NextCard = (props: any) => {
+ const { post, label, className } = props
+ return (
+
+
+
+
+
+
+
{post.title}
+
{post.date}
+
+
+
+
+
+ )
+ }
+
+ const toc = props.blog.toc && (
+
+
+
+ {props.blog.tags.map((tag: string) => {
+ return (
+
+ {tag}
+
+ )
+ })}
+
+
+
+
On this page
+
+
+ {props.blog.toc.content}
+
+
+
+
+ )
+
+ return (
+ <>
+ {
+ return cat
+ }),
+ },
+ images: [
+ {
+ url: `https://supabase.com${basePath}/images/blog/${
+ props.blog.image ? props.blog.image : props.blog.thumb
+ }`,
+ },
+ ],
+ }}
+ />
+
+
+
+
+
+ {/* Title and description */}
+
+
+
Blog post
+
{props.blog.title}
+
+
{props.blog.date}
+
•
+
{generateReadingTime(props.blog.content.renderedOutput)}
+
+
+ {author.map((author: any) => {
+ return (
+
+ )
+ })}
+
+
+
+
+ {/* Content */}
+
+ {props.blog.thumb && (
+
+
+
+ )}
+
+ {content}
+
+
+
+ Share this article
+
+
+
+
+
+ {props.prevPost && }
+
+
+ {props.nextPost && (
+
+ )}
+
+
+
+ {/* Sidebar */}
+
+
+
{toc}
+
+
+
+ {props.relatedPosts.map((post: any) => (
+
+
+
+
+
+
+
+
+ {post.title}
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+
+
+ {props.blog.thumb && (
+
+ )}
+
{toc}
+
+ {content}
+
+
+
+
+ {toc}
+
+
+ Related articles
+
+
+ {props.relatedPosts.map((post: any) => (
+
+
+
+
+
+
+ {post.title}
+
+
+
+
+
+
+ ))}
+
+
+
+
+ View all posts
+
+
+
+
+
+
+
+
+
+
+
{props.prevPost && }
+
+ {props.nextPost && (
+
+ )}
+
+
+
+
*/}
+
+
+
+ >
+ )
+}
+
+// function BlogPostPage() {
+// return blog post
+// }
+
+export default BlogPostPage
diff --git a/www/pages/blog/tags/[tag].tsx b/www/pages/blog/tags/[tag].tsx
new file mode 100644
index 00000000000..b68d6001735
--- /dev/null
+++ b/www/pages/blog/tags/[tag].tsx
@@ -0,0 +1,59 @@
+import { NextSeo } from 'next-seo'
+import { getSortedPosts, getAllCategories } from '~/lib/posts'
+import Link from 'next/link'
+
+import DefaultLayout from '~/components/Layouts/Default'
+import BlogListItem from '~/components/Blog/BlogListItem'
+import PostTypes from '~/types/post'
+
+export async function getStaticProps({ params }: any) {
+ const posts = getSortedPosts('_blog', 0, [params.tag])
+ return {
+ props: {
+ tag: params.tag,
+ blogs: posts,
+ },
+ }
+}
+
+export async function getStaticPaths() {
+ const categories = getAllCategories('_blog')
+ return {
+ paths: categories.map((category: any) => ({ params: { tag: category } })),
+ fallback: false,
+ }
+}
+
+interface Props {
+ tag: string
+ blogs: PostTypes[]
+}
+
+function TagBlogsPage(props: Props) {
+ const { blogs, tag } = props
+ return (
+ <>
+
+
+
+
+
+ Blog
+
+
/
+
{`${tag}`}
+
+
+ {blogs.map((blog: PostTypes, idx: number) => (
+
+
+
+ ))}
+
+
+
+ >
+ )
+}
+
+export default TagBlogsPage
diff --git a/www/pages/brand-assets.tsx b/www/pages/brand-assets.tsx
new file mode 100644
index 00000000000..551c3157e2a
--- /dev/null
+++ b/www/pages/brand-assets.tsx
@@ -0,0 +1,81 @@
+import Container from 'components/Container'
+
+import Layout from '~/components/Layouts/Default'
+import CTABanner from 'components/CTABanner/index'
+import { Button, IconDownload } from '@supabase/ui'
+
+import { useRouter } from 'next/router'
+
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import { NextSeo } from 'next-seo'
+import Image from 'next/image'
+
+const Index = () => {
+ // base path for images
+ const router = useRouter()
+
+ const meta_title = 'Branding | Supabase'
+ const meta_description = 'Get Supabase Brand assets here.'
+
+ return (
+ <>
+
+
+
+
+
+
Brand assets
+
Download official Supabase logos
+
+ All Supabase trademarks, logos, or other brand elements can never be modified or
+ used for any other purpose other than to represent Supabase Inc.
+
+
+
+
+
+
+
+
+
+
+
+
Supabase logos
+
+
+ Download Supabase official logos, including as SVG's, in both light and dark
+ theme.
+
+
Do not use any other color for the wordmark.
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default Index
diff --git a/www/pages/company.tsx b/www/pages/company.tsx
new file mode 100644
index 00000000000..83782d84336
--- /dev/null
+++ b/www/pages/company.tsx
@@ -0,0 +1,344 @@
+import { useRouter } from 'next/router'
+
+import Container from 'components/Container'
+import Layout from '~/components/Layouts/Default'
+
+import SectionHeader from 'components/UI/SectionHeader'
+import CTABanner from 'components/CTABanner/index'
+import ImageGrid from 'components/ImageGrid'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+
+import PressData from 'data/Press'
+import CommunityData from 'data/Community'
+import CompaniesData from 'data/Companies'
+import InvestorData from 'data/Investors'
+import TeamData from 'data/Team'
+
+import Image from 'next/image'
+
+import {
+ Button,
+ Card,
+ IconChevronRight,
+ IconGitHub,
+ IconLinkedin,
+ IconTwitter,
+ Space,
+} from '@supabase/ui'
+import { NextSeo } from 'next-seo'
+
+type Props = {}
+
+const Index = ({}: Props) => {
+ const router = useRouter()
+
+ const meta_title = "One of the world's fastest-growing open source communities | Supabase"
+ const meta_description =
+ 'Supabase is the community that builds the infrastructure for your applications. Build using Supabase for any size project—from a new startup to even large growing companies'
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default Index
+
+const Header = () => {
+ return (
+ <>
+
+
+ Join one of the world's fastest growing open source communities.
+
+
+ >
+ )
+}
+
+const Team = () => {
+ interface iIconLink {
+ link: string
+ icon: React.ReactNode
+ }
+
+ const IconLink = ({ link, icon }: iIconLink) => {
+ return (
+
+ {icon}
+
+ )
+ }
+
+ return (
+
+
+
} />
+
+
+
+
+ Supabase is fully remote, with a strong affinity for open source maintainers and
+ ex-Founders. Our engineering team is made up of developers from AWS, Google,
+ Palantir, Stripe, and other YC companies.
+
+
+
+
+
+ {/*
+ {TeamData.filter((x) => x.active).map((x) => (
+
+
+
+
+
+
+
+
+ {x.name}
+
+
+ {x.department}
+
+
+
+ {x.twitter && (
+ }
+ link={x.twitter}
+ />
+ )}
+ {x.github && (
+ }
+ link={x.github}
+ />
+ )}
+ {x.linkedin && (
+ }
+ link={x.linkedin}
+ />
+ )}
+
+
+
+
+ ))}
+
*/}
+
+
+ )
+}
+
+const Community = () => {
+ const { basePath } = useRouter()
+
+ return (
+
+ {/*
+
+
+ Join one of the world's fastest growing open source communities. Let's build
+ together.
+
+
+ >
+ }
+ /> */}
+
+
+ {CommunityData.map((x, i) => (
+
+
+
+
+
+
{x.stat}
+
{x.statLabel}
+
+
+ ))}
+
+
+
+
+ With developer signups from the world's leading brands.
+
+
+
+
+
+
+
+ )
+}
+
+const Investors = () => {
+ return (
+
+
+
+
+
+ We've raised over $36 million in funding, backed by some of the world's leading
+ investors.
+
+
+ >
+ }
+ />
+
+
+
+ {InvestorData.filter((x) => x.lead === true).map((x) => (
+
+ ))}
+
+ Individual investors
+
+ {InvestorData.filter((x) => x.lead === false)
+ .sort((a, b) => a.name.localeCompare(b.name))
+ .map((x) => (
+
+ {x.img &&
}
+
+
+
+ ))}
+
+
+ )
+}
+
+const Press = () => {
+ return (
+
+
+
+
+
+
+
+ )
+}
diff --git a/www/pages/contact/enterprise.tsx b/www/pages/contact/enterprise.tsx
new file mode 100644
index 00000000000..1396b8c495f
--- /dev/null
+++ b/www/pages/contact/enterprise.tsx
@@ -0,0 +1,38 @@
+import { NextSeo } from 'next-seo'
+import { useRouter } from 'next/router'
+import EnterpriseContactForm from '~/components/EnterpriseContactForm'
+import DefaultLayout from '~/components/Layouts/Default'
+
+const meta_title = 'Enterprise Contact | Supabase'
+const meta_description = 'Contact Supabase for enterprise sales and pricing.'
+
+const EnterpriseContactPage = () => {
+ const router = useRouter()
+
+ return (
+
+
+
+
+
Contact Enterprise Sales
+
+
+
+
+ )
+}
+
+export default EnterpriseContactPage
diff --git a/www/pages/database/Database.css b/www/pages/database/Database.css
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/www/pages/database/Database.tsx b/www/pages/database/Database.tsx
new file mode 100644
index 00000000000..59e1e989be7
--- /dev/null
+++ b/www/pages/database/Database.tsx
@@ -0,0 +1,318 @@
+import { Badge, Button, IconArrowUpRight, IconShuffle, IconX, Space, Tabs } from '@supabase/ui'
+// data
+import ApiExamplesData from 'data/products/database/api-examples'
+import ExtensionsExamplesData from 'data/products/database/extensions-examples'
+import SqlViewCarouselData from 'data/products/database/sql-view-carousel.json'
+import TableViewCarouselData from 'data/products/database/table-view-carousel.json'
+import Solutions from 'data/Solutions.json'
+import { NextSeo } from 'next-seo'
+import Image from 'next/image'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import { useState } from 'react'
+import { Swiper, SwiperSlide } from 'swiper/react'
+// Import Swiper styles
+import 'swiper/swiper.min.css'
+import ImageCarousel from '~/components/Carousels/ImageCarousel'
+import SplitCodeBlockCarousel from '~/components/Carousels/SplitCodeBlockCarousel'
+import FeatureColumn from '~/components/FeatureColumn'
+import FloatingIcons from '~/components/FloatingIcons'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import ProductIcon from '~/components/ProductIcon'
+import APISection from '~/components/Sections/APISection'
+import GithubExamples from '~/components/Sections/GithubExamples'
+import ProductHeader from '~/components/Sections/ProductHeader'
+import TweetCard from '~/components/TweetCard'
+
+// install Swiper's Controller component
+// SwiperCore.use([Controller])
+
+function Database() {
+ // base path for images
+ const { basePath } = useRouter()
+
+ const [dashboardSwiper, setDashboardSwiper] = useState(undefined)
+ const [dashboardSwiperActiveIndex, setDashboardSwiperActiveIndex] = useState(0)
+
+ function handleDashboardSwiperNav(e: number) {
+ setDashboardSwiperActiveIndex(e)
+ // @ts-ignore
+ dashboardSwiper.slideTo(e)
+ }
+
+ const meta_title = 'Database | Open source SQL Database'
+ const meta_description =
+ 'With supabase’s APIs and easy to use dashboard, it makes designing relational databases easy.'
+
+ return (
+ <>
+
+
+
+ Open Source SQL Database
+ (without the hassle)
+ ,
+ ]}
+ subheader={[
+ 'Every Supabase project is a dedicated PostgreSQL database, trusted by millions of developers.',
+ 'PostgreSQL is one of the worlds most scalable databases.',
+ ]}
+ image={[
+
+
+
,
+
+
+
,
+ ]}
+ documentation_url={'/docs/guides/database'}
+ />
+
+
+
+
+
+
Just Postgres
+
Every Supabase project is a dedicated Postgres database.
+
+ 100% portable. Bring your existing Postgres database, or migrate away at any time.
+
+
+
+
+
+
Built-in Auth
+
Leveraging PostgreSQL's proven Row Level Security.
+
+ Integrated with JWT authentication which controls exactly what your users can
+ access.
+
+
+
+
+
+
Realtime enabled
+
Data-change listeners over websockets.
+
+ Subscribe and react to database changes, milliseconds after they happen.
+
+
+
+
+
+ {/* ÷ */}
+
+
+
+
Easy to use dashboard
+
+
+ The simplicity of a Table Editor, or the power of a SQL editor. Your choice.
+
+
+
+
+
+
+ handleDashboardSwiperNav(Number(e))}
+ type="underlined"
+ tabBarStyle={{
+ marginBottom: 0,
+ // borderBottom: '1px solid #dedede',
+ }}
+ // block
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ,
+ ]}
+ />
+
+
+
+
+ ,
+ ]}
+ />
+
+
+
+
+
+
+
+ We introspect your database and provide instant APIs. Focus on building your
+ product, while Supabase handles the CRUD.
+ ,
+ ]}
+ footer={[
+
+
+
+
Libraries coming soon:
+
+
+ Python
+ Dart
+ C#
+ Kotlin
+
+
+
+ {/* */}
+
+
,
+ ]}
+ documentation_link={'/docs/guides/database'}
+ />
+
+
+
+
+
+
+
+
Extend your database
+
+
Supabase works natively with Postgres extensions.
+
+ Choose from a huge collection of Postgres extensions, enabled with a single click.
+
+
+
+
+
}>
+ Explore documentation
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default Database
diff --git a/www/pages/database/index.tsx b/www/pages/database/index.tsx
new file mode 100644
index 00000000000..446df005cc9
--- /dev/null
+++ b/www/pages/database/index.tsx
@@ -0,0 +1,3 @@
+import Database from './Database'
+
+export default Database
diff --git a/www/pages/edge-functions/edge-functions.css b/www/pages/edge-functions/edge-functions.css
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/www/pages/edge-functions/edge-functions.tsx b/www/pages/edge-functions/edge-functions.tsx
new file mode 100644
index 00000000000..68467dd6021
--- /dev/null
+++ b/www/pages/edge-functions/edge-functions.tsx
@@ -0,0 +1,303 @@
+import { Badge, IconCode, IconFastForward, IconGlobe, IconRefreshCcw } from '@supabase/ui'
+import UseCaseExamples from 'data/products/functions/usecase-examples'
+import Solutions from 'data/Solutions.json'
+import { NextSeo } from 'next-seo'
+import Image from 'next/image'
+import { useRouter } from 'next/router'
+import { useState } from 'react'
+import 'swiper/swiper.min.css'
+import CTABanner from '~/components/CTABanner'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import ScrollableCodeBlock from '~/components/ScrollableCodeBlock'
+import FunctionsUsecases from '~/components/Sections/FunctionsUsecases'
+import ProductHeader from '~/components/Sections/ProductHeader'
+
+const featureBlocks = [
+ {
+ title: 'Instant deployment',
+ description: 'Deploy Edge Functions in seconds',
+ highlightLines: '8',
+ icon: ,
+ },
+ {
+ title: 'Global',
+ description: 'Deployed to 29 regions worldwide',
+ highlightLines: '8',
+ icon: ,
+ },
+ {
+ title: 'Typescript ready',
+ description: 'TypeScript, WASM, ES Modules',
+ highlightLines: '8',
+ icon: ,
+ },
+ {
+ title: 'Async triggers',
+ description: 'Invoke Edge Functions based on any event in your database',
+ highlightLines: '28',
+ icon: ,
+ badge: 'Coming soon',
+ },
+]
+
+const featureHighlights = [
+ {
+ title: 'Set authentication',
+ description: 'Use the JWT token to set the authentication of the user',
+ highlightLines: '15..20',
+ },
+ {
+ title: 'Use anything from Supabase',
+ description:
+ 'supabase-js can interact with any part of the Supabase stack from Edge Functions, while respecting auth row level security policies.',
+ highlightLines: '22..27',
+ },
+ {
+ title: 'Use secrets to store sensitive keys',
+ description:
+ 'Set and edit secrets via the CLI, which can then be accessed via environment variables.',
+ highlightLines: '7..13',
+ },
+ {
+ title: 'No limits',
+ description: `You're empowered to run any logic you like using any data from the Supabase database.`,
+ highlightLines: '29..39',
+ },
+]
+
+function Database() {
+ // base path for images
+ const { basePath } = useRouter()
+
+ const [dashboardSwiper, setDashboardSwiper] = useState(undefined)
+ const [dashboardSwiperActiveIndex, setDashboardSwiperActiveIndex] = useState(0)
+
+ function handleDashboardSwiperNav(e: number) {
+ setDashboardSwiperActiveIndex(e)
+ // @ts-ignore
+ dashboardSwiper.slideTo(e)
+ }
+
+ const title = 'Serverless Edge Functions that automatically scale'
+ const subtitle = `Execute your code closest to your users with fast deploy times and low latency.`
+ const meta_title = `${title}`
+ const meta_description = subtitle
+
+ const [currentSelection, setCurrentSelection] = useState(featureHighlights[0].highlightLines)
+
+ return (
+ <>
+
+
+
+ Serverless Edge Functions
+ that automatically scale
+ ,
+ ]}
+ subheader={[subtitle, 'PostgreSQL is one of the worlds most scalable databases.']}
+ image={[
+
+
+
,
+
+
+
,
+ ]}
+ documentation_url={'/docs/guides/functions'}
+ />
+
+
+
+
+ {featureBlocks.map((item) => {
+ return (
+
+
+ {item.icon ? item.icon : }
+
+
+
+
{item.title}
+
{item.description}
+
+
+ )
+ })}
+
+
+
+
+
+
+
+
+
+
Anatomy of an Edge Function
+
+ Asynchronous tasks within minutes using Supabase Functions with simple
+ authenticated access to the rest of the Supabase Ecosystem.
+
+
+
+ {featureHighlights.map((feat, i) => {
+ const active = currentSelection == feat.highlightLines
+ return (
+
setCurrentSelection(feat.highlightLines)}
+ >
+
+ {feat.title}
+
+
+ {feat.description}
+
+
+ )
+ })}
+
+
+
+
+ {`import { serve } from 'https://deno.land/std@0.131.0/http/server.ts'
+import Stripe from 'https://esm.sh/stripe?target=deno&no-check'
+import { Customer } from 'types'
+
+serve(async (req) => {
+ try {
+ // create a supabase client
+ const supabaseClient = createClient(
+ Deno.env.get('SUPABASE_URL') ?? '',
+ Deno.env.get('SUPABASE_ANON_KEY') ?? ''
+ )
+ // create a stripe client
+ const stripe = Stripe(Deno.env.get('STRIPE_SECRET_KEY'))
+
+ // Get the authorization header from the request.
+ const authHeader = req.headers.get('Authorization').replace("Bearer ","")
+ // Client now respects auth policies for this user
+ supabaseClient.auth.setAuth(authHeader)
+ // set the user profile
+ const user = supabase.auth.user()
+
+ // Retrieve user metadata that only the user is allowed to select
+ const { data, error } = await supabaseClient
+ .from('user_profiles')
+ .select('address, tax, billing_email, phone')
+
+ if (error) throw error
+
+ const customer = await stripe.customers.create({
+ description: 'My First Stripe Customer (created by a Supabase edge function)',
+ phone: data.phone,
+ address: data.address,
+ email: user.email,
+ })
+
+ return new Response(JSON.stringify(customer), { status: 200 })
+ } catch (error) {
+ return new Response(JSON.stringify(error), { status: 400 })
+ }
+})`}
+
+
+
+
+
+
+
+
+ Edge Functions are perfect for running code for sensitive use cases or interacting
+ with 3rd party services.
+ ,
+ ]}
+ footer={[
+
+
+
+
Libraries coming soon:
+
+
+ Python
+ Dart
+ C#
+ Kotlin
+
+
+
+
,
+ ]}
+ documentation_link={'/docs/guides/functions'}
+ />
+
+
+
+
+ >
+ )
+}
+
+export default Database
diff --git a/www/pages/edge-functions/index.tsx b/www/pages/edge-functions/index.tsx
new file mode 100644
index 00000000000..561ca2a0547
--- /dev/null
+++ b/www/pages/edge-functions/index.tsx
@@ -0,0 +1,3 @@
+import EdgeFunctions from './edge-functions'
+
+export default EdgeFunctions
diff --git a/www/pages/index.tsx b/www/pages/index.tsx
new file mode 100644
index 00000000000..533271b89cf
--- /dev/null
+++ b/www/pages/index.tsx
@@ -0,0 +1,38 @@
+import Container from 'components/Container'
+import Layout from '~/components/Layouts/Default'
+import Hero from 'components/Hero'
+
+import Features from 'components/Features/index'
+import BuiltExamples from 'components/BuiltWithSupabase/index'
+import MadeForDevelopers from 'components/MadeForDevelopers/index'
+import AdminAccess from 'components/AdminAccess/index'
+import CaseStudies from 'components/CaseStudies/index'
+import CTABanner from 'components/CTABanner/index'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import TwitterSocialSection from '~/components/TwitterSocialSection'
+
+// Import Swiper styles if swiper used on page
+import 'swiper/swiper.min.css'
+
+type Props = {}
+
+const Index = ({}: Props) => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default Index
diff --git a/www/pages/partners/[slug].tsx b/www/pages/partners/[slug].tsx
new file mode 100644
index 00000000000..aed590557d2
--- /dev/null
+++ b/www/pages/partners/[slug].tsx
@@ -0,0 +1,225 @@
+import { IconChevronLeft, IconExternalLink } from '@supabase/ui'
+import { marked } from 'marked'
+import { GetStaticPaths, GetStaticProps } from 'next'
+import { NextSeo } from 'next-seo'
+import Image from 'next/image'
+import Link from 'next/link'
+import { Swiper, SwiperSlide } from 'swiper/react'
+import 'swiper/swiper.min.css'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import supabase from '~/lib/supabase'
+import { Partner } from '~/types/partners'
+import Error404 from '../404'
+
+function Partner({ partner }: { partner: Partner }) {
+ if (!partner) return
+ return (
+ <>
+
+
+
+
+
+ {/* Back button */}
+
+
+
+ Back
+
+
+
+
+
+
+ {partner.title}
+
+
+
+
+
+ {partner.images.map((image: any, i: number) => {
+ return (
+
+
+
+
+
+ )
+ })}
+
+
+
+
+
+
+
+
+ Details
+
+
+
+
+ Developer
+ {partner.developer}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+// This function gets called at build time
+export const getStaticPaths: GetStaticPaths = async () => {
+ const { data: slugs } = await supabase.from('partners').select('slug')
+
+ const paths: {
+ params: { slug: string }
+ locale?: string | undefined
+ }[] =
+ slugs?.map(({ slug }) => ({
+ params: {
+ slug,
+ },
+ })) ?? []
+
+ return {
+ paths,
+ fallback: 'blocking',
+ }
+}
+
+// This also gets called at build time
+export const getStaticProps: GetStaticProps = async ({ params }) => {
+ let { data: partner } = await supabase
+ .from('partners')
+ .select('*')
+ .eq('slug', params!.slug as string)
+ .single()
+
+ if (!partner) {
+ return {
+ notFound: true,
+ }
+ }
+
+ // Parse markdown
+ partner.overview = marked.parse(partner.overview)
+
+ return {
+ props: { partner },
+ revalidate: 18000, // In seconds - refresh every 5 hours
+ }
+}
+
+export default Partner
diff --git a/www/pages/partners/experts/index.tsx b/www/pages/partners/experts/index.tsx
new file mode 100644
index 00000000000..1643998f400
--- /dev/null
+++ b/www/pages/partners/experts/index.tsx
@@ -0,0 +1,139 @@
+import { NextSeo } from 'next-seo'
+import { useRouter } from 'next/router'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import BecomeAPartner from '~/components/Partners/BecomeAPartners'
+import PartnerLinkBox from '~/components/Partners/PartnerLinkBox'
+import supabase from '~/lib/supabase'
+import { Partner } from '~/types/partners'
+import TileGrid from '../../../components/Partners/TileGrid'
+
+export async function getStaticProps() {
+ const { data: partners } = await supabase
+ .from('partners')
+ .select('*')
+ .eq('approved', true)
+ .eq('type', 'expert')
+ .order('category')
+ .order('title')
+
+ return {
+ props: {
+ partners,
+ },
+ revalidate: 18000, // In seconds - refresh every 5 hours
+ }
+}
+
+interface Props {
+ partners: Partner[]
+}
+
+function ExpertPartnersPage(props: Props) {
+ const { partners } = props
+ const partnersByCategory: { [category: string]: Partner[] } = {}
+ partners.map(
+ (p) => (partnersByCategory[p.category] = [...(partnersByCategory[p.category] ?? []), p])
+ )
+ const router = useRouter()
+
+ const meta_title = 'Find an expert'
+ const meta_description = `Find an expert to help build your next idea.`
+
+ return (
+ <>
+
+
+
+
+
{meta_title}
+ {meta_description}
+
+
+
+ {/* Horizontal link menu */}
+
+ {/* Search Bar */}
+
+
Explore more
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+
+ {/* Partner Tiles */}
+
+ {partners.length ? (
+
+ ) : (
+
No Partners Found
+ )}
+
+
+
+
+ {/* Become a partner form */}
+
+
+
+ >
+ )
+}
+
+export default ExpertPartnersPage
diff --git a/www/pages/partners/integrations/index.tsx b/www/pages/partners/integrations/index.tsx
new file mode 100644
index 00000000000..0b9517396f3
--- /dev/null
+++ b/www/pages/partners/integrations/index.tsx
@@ -0,0 +1,238 @@
+import { IconLoader, IconSearch, Input } from '@supabase/ui'
+import { NextSeo } from 'next-seo'
+import { useRouter } from 'next/router'
+import React, { useEffect, useState } from 'react'
+import { useDebounce } from 'use-debounce'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import BecomeAPartner from '~/components/Partners/BecomeAPartners'
+import PartnerLinkBox from '~/components/Partners/PartnerLinkBox'
+import supabase from '~/lib/supabase'
+import { Partner } from '~/types/partners'
+import TileGrid from '../../../components/Partners/TileGrid'
+
+export async function getStaticProps() {
+ const { data: partners } = await supabase
+ .from('partners')
+ .select('*')
+ .eq('approved', true)
+ .eq('type', 'technology')
+ .order('category')
+ .order('title')
+
+ return {
+ props: {
+ partners,
+ },
+ // TODO: consider using Next.js' On-demand Revalidation with Supabase function hooks instead
+ revalidate: 18000, // In seconds - refresh every 5 hours
+ }
+}
+
+interface Props {
+ partners: Partner[]
+}
+
+function IntegrationPartnersPage(props: Props) {
+ const { partners: initialPartners } = props
+ const [partners, setPartners] = useState(initialPartners)
+
+ const allCategories = Array.from(new Set(initialPartners.map((p) => p.category)))
+
+ const partnersByCategory: { [category: string]: Partner[] } = {}
+ partners.forEach(
+ (p) => (partnersByCategory[p.category] = [...(partnersByCategory[p.category] ?? []), p])
+ )
+ const router = useRouter()
+
+ const meta_title = 'Find an Integration'
+ const meta_description = `Use your favorite tools with Supabase.`
+
+ const [search, setSearch] = useState('')
+ const [debouncedSearchTerm] = useDebounce(search, 300)
+ const [isSearching, setIsSearching] = useState(false)
+
+ useEffect(() => {
+ const searchPartners = async () => {
+ setIsSearching(true)
+
+ let query = supabase
+ .from('partners')
+ .select('*')
+ .eq('approved', true)
+ .order('category')
+ .order('title')
+
+ if (search.trim()) {
+ query = query
+ // @ts-ignore
+ .textSearch('tsv', `${search.trim()}`, {
+ type: 'websearch',
+ config: 'english',
+ })
+ }
+
+ const { data: partners } = await query
+
+ return partners
+ }
+
+ if (search.trim() === '') {
+ setIsSearching(false)
+ setPartners(initialPartners)
+ return
+ }
+
+ searchPartners().then((partners) => {
+ if (partners) {
+ setPartners(partners)
+ }
+
+ setIsSearching(false)
+ })
+ }, [debouncedSearchTerm, router])
+
+ return (
+ <>
+
+
+
+
+
{meta_title}
+ {meta_description}
+
+ {/* Title */}
+
+
+ {/* Horizontal link menu */}
+
+ {/* Search Bar */}
+
+
}
+ placeholder="Search..."
+ type="text"
+ // className="md:w-1/2"
+ value={search}
+ onChange={(e) => setSearch(e.target.value)}
+ actions={
+ isSearching && (
+
+
+
+ )
+ }
+ />
+
+
Categories
+
+ {allCategories.map((category) => (
+ router.push(`#${category.toLowerCase()}`)}
+ className="block text-base text-scale-1100"
+ >
+ {category}
+
+ ))}
+
+
+
+
Explore more
+
+
+
+
+ }
+ />
+
+
+
+
+ }
+ />
+
+
+ {/*
*/}
+
+
+
+ {/* Partner Tiles */}
+
+ {partners.length ? (
+
+ ) : (
+
No Partners Found
+ )}
+
+
+
+ {/* Become a partner form */}
+
+
+
+ >
+ )
+}
+
+export default IntegrationPartnersPage
diff --git a/www/pages/pricing/CHANGELOG.txt b/www/pages/pricing/CHANGELOG.txt
new file mode 100644
index 00000000000..cb67010b3d2
--- /dev/null
+++ b/www/pages/pricing/CHANGELOG.txt
@@ -0,0 +1,37 @@
+Pricing Changelog
+
+
+### 31 March 2022
+----
+
+Edge Functions pricing announced
+
+
+### 29 March 2022
+----
+
+— Enterprise pricing plan announced
+
+— Pay as you go plan now the same as the Pro plan
+
+
+27 August 2021
+----
+
+- Changes "Dedicated support" to "Designated support".
+ - Dedicated = one individual solely focused on an account.
+ - Designated = individual who may be helping across various accounts, but still a single point of contact. May be dedicated or non-dedicated.
+
+
+28 July 2021
+----
+
+- Clarified pricing on the "Optimized database instances" to include the starting price of $50/month.
+
+
+### 29 March 2021
+----
+
+Released our Beta pricing.
+
+
diff --git a/www/pages/pricing/index.tsx b/www/pages/pricing/index.tsx
new file mode 100644
index 00000000000..6854dc16393
--- /dev/null
+++ b/www/pages/pricing/index.tsx
@@ -0,0 +1,669 @@
+import { ServerIcon, SupportIcon } from '@heroicons/react/outline'
+import { Accordion, Button, IconCheck } from '@supabase/ui'
+import Solutions from 'data/Solutions.json'
+import { NextSeo } from 'next-seo'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import React from 'react'
+import ReactMarkdown from 'react-markdown'
+import CTABanner from '~/components/CTABanner'
+import DefaultLayout from '~/components/Layouts/Default'
+import PricingAddOnTable from '~/components/PricingAddOnTable'
+import { PricingTableRowDesktop, PricingTableRowMobile } from '~/components/PricingTableRow'
+import pricing from '~/data/Pricing.json'
+import pricingAddOn from '~/data/PricingAddOn.json'
+import pricingFaq from '~/data/PricingFAQ.json'
+
+export default function IndexPage() {
+ const router = useRouter()
+
+ const meta_title = 'Pricing & fees | Supabase'
+ const meta_description =
+ 'Explore Supabase fees and pricing information. Find our competitive pricing tiers, with no hidden pricing. We have generous free tiers for those getting started, and Pay As You Go for those scaling up.'
+
+ /**
+ * @mildtomato same plan metadata is also in /studio dashboard
+ * would be good if this constant was shared across apps
+ *
+ * https://github.com/supabase/supabase/blob/master/www/pages/pricing/index.tsx
+ */
+ const tiers = [
+ {
+ name: 'Free',
+ href: '#',
+ priceMonthly: 0,
+ warning: 'Limit of 2 free projects',
+ description: 'Perfect for passion projects & simple websites.',
+ features: [
+ 'Up to 500MB database & 1GB file storage',
+ 'Up to 2GB bandwidth',
+ 'Up to 50MB file uploads',
+ 'Social OAuth providers',
+ 'Up to 500K Edge Function invocations',
+ '1-day log retention',
+ 'Community support',
+ ],
+ additional: 'Free projects are paused after 1 week of inactivity.',
+
+ cta: 'Get Started',
+ },
+ {
+ name: 'Pro',
+ href: '#',
+ from: true,
+ priceMonthly: 25,
+ warning: '+ additional use',
+ description: 'For production applications with the option to scale.',
+ features: [
+ '8GB database & 100GB file storage',
+ '50GB bandwith',
+ '3GB file uploads',
+ 'Social OAuth providers',
+ '2M Edge Function invocations',
+ 'Daily backups',
+ '7-day log retention',
+ 'No project pausing',
+ 'Email support',
+ ],
+ scale: 'Additional fees apply for usage and storage beyond the limits above.',
+ shutdown: '',
+ preface: 'Everything below included in the base plan',
+ additional: 'Need more? Turn off your spend cap to Pay As You Grow ',
+ cta: 'Get Started',
+ },
+ {
+ name: 'Enterprise',
+ href: '/contact/enterprise',
+ description: 'For large-scale applications managing serious workloads.',
+ features: [
+ `Point in time recovery`,
+ `Designated Support manager & SLAs`,
+ `Enterprise OAuth providers`,
+ `SSO/ SAML`,
+ `SOC2`,
+ `Custom contracts & invoicing`,
+ `On-premise support`,
+ `24×7×365 premium enterprise support`,
+ ],
+ scale: '',
+ shutdown: '',
+ cta: 'Contact Us',
+ },
+ ]
+
+ const MobileHeaders = ({
+ // title,
+ description,
+ priceDescription,
+ price,
+ tier,
+ showDollarSign = true,
+ from = false,
+ }: {
+ description: string
+ priceDescription: string
+ price: string
+ tier: string
+ showDollarSign?: boolean
+ from?: boolean
+ }) => {
+ return (
+
+
{tier}
+
+ {from &&
From }
+
+ {showDollarSign && '$'}
+ {price}
+
+
{priceDescription}
+
+
{description}
+
+
+ Get started
+
+
+
+ )
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ Pricing
+
+
Predictable pricing, no surprises
+
+ Start building for free, collaborate with a team, then scale to millions of users
+
+
+
+
+
+
+ {/*
*/}
+
+
+
+ {tiers.map((tier) => (
+
+
+
+ {tier.name}
+
+
+ {tier.priceMonthly !== undefined ? (
+
+ {tier.from && (
+
From
+ )}
+
+ ${tier.priceMonthly}
+ /mo
+
+ {tier.warning && (
+
+ {tier.warning}
+
+ )}
+
+ ) : (
+
Contact Us
+ )}
+
+
{tier.description}
+
+
+ {tier.preface &&
{tier.preface}
}
+ {/*
Included with plan:
*/}
+
+ {tier.features.map((feature) => (
+
+ {/* */}
+
+ {/*
*/}
+
+ {feature}
+
+
+ ))}
+
+
+
+
+ {tier.additional && (
+
{tier.additional}
+ )}
+ {tier.scale &&
{tier.scale}
}
+ {tier.shutdown &&
{tier.shutdown}
}
+
+
+
+ {tier.cta}
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+
Add-Ons
+
+ Level up your Supabase experience with add-ons.
+
+
+
+
+
}
+ pricing={pricingAddOn.database}
+ />
+
}
+ pricing={pricingAddOn.support}
+ />
+
+
+
+
+
+
+
Compare Plans
+
+ Start with a hobby project, collaborate with a team, and scale to millions of users.
+
+
+
+
+ {/* */}
+
+
+ {/* Free - Mobile */}
+
+
+
+
+
+
+
+
+
+
+ {/* Pro - Mobile */}
+
+
+
+
+
+
+
+
+ {/* Enterprise - Mobile */}
+
+
+
+
+
+
+
+
+
+
+ {/* */}
+
+
+ Pricing plan comparison
+
+
+
+ Feature by
+ Plans
+
+
+
+
+ Free
+
+
+
+
+ Pro
+
+
+
+
+ Enterprise
+
+
+
+
+
+
+
+ Pricing
+
+
+
+
+
$0
+
/project/month
+
+
Perfect for hobby projects and experiments
+
+
+
+
+ Get Started
+
+
+
+
+
+
+
+
+
$25
+
/project/month + usage costs
+
+
+ Everything you need to scale your project into production
+
+
+
+
+
+ Get Started
+
+
+
+
+
+
+
+
+
Contact Us
+
for a quote
+
+
+ Designated support team, account manager and technical specialist
+
+
+
+
+
+ Contact Us
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Choose your plan
+
+
+
+
+
+
+ Get started
+
+
+
+
+
+
+
+
+
+ Get started
+
+
+
+
+
+
+
+
+
+ Contact us
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Frequently asked questions
+
+ Can't find the answer to your question, ask someone in the community either on
+ our Discord or GitHub.
+
+
+
+ {/* @ts-ignore */}
+
+ {pricingFaq.map((faq, i) => {
+ return (
+
+ {faq.answer}
+
+ )
+ })}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/www/pages/storage/Storage.module.css b/www/pages/storage/Storage.module.css
new file mode 100644
index 00000000000..3dd7008e1bd
--- /dev/null
+++ b/www/pages/storage/Storage.module.css
@@ -0,0 +1,7 @@
+/* .github-icon svg {
+ fill: currentColor;
+} */
+
+.github-icon {
+ @apply text-white;
+}
diff --git a/www/pages/storage/Storage.tsx b/www/pages/storage/Storage.tsx
new file mode 100644
index 00000000000..535bcd74897
--- /dev/null
+++ b/www/pages/storage/Storage.tsx
@@ -0,0 +1,263 @@
+import { Badge, Button, IconArrowUpRight, IconShuffle, IconWifi, IconX, Space } from '@supabase/ui'
+import ApiExamples from 'data/products/storage/api-examples'
+import DashboardViewData from 'data/products/storage/dashboard-carousel.json'
+import StoragePermissionsData from 'data/products/storage/permissions-examples'
+import Solutions from 'data/Solutions.json'
+import { NextSeo } from 'next-seo'
+import { useRouter } from 'next/router'
+import Image from 'next/image'
+import Link from 'next/link'
+import ImageCarousel from '~/components/Carousels/ImageCarousel'
+import SplitCodeBlockCarousel from '~/components/Carousels/SplitCodeBlockCarousel'
+import CTABanner from '~/components/CTABanner'
+import ExampleCard from '~/components/ExampleCard'
+import FeatureColumn from '~/components/FeatureColumn'
+import DefaultLayout from '~/components/Layouts/Default'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+import ProductIcon from '~/components/ProductIcon'
+import APISection from '~/components/Sections/APISection'
+import ProductHeader from '~/components/Sections/ProductHeader'
+
+function StoragePage() {
+ // base path for images
+ const { basePath } = useRouter()
+
+ const meta_title = 'Storage | Store any digital content'
+ const meta_description =
+ 'An open source Object store with unlimited scalability, for any file type.'
+
+ return (
+ <>
+
+
+
+ Store and serve
+ any type of digital content
+ ,
+ ]}
+ subheader={[
+ 'An open source Object store with unlimited scalability, for any file type.',
+ 'With custom policies and permissions that are familiar and easy to implement.',
+ ]}
+ image={[
+
+
+
,
+
+
+
,
+ ]}
+ documentation_url={'/docs/guides/storage'}
+ />
+
+
+
+
+
+
+
Interoperable
+
+
+ Integrates well with the rest of Supabase ecosystem, including Auth and Postgres.
+
+
+
+
+
Lightning fast
+
+ Thin API server layer that leverages Postgres' permissions and performance.
+
+
+
+
+
Dependable
+
Enterprise-level scalability and durability.
+
+
+
+
+
+
+
Sleek dashboard for managing your media
+
+ A complete Object Explorer so that any of your team can use.
+
+
+ Drag and drop uploading, moving objects, and multiple object selection. As easy as
+ working on your desktop.
+
+
+
+
+ Check out our example app
+
+
+ >
+ }
+ />
+
+
+
+ Built from the ground up for interoperable authentication.,
+
+ Fast and easy to implement using our powerful library clients. Asset optimization
+ and image transformation coming soon!
+
,
+ ]}
+ footer={[
+
+
+ }
+ title="CDN"
+ text="Serve from the edge to reduce latency."
+ />
+
+
+ }
+ title="Transformations"
+ text="Resize and compress your media before you serve it."
+ />
+ Coming soon
+
+
,
+ ]}
+ />
+
+
+
+
+
+
+ {/*
*/}
+
+ {/*
+
+ */}
+
+
+
+
+
+ Integrates natively
+ with Supabase Auth
+
+
+
+ Using Postgres Row Level Security to create Object access rules.
+
+
+ Storage Authorization is built around Postgres so that you can use any
+ combination of SQL, Postgres functions, and even your own metadata to write
+ policies.
+
+
+
+
}
+ >
+ Explore documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default StoragePage
diff --git a/www/pages/storage/index.tsx b/www/pages/storage/index.tsx
new file mode 100644
index 00000000000..5ae171d948f
--- /dev/null
+++ b/www/pages/storage/index.tsx
@@ -0,0 +1,3 @@
+import Storage from './Storage'
+
+export default Storage
diff --git a/www/pages/support.tsx b/www/pages/support.tsx
new file mode 100644
index 00000000000..b4b43073291
--- /dev/null
+++ b/www/pages/support.tsx
@@ -0,0 +1,190 @@
+import Container from 'components/Container'
+import Layout from '~/components/Layouts/Default'
+import Link from 'next/link'
+import { Button, IconMessageCircle, IconGitHub, Divider, IconMail } from '@supabase/ui'
+import SectionContainer from '~/components/Layouts/SectionContainer'
+
+// Import Swiper styles if swiper used on page
+import 'swiper/swiper.min.css'
+import { useRouter } from 'next/router'
+import { NextSeo } from 'next-seo'
+
+type Props = {}
+
+const Index = ({}: Props) => {
+ const router = useRouter()
+
+ const meta_title = 'Help & Support | Supabase'
+ const meta_description =
+ 'Find help and support for Supabase. Our support agents provide answers on all types of issues, including account information, billing, and refunds.'
+
+ return (
+ <>
+
+
+
+
+
+
Get Support
+
+
+ Need a bit of help? We're here for you. Check out our current issues, GitHub
+ discussions, or get email support.
+
+
+
+
+
+
+
+
GitHub Issues
+
+
+ Have a general issue or bug that you've found? We'd love to hear about it in
+ our GitHub issues. This can be feature requests too!
+
+
+ Use this for: Bugs and other issues
+
+
+
+
+
+
+
+
+
+
+
GitHub Discussions
+
+
+ For help and questions about best practices, join our GitHub discussions.
+ Browse and ask questions.
+
+
+ Use this for: General questions
+
+
+
+
+
+
+
+
+
+
+
+
Email Support
+
+
+ We offer email based support. If you need SLAs, guaranteed response times,
+ or have an issue, please contact us here.
+
+
+ Use this for: Issues or questions
+ specific to you
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default Index
diff --git a/www/postcss.config.js b/www/postcss.config.js
new file mode 100644
index 00000000000..33ad091d26d
--- /dev/null
+++ b/www/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/www/public/_redirects b/www/public/_redirects
new file mode 100644
index 00000000000..027e7c46f88
--- /dev/null
+++ b/www/public/_redirects
@@ -0,0 +1,2 @@
+/docs https://supabase-docs.netlify.app/docs
+/blog https://supabase-docs.netlify.app/blog
diff --git a/www/public/brand-assets/logo-preview.jpg b/www/public/brand-assets/logo-preview.jpg
new file mode 100644
index 00000000000..ba27a9067eb
Binary files /dev/null and b/www/public/brand-assets/logo-preview.jpg differ
diff --git a/www/public/brand-assets/supabase-logo-icon.png b/www/public/brand-assets/supabase-logo-icon.png
new file mode 100644
index 00000000000..a3b7b36f929
Binary files /dev/null and b/www/public/brand-assets/supabase-logo-icon.png differ
diff --git a/www/public/brand-assets/supabase-logo-icon.svg b/www/public/brand-assets/supabase-logo-icon.svg
new file mode 100644
index 00000000000..ad802ac16ae
--- /dev/null
+++ b/www/public/brand-assets/supabase-logo-icon.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/brand-assets/supabase-logo-wordmark--dark.png b/www/public/brand-assets/supabase-logo-wordmark--dark.png
new file mode 100644
index 00000000000..821c42ce283
Binary files /dev/null and b/www/public/brand-assets/supabase-logo-wordmark--dark.png differ
diff --git a/www/public/brand-assets/supabase-logo-wordmark--dark.svg b/www/public/brand-assets/supabase-logo-wordmark--dark.svg
new file mode 100644
index 00000000000..9e96fab4ddc
--- /dev/null
+++ b/www/public/brand-assets/supabase-logo-wordmark--dark.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/brand-assets/supabase-logo-wordmark--light.png b/www/public/brand-assets/supabase-logo-wordmark--light.png
new file mode 100644
index 00000000000..0277fee2bbe
Binary files /dev/null and b/www/public/brand-assets/supabase-logo-wordmark--light.png differ
diff --git a/www/public/brand-assets/supabase-logo-wordmark--light.svg b/www/public/brand-assets/supabase-logo-wordmark--light.svg
new file mode 100644
index 00000000000..60cbc71dc7c
--- /dev/null
+++ b/www/public/brand-assets/supabase-logo-wordmark--light.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/brand-assets/supabase-logos.zip b/www/public/brand-assets/supabase-logos.zip
new file mode 100644
index 00000000000..fca943f9002
Binary files /dev/null and b/www/public/brand-assets/supabase-logos.zip differ
diff --git a/www/public/external-comms/vercel-integration/vercel-integration-supabase-auth-social-0auth.jpg b/www/public/external-comms/vercel-integration/vercel-integration-supabase-auth-social-0auth.jpg
new file mode 100644
index 00000000000..575d8e0255f
Binary files /dev/null and b/www/public/external-comms/vercel-integration/vercel-integration-supabase-auth-social-0auth.jpg differ
diff --git a/www/public/external-comms/vercel-integration/vercel-integration-supabase-dashboard-sql-editor.jpg b/www/public/external-comms/vercel-integration/vercel-integration-supabase-dashboard-sql-editor.jpg
new file mode 100644
index 00000000000..9c81a19db3a
Binary files /dev/null and b/www/public/external-comms/vercel-integration/vercel-integration-supabase-dashboard-sql-editor.jpg differ
diff --git a/www/public/external-comms/vercel-integration/vercel-integration-supabase-dashboard-table-editor.jpg b/www/public/external-comms/vercel-integration/vercel-integration-supabase-dashboard-table-editor.jpg
new file mode 100644
index 00000000000..f03f8389795
Binary files /dev/null and b/www/public/external-comms/vercel-integration/vercel-integration-supabase-dashboard-table-editor.jpg differ
diff --git a/www/public/favicon/android-chrome-192x192.png b/www/public/favicon/android-chrome-192x192.png
new file mode 100644
index 00000000000..f45e47c8a9c
Binary files /dev/null and b/www/public/favicon/android-chrome-192x192.png differ
diff --git a/www/public/favicon/android-chrome-512x512.png b/www/public/favicon/android-chrome-512x512.png
new file mode 100644
index 00000000000..3a0ba2b52aa
Binary files /dev/null and b/www/public/favicon/android-chrome-512x512.png differ
diff --git a/www/public/favicon/apple-touch-icon.png b/www/public/favicon/apple-touch-icon.png
new file mode 100644
index 00000000000..330e352fa5f
Binary files /dev/null and b/www/public/favicon/apple-touch-icon.png differ
diff --git a/www/public/favicon/browserconfig.xml b/www/public/favicon/browserconfig.xml
new file mode 100644
index 00000000000..9824d87b115
--- /dev/null
+++ b/www/public/favicon/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #000000
+
+
+
diff --git a/www/public/favicon/defaults/android-chrome-192x192.png b/www/public/favicon/defaults/android-chrome-192x192.png
new file mode 100644
index 00000000000..2f07282a59c
Binary files /dev/null and b/www/public/favicon/defaults/android-chrome-192x192.png differ
diff --git a/www/public/favicon/defaults/android-chrome-512x512.png b/www/public/favicon/defaults/android-chrome-512x512.png
new file mode 100644
index 00000000000..dbb0faea840
Binary files /dev/null and b/www/public/favicon/defaults/android-chrome-512x512.png differ
diff --git a/www/public/favicon/defaults/apple-touch-icon.png b/www/public/favicon/defaults/apple-touch-icon.png
new file mode 100644
index 00000000000..8f4033b2a8b
Binary files /dev/null and b/www/public/favicon/defaults/apple-touch-icon.png differ
diff --git a/www/public/favicon/defaults/favicon-16x16.png b/www/public/favicon/defaults/favicon-16x16.png
new file mode 100644
index 00000000000..29deaf6716e
Binary files /dev/null and b/www/public/favicon/defaults/favicon-16x16.png differ
diff --git a/www/public/favicon/defaults/favicon-32x32.png b/www/public/favicon/defaults/favicon-32x32.png
new file mode 100644
index 00000000000..e3b4277bf09
Binary files /dev/null and b/www/public/favicon/defaults/favicon-32x32.png differ
diff --git a/www/public/favicon/defaults/favicon.ico b/www/public/favicon/defaults/favicon.ico
new file mode 100644
index 00000000000..ea2f437d9db
Binary files /dev/null and b/www/public/favicon/defaults/favicon.ico differ
diff --git a/www/public/favicon/defaults/mstile-150x150.png b/www/public/favicon/defaults/mstile-150x150.png
new file mode 100644
index 00000000000..f2dfd904bf1
Binary files /dev/null and b/www/public/favicon/defaults/mstile-150x150.png differ
diff --git a/www/public/favicon/defaults/safari-pinned-tab.svg b/www/public/favicon/defaults/safari-pinned-tab.svg
new file mode 100644
index 00000000000..72ab6e050cb
--- /dev/null
+++ b/www/public/favicon/defaults/safari-pinned-tab.svg
@@ -0,0 +1,33 @@
+
+
+
+
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/favicon/favicon-16x16.png b/www/public/favicon/favicon-16x16.png
new file mode 100644
index 00000000000..4b7e28143e7
Binary files /dev/null and b/www/public/favicon/favicon-16x16.png differ
diff --git a/www/public/favicon/favicon-32x32.png b/www/public/favicon/favicon-32x32.png
new file mode 100644
index 00000000000..1a268444bf9
Binary files /dev/null and b/www/public/favicon/favicon-32x32.png differ
diff --git a/www/public/favicon/favicon.ico b/www/public/favicon/favicon.ico
new file mode 100644
index 00000000000..5c4d1dcc5cf
Binary files /dev/null and b/www/public/favicon/favicon.ico differ
diff --git a/www/public/favicon/mstile-150x150.png b/www/public/favicon/mstile-150x150.png
new file mode 100644
index 00000000000..836aed416a0
Binary files /dev/null and b/www/public/favicon/mstile-150x150.png differ
diff --git a/www/public/favicon/safari-pinned-tab.svg b/www/public/favicon/safari-pinned-tab.svg
new file mode 100644
index 00000000000..7e408790eb0
--- /dev/null
+++ b/www/public/favicon/safari-pinned-tab.svg
@@ -0,0 +1,19 @@
+
+
+
+
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+
+
+
+
+
diff --git a/www/public/favicon/site.webmanifest b/www/public/favicon/site.webmanifest
new file mode 100644
index 00000000000..8da2b0f3d44
--- /dev/null
+++ b/www/public/favicon/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "Supabase",
+ "short_name": "Supabase",
+ "icons": [
+ {
+ "src": "/favicons/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/favicons/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#000000",
+ "background_color": "#000000",
+ "display": "standalone"
+}
diff --git a/www/public/fonts/custom/CustomFont-Black.woff b/www/public/fonts/custom/CustomFont-Black.woff
new file mode 100644
index 00000000000..091f927ea14
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Black.woff differ
diff --git a/www/public/fonts/custom/CustomFont-Black.woff2 b/www/public/fonts/custom/CustomFont-Black.woff2
new file mode 100644
index 00000000000..e3c834e57f2
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Black.woff2 differ
diff --git a/www/public/fonts/custom/CustomFont-BlackItalic.woff b/www/public/fonts/custom/CustomFont-BlackItalic.woff
new file mode 100644
index 00000000000..b5f6a877dce
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-BlackItalic.woff differ
diff --git a/www/public/fonts/custom/CustomFont-BlackItalic.woff2 b/www/public/fonts/custom/CustomFont-BlackItalic.woff2
new file mode 100644
index 00000000000..f84036283ec
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-BlackItalic.woff2 differ
diff --git a/www/public/fonts/custom/CustomFont-Bold.woff b/www/public/fonts/custom/CustomFont-Bold.woff
new file mode 100644
index 00000000000..f8d3f551df0
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Bold.woff differ
diff --git a/www/public/fonts/custom/CustomFont-Bold.woff2 b/www/public/fonts/custom/CustomFont-Bold.woff2
new file mode 100644
index 00000000000..5e7af459481
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Bold.woff2 differ
diff --git a/www/public/fonts/custom/CustomFont-BoldItalic.woff b/www/public/fonts/custom/CustomFont-BoldItalic.woff
new file mode 100644
index 00000000000..07e8a350741
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-BoldItalic.woff differ
diff --git a/www/public/fonts/custom/CustomFont-BoldItalic.woff2 b/www/public/fonts/custom/CustomFont-BoldItalic.woff2
new file mode 100644
index 00000000000..ac0edd55fd3
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-BoldItalic.woff2 differ
diff --git a/www/public/fonts/custom/CustomFont-Book.woff b/www/public/fonts/custom/CustomFont-Book.woff
new file mode 100644
index 00000000000..7d53d032fc4
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Book.woff differ
diff --git a/www/public/fonts/custom/CustomFont-Book.woff2 b/www/public/fonts/custom/CustomFont-Book.woff2
new file mode 100644
index 00000000000..abd31f7ec27
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Book.woff2 differ
diff --git a/www/public/fonts/custom/CustomFont-BookItalic.woff b/www/public/fonts/custom/CustomFont-BookItalic.woff
new file mode 100644
index 00000000000..427cda87566
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-BookItalic.woff differ
diff --git a/www/public/fonts/custom/CustomFont-BookItalic.woff2 b/www/public/fonts/custom/CustomFont-BookItalic.woff2
new file mode 100644
index 00000000000..d326c8672cc
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-BookItalic.woff2 differ
diff --git a/www/public/fonts/custom/CustomFont-Medium.woff b/www/public/fonts/custom/CustomFont-Medium.woff
new file mode 100644
index 00000000000..3707cb45dcb
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Medium.woff differ
diff --git a/www/public/fonts/custom/CustomFont-Medium.woff2 b/www/public/fonts/custom/CustomFont-Medium.woff2
new file mode 100644
index 00000000000..c07131ddec9
Binary files /dev/null and b/www/public/fonts/custom/CustomFont-Medium.woff2 differ
diff --git a/www/public/images/benchmark--mobile.svg b/www/public/images/benchmark--mobile.svg
new file mode 100644
index 00000000000..0e489eb30ed
--- /dev/null
+++ b/www/public/images/benchmark--mobile.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/benchmark.svg b/www/public/images/benchmark.svg
new file mode 100644
index 00000000000..cd35dd3690a
--- /dev/null
+++ b/www/public/images/benchmark.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/beta-hero-light.png b/www/public/images/beta-hero-light.png
new file mode 100644
index 00000000000..b4afc920ded
Binary files /dev/null and b/www/public/images/beta-hero-light.png differ
diff --git a/www/public/images/beta-hero.png b/www/public/images/beta-hero.png
new file mode 100644
index 00000000000..68552910d3a
Binary files /dev/null and b/www/public/images/beta-hero.png differ
diff --git a/www/public/images/blog/2021-august/connection-strings.png b/www/public/images/blog/2021-august/connection-strings.png
new file mode 100644
index 00000000000..91b6d8e6f91
Binary files /dev/null and b/www/public/images/blog/2021-august/connection-strings.png differ
diff --git a/www/public/images/blog/2021-august/create-tables.png b/www/public/images/blog/2021-august/create-tables.png
new file mode 100644
index 00000000000..c062b982de1
Binary files /dev/null and b/www/public/images/blog/2021-august/create-tables.png differ
diff --git a/www/public/images/blog/2021-august/csv-imports.png b/www/public/images/blog/2021-august/csv-imports.png
new file mode 100644
index 00000000000..67029d81755
Binary files /dev/null and b/www/public/images/blog/2021-august/csv-imports.png differ
diff --git a/www/public/images/blog/2021-august/custom-sms.png b/www/public/images/blog/2021-august/custom-sms.png
new file mode 100644
index 00000000000..38f0d206900
Binary files /dev/null and b/www/public/images/blog/2021-august/custom-sms.png differ
diff --git a/www/public/images/blog/2021-august/github-stars.png b/www/public/images/blog/2021-august/github-stars.png
new file mode 100644
index 00000000000..75c8112ef01
Binary files /dev/null and b/www/public/images/blog/2021-august/github-stars.png differ
diff --git a/www/public/images/blog/2021-august/hackathon.png b/www/public/images/blog/2021-august/hackathon.png
new file mode 100644
index 00000000000..31aee090ee8
Binary files /dev/null and b/www/public/images/blog/2021-august/hackathon.png differ
diff --git a/www/public/images/blog/2021-august/meme-town.png b/www/public/images/blog/2021-august/meme-town.png
new file mode 100644
index 00000000000..b41e56042a2
Binary files /dev/null and b/www/public/images/blog/2021-august/meme-town.png differ
diff --git a/www/public/images/blog/2021-august/release-august-2021-cover.jpg b/www/public/images/blog/2021-august/release-august-2021-cover.jpg
new file mode 100644
index 00000000000..ab09eddcf74
Binary files /dev/null and b/www/public/images/blog/2021-august/release-august-2021-cover.jpg differ
diff --git a/www/public/images/blog/2021-august/release-august-2021.jpg b/www/public/images/blog/2021-august/release-august-2021.jpg
new file mode 100644
index 00000000000..e69230d46b1
Binary files /dev/null and b/www/public/images/blog/2021-august/release-august-2021.jpg differ
diff --git a/www/public/images/blog/2021-august/south-korea.png b/www/public/images/blog/2021-august/south-korea.png
new file mode 100644
index 00000000000..b7c6a335b53
Binary files /dev/null and b/www/public/images/blog/2021-august/south-korea.png differ
diff --git a/www/public/images/blog/2021-august/supabase-flutter.jpg b/www/public/images/blog/2021-august/supabase-flutter.jpg
new file mode 100644
index 00000000000..e166817efd7
Binary files /dev/null and b/www/public/images/blog/2021-august/supabase-flutter.jpg differ
diff --git a/www/public/images/blog/2021-august/supabase-series-a.png b/www/public/images/blog/2021-august/supabase-series-a.png
new file mode 100644
index 00000000000..ee155290796
Binary files /dev/null and b/www/public/images/blog/2021-august/supabase-series-a.png differ
diff --git a/www/public/images/blog/2021-august/walrus.jpg b/www/public/images/blog/2021-august/walrus.jpg
new file mode 100644
index 00000000000..926673e4243
Binary files /dev/null and b/www/public/images/blog/2021-august/walrus.jpg differ
diff --git a/www/public/images/blog/2021-dec/divjoy.png b/www/public/images/blog/2021-dec/divjoy.png
new file mode 100644
index 00000000000..029de88445d
Binary files /dev/null and b/www/public/images/blog/2021-dec/divjoy.png differ
diff --git a/www/public/images/blog/2021-dec/hackathon.png b/www/public/images/blog/2021-dec/hackathon.png
new file mode 100644
index 00000000000..eb59fc32040
Binary files /dev/null and b/www/public/images/blog/2021-dec/hackathon.png differ
diff --git a/www/public/images/blog/2021-dec/hiring.png b/www/public/images/blog/2021-dec/hiring.png
new file mode 100644
index 00000000000..c0a5b7ba3f9
Binary files /dev/null and b/www/public/images/blog/2021-dec/hiring.png differ
diff --git a/www/public/images/blog/2021-dec/jason.png b/www/public/images/blog/2021-dec/jason.png
new file mode 100644
index 00000000000..27d2aaf3be0
Binary files /dev/null and b/www/public/images/blog/2021-dec/jason.png differ
diff --git a/www/public/images/blog/2021-dec/pgsodium.png b/www/public/images/blog/2021-dec/pgsodium.png
new file mode 100644
index 00000000000..87617d2bda7
Binary files /dev/null and b/www/public/images/blog/2021-dec/pgsodium.png differ
diff --git a/www/public/images/blog/2021-dec/python.png b/www/public/images/blog/2021-dec/python.png
new file mode 100644
index 00000000000..6c721bc6ed3
Binary files /dev/null and b/www/public/images/blog/2021-dec/python.png differ
diff --git a/www/public/images/blog/2021-dec/release-dec-2021-cover.png b/www/public/images/blog/2021-dec/release-dec-2021-cover.png
new file mode 100644
index 00000000000..75747a0a4d5
Binary files /dev/null and b/www/public/images/blog/2021-dec/release-dec-2021-cover.png differ
diff --git a/www/public/images/blog/2021-dec/release-dec-2021.png b/www/public/images/blog/2021-dec/release-dec-2021.png
new file mode 100644
index 00000000000..d5cebe0b0c8
Binary files /dev/null and b/www/public/images/blog/2021-dec/release-dec-2021.png differ
diff --git a/www/public/images/blog/2021-dec/stars.png b/www/public/images/blog/2021-dec/stars.png
new file mode 100644
index 00000000000..d5a32ae8757
Binary files /dev/null and b/www/public/images/blog/2021-dec/stars.png differ
diff --git a/www/public/images/blog/2021-dec/swag.jpg b/www/public/images/blog/2021-dec/swag.jpg
new file mode 100644
index 00000000000..c8267283759
Binary files /dev/null and b/www/public/images/blog/2021-dec/swag.jpg differ
diff --git a/www/public/images/blog/2021-dec/tiktok.png b/www/public/images/blog/2021-dec/tiktok.png
new file mode 100644
index 00000000000..75af644b0e6
Binary files /dev/null and b/www/public/images/blog/2021-dec/tiktok.png differ
diff --git a/www/public/images/blog/2021-dec/twitter.png b/www/public/images/blog/2021-dec/twitter.png
new file mode 100644
index 00000000000..f37543a61af
Binary files /dev/null and b/www/public/images/blog/2021-dec/twitter.png differ
diff --git a/www/public/images/blog/2021-july/dart.png b/www/public/images/blog/2021-july/dart.png
new file mode 100644
index 00000000000..cf4413036d5
Binary files /dev/null and b/www/public/images/blog/2021-july/dart.png differ
diff --git a/www/public/images/blog/2021-july/dashboards.png b/www/public/images/blog/2021-july/dashboards.png
new file mode 100644
index 00000000000..d70c7e752d5
Binary files /dev/null and b/www/public/images/blog/2021-july/dashboards.png differ
diff --git a/www/public/images/blog/2021-july/discord.png b/www/public/images/blog/2021-july/discord.png
new file mode 100644
index 00000000000..0f0ff6283ed
Binary files /dev/null and b/www/public/images/blog/2021-july/discord.png differ
diff --git a/www/public/images/blog/2021-july/github-growth.png b/www/public/images/blog/2021-july/github-growth.png
new file mode 100644
index 00000000000..07833ad4ad6
Binary files /dev/null and b/www/public/images/blog/2021-july/github-growth.png differ
diff --git a/www/public/images/blog/2021-july/hackathon.png b/www/public/images/blog/2021-july/hackathon.png
new file mode 100644
index 00000000000..882d2696e8f
Binary files /dev/null and b/www/public/images/blog/2021-july/hackathon.png differ
diff --git a/www/public/images/blog/2021-july/hooks.jpg b/www/public/images/blog/2021-july/hooks.jpg
new file mode 100644
index 00000000000..ebf79cc42d9
Binary files /dev/null and b/www/public/images/blog/2021-july/hooks.jpg differ
diff --git a/www/public/images/blog/2021-july/postgres-13.png b/www/public/images/blog/2021-july/postgres-13.png
new file mode 100644
index 00000000000..61d2826e001
Binary files /dev/null and b/www/public/images/blog/2021-july/postgres-13.png differ
diff --git a/www/public/images/blog/2021-july/postgrest-8.png b/www/public/images/blog/2021-july/postgrest-8.png
new file mode 100644
index 00000000000..947da8b2ad9
Binary files /dev/null and b/www/public/images/blog/2021-july/postgrest-8.png differ
diff --git a/www/public/images/blog/2021-july/release-july-2021-cover.jpg b/www/public/images/blog/2021-july/release-july-2021-cover.jpg
new file mode 100644
index 00000000000..3861eef4861
Binary files /dev/null and b/www/public/images/blog/2021-july/release-july-2021-cover.jpg differ
diff --git a/www/public/images/blog/2021-july/release-july-2021.jpg b/www/public/images/blog/2021-july/release-july-2021.jpg
new file mode 100644
index 00000000000..94278262bab
Binary files /dev/null and b/www/public/images/blog/2021-july/release-july-2021.jpg differ
diff --git a/www/public/images/blog/2021-july/storage.png b/www/public/images/blog/2021-july/storage.png
new file mode 100644
index 00000000000..6d631d5e79d
Binary files /dev/null and b/www/public/images/blog/2021-july/storage.png differ
diff --git a/www/public/images/blog/2021-july/supabase-launch-the-sql.png b/www/public/images/blog/2021-july/supabase-launch-the-sql.png
new file mode 100644
index 00000000000..d4ed4f207b9
Binary files /dev/null and b/www/public/images/blog/2021-july/supabase-launch-the-sql.png differ
diff --git a/www/public/images/blog/2021-july/swag.png b/www/public/images/blog/2021-july/swag.png
new file mode 100644
index 00000000000..27365528c1b
Binary files /dev/null and b/www/public/images/blog/2021-july/swag.png differ
diff --git a/www/public/images/blog/2021-july/verify-phone.jpg b/www/public/images/blog/2021-july/verify-phone.jpg
new file mode 100644
index 00000000000..dcd86ebe056
Binary files /dev/null and b/www/public/images/blog/2021-july/verify-phone.jpg differ
diff --git a/www/public/images/blog/2021-june/apple-developer-portal.png b/www/public/images/blog/2021-june/apple-developer-portal.png
new file mode 100644
index 00000000000..3538a61a219
Binary files /dev/null and b/www/public/images/blog/2021-june/apple-developer-portal.png differ
diff --git a/www/public/images/blog/2021-june/github-june-2021.png b/www/public/images/blog/2021-june/github-june-2021.png
new file mode 100644
index 00000000000..b325a613985
Binary files /dev/null and b/www/public/images/blog/2021-june/github-june-2021.png differ
diff --git a/www/public/images/blog/2021-june/policy-editor.png b/www/public/images/blog/2021-june/policy-editor.png
new file mode 100644
index 00000000000..6e5c280ea5e
Binary files /dev/null and b/www/public/images/blog/2021-june/policy-editor.png differ
diff --git a/www/public/images/blog/2021-june/postgres-fts.png b/www/public/images/blog/2021-june/postgres-fts.png
new file mode 100644
index 00000000000..546e42c2c9e
Binary files /dev/null and b/www/public/images/blog/2021-june/postgres-fts.png differ
diff --git a/www/public/images/blog/2021-june/public-buckets.mp4 b/www/public/images/blog/2021-june/public-buckets.mp4
new file mode 100644
index 00000000000..101cc1cde1e
Binary files /dev/null and b/www/public/images/blog/2021-june/public-buckets.mp4 differ
diff --git a/www/public/images/blog/2021-june/release-june-2021-cover.jpg b/www/public/images/blog/2021-june/release-june-2021-cover.jpg
new file mode 100644
index 00000000000..6ade2835987
Binary files /dev/null and b/www/public/images/blog/2021-june/release-june-2021-cover.jpg differ
diff --git a/www/public/images/blog/2021-june/release-june-2021.jpg b/www/public/images/blog/2021-june/release-june-2021.jpg
new file mode 100644
index 00000000000..2e8e17782b6
Binary files /dev/null and b/www/public/images/blog/2021-june/release-june-2021.jpg differ
diff --git a/www/public/images/blog/2021-june/server-restarts.png b/www/public/images/blog/2021-june/server-restarts.png
new file mode 100644
index 00000000000..80ff7a5df78
Binary files /dev/null and b/www/public/images/blog/2021-june/server-restarts.png differ
diff --git a/www/public/images/blog/2021-june/supabase-discord.png b/www/public/images/blog/2021-june/supabase-discord.png
new file mode 100644
index 00000000000..a4de2bdbb66
Binary files /dev/null and b/www/public/images/blog/2021-june/supabase-discord.png differ
diff --git a/www/public/images/blog/2021-june/supabase-plv8.png b/www/public/images/blog/2021-june/supabase-plv8.png
new file mode 100644
index 00000000000..227cdb365e1
Binary files /dev/null and b/www/public/images/blog/2021-june/supabase-plv8.png differ
diff --git a/www/public/images/blog/2021-june/supabase-storage-upsert.png b/www/public/images/blog/2021-june/supabase-storage-upsert.png
new file mode 100644
index 00000000000..ecd4f4fa00b
Binary files /dev/null and b/www/public/images/blog/2021-june/supabase-storage-upsert.png differ
diff --git a/www/public/images/blog/2021-june/supabase-vercel.png b/www/public/images/blog/2021-june/supabase-vercel.png
new file mode 100644
index 00000000000..7802b9bdd57
Binary files /dev/null and b/www/public/images/blog/2021-june/supabase-vercel.png differ
diff --git a/www/public/images/blog/2021-may/japan-region.png b/www/public/images/blog/2021-may/japan-region.png
new file mode 100644
index 00000000000..679660150ea
Binary files /dev/null and b/www/public/images/blog/2021-may/japan-region.png differ
diff --git a/www/public/images/blog/2021-may/release-may-2021.jpg b/www/public/images/blog/2021-may/release-may-2021.jpg
new file mode 100644
index 00000000000..ca1bd889f9f
Binary files /dev/null and b/www/public/images/blog/2021-may/release-may-2021.jpg differ
diff --git a/www/public/images/blog/2021-may/return-data-as-csv.png b/www/public/images/blog/2021-may/return-data-as-csv.png
new file mode 100644
index 00000000000..20da08020c4
Binary files /dev/null and b/www/public/images/blog/2021-may/return-data-as-csv.png differ
diff --git a/www/public/images/blog/2021-may/storage-policies.png b/www/public/images/blog/2021-may/storage-policies.png
new file mode 100644
index 00000000000..1802f34ebb8
Binary files /dev/null and b/www/public/images/blog/2021-may/storage-policies.png differ
diff --git a/www/public/images/blog/2021-may/supabase-apple-login.png b/www/public/images/blog/2021-may/supabase-apple-login.png
new file mode 100644
index 00000000000..a4189ed928d
Binary files /dev/null and b/www/public/images/blog/2021-may/supabase-apple-login.png differ
diff --git a/www/public/images/blog/2021-may/supabase-go-support.png b/www/public/images/blog/2021-may/supabase-go-support.png
new file mode 100644
index 00000000000..940303ef1dd
Binary files /dev/null and b/www/public/images/blog/2021-may/supabase-go-support.png differ
diff --git a/www/public/images/blog/2021-may/supabase-stars-may-2021.png b/www/public/images/blog/2021-may/supabase-stars-may-2021.png
new file mode 100644
index 00000000000..0419541e46b
Binary files /dev/null and b/www/public/images/blog/2021-may/supabase-stars-may-2021.png differ
diff --git a/www/public/images/blog/2021-may/supabase-swift-support.png b/www/public/images/blog/2021-may/supabase-swift-support.png
new file mode 100644
index 00000000000..529e5755bf5
Binary files /dev/null and b/www/public/images/blog/2021-may/supabase-swift-support.png differ
diff --git a/www/public/images/blog/2021-may/supabase-twitter-login.png b/www/public/images/blog/2021-may/supabase-twitter-login.png
new file mode 100644
index 00000000000..5276ea5ed06
Binary files /dev/null and b/www/public/images/blog/2021-may/supabase-twitter-login.png differ
diff --git a/www/public/images/blog/2021-may/table-grid.png b/www/public/images/blog/2021-may/table-grid.png
new file mode 100644
index 00000000000..597015e29b7
Binary files /dev/null and b/www/public/images/blog/2021-may/table-grid.png differ
diff --git a/www/public/images/blog/2021-nov/course.jpg b/www/public/images/blog/2021-nov/course.jpg
new file mode 100644
index 00000000000..9783ba5a53d
Binary files /dev/null and b/www/public/images/blog/2021-nov/course.jpg differ
diff --git a/www/public/images/blog/2021-nov/graphql.png b/www/public/images/blog/2021-nov/graphql.png
new file mode 100644
index 00000000000..bfc624056a5
Binary files /dev/null and b/www/public/images/blog/2021-nov/graphql.png differ
diff --git a/www/public/images/blog/2021-nov/logflare.png b/www/public/images/blog/2021-nov/logflare.png
new file mode 100644
index 00000000000..ae5663bc90a
Binary files /dev/null and b/www/public/images/blog/2021-nov/logflare.png differ
diff --git a/www/public/images/blog/2021-nov/pg14.png b/www/public/images/blog/2021-nov/pg14.png
new file mode 100644
index 00000000000..24c97250f06
Binary files /dev/null and b/www/public/images/blog/2021-nov/pg14.png differ
diff --git a/www/public/images/blog/2021-nov/postgrest9.png b/www/public/images/blog/2021-nov/postgrest9.png
new file mode 100644
index 00000000000..b5008e00eb3
Binary files /dev/null and b/www/public/images/blog/2021-nov/postgrest9.png differ
diff --git a/www/public/images/blog/2021-nov/realtime.png b/www/public/images/blog/2021-nov/realtime.png
new file mode 100644
index 00000000000..bc11f5552fd
Binary files /dev/null and b/www/public/images/blog/2021-nov/realtime.png differ
diff --git a/www/public/images/blog/2021-nov/release-nov-2021-cover.jpg b/www/public/images/blog/2021-nov/release-nov-2021-cover.jpg
new file mode 100644
index 00000000000..f541457e771
Binary files /dev/null and b/www/public/images/blog/2021-nov/release-nov-2021-cover.jpg differ
diff --git a/www/public/images/blog/2021-nov/release-nov-2021.jpg b/www/public/images/blog/2021-nov/release-nov-2021.jpg
new file mode 100644
index 00000000000..3bd9b541e24
Binary files /dev/null and b/www/public/images/blog/2021-nov/release-nov-2021.jpg differ
diff --git a/www/public/images/blog/2021-nov/stars.png b/www/public/images/blog/2021-nov/stars.png
new file mode 100644
index 00000000000..275d2b40331
Binary files /dev/null and b/www/public/images/blog/2021-nov/stars.png differ
diff --git a/www/public/images/blog/2021-nov/studio.jpg b/www/public/images/blog/2021-nov/studio.jpg
new file mode 100644
index 00000000000..1c61653593f
Binary files /dev/null and b/www/public/images/blog/2021-nov/studio.jpg differ
diff --git a/www/public/images/blog/2021-nov/supabase-universe.jpg b/www/public/images/blog/2021-nov/supabase-universe.jpg
new file mode 100644
index 00000000000..f4528867bd1
Binary files /dev/null and b/www/public/images/blog/2021-nov/supabase-universe.jpg differ
diff --git a/www/public/images/blog/2021-nov/tiktok.png b/www/public/images/blog/2021-nov/tiktok.png
new file mode 100644
index 00000000000..75af644b0e6
Binary files /dev/null and b/www/public/images/blog/2021-nov/tiktok.png differ
diff --git a/www/public/images/blog/2021-nov/too_damn_high.png b/www/public/images/blog/2021-nov/too_damn_high.png
new file mode 100644
index 00000000000..ef72c9dc834
Binary files /dev/null and b/www/public/images/blog/2021-nov/too_damn_high.png differ
diff --git a/www/public/images/blog/2021-oct/launch-ckecklist.png b/www/public/images/blog/2021-oct/launch-ckecklist.png
new file mode 100644
index 00000000000..f5d38891bbe
Binary files /dev/null and b/www/public/images/blog/2021-oct/launch-ckecklist.png differ
diff --git a/www/public/images/blog/2021-oct/multi-schema.png b/www/public/images/blog/2021-oct/multi-schema.png
new file mode 100644
index 00000000000..8a42290361e
Binary files /dev/null and b/www/public/images/blog/2021-oct/multi-schema.png differ
diff --git a/www/public/images/blog/2021-oct/og-launchweek-3.jpg b/www/public/images/blog/2021-oct/og-launchweek-3.jpg
new file mode 100644
index 00000000000..4e7dfe36ac3
Binary files /dev/null and b/www/public/images/blog/2021-oct/og-launchweek-3.jpg differ
diff --git a/www/public/images/blog/2021-oct/release-oct-2021-cover.jpg b/www/public/images/blog/2021-oct/release-oct-2021-cover.jpg
new file mode 100644
index 00000000000..e68b92cf040
Binary files /dev/null and b/www/public/images/blog/2021-oct/release-oct-2021-cover.jpg differ
diff --git a/www/public/images/blog/2021-oct/release-oct-2021.jpg b/www/public/images/blog/2021-oct/release-oct-2021.jpg
new file mode 100644
index 00000000000..1d0027dcdf8
Binary files /dev/null and b/www/public/images/blog/2021-oct/release-oct-2021.jpg differ
diff --git a/www/public/images/blog/2021-oct/stars.png b/www/public/images/blog/2021-oct/stars.png
new file mode 100644
index 00000000000..4ba263baec3
Binary files /dev/null and b/www/public/images/blog/2021-oct/stars.png differ
diff --git a/www/public/images/blog/2021-oct/supabase-auth-slack.png b/www/public/images/blog/2021-oct/supabase-auth-slack.png
new file mode 100644
index 00000000000..4a8dacd9b7c
Binary files /dev/null and b/www/public/images/blog/2021-oct/supabase-auth-slack.png differ
diff --git a/www/public/images/blog/2021-oct/supabase-multi-schema-support.png b/www/public/images/blog/2021-oct/supabase-multi-schema-support.png
new file mode 100644
index 00000000000..404c1feaa4e
Binary files /dev/null and b/www/public/images/blog/2021-oct/supabase-multi-schema-support.png differ
diff --git a/www/public/images/blog/2021-sept/Supabase_abort_requests.png b/www/public/images/blog/2021-sept/Supabase_abort_requests.png
new file mode 100644
index 00000000000..bae9350637f
Binary files /dev/null and b/www/public/images/blog/2021-sept/Supabase_abort_requests.png differ
diff --git a/www/public/images/blog/2021-sept/auth-docs.png b/www/public/images/blog/2021-sept/auth-docs.png
new file mode 100644
index 00000000000..0b78967c583
Binary files /dev/null and b/www/public/images/blog/2021-sept/auth-docs.png differ
diff --git a/www/public/images/blog/2021-sept/columns.png b/www/public/images/blog/2021-sept/columns.png
new file mode 100644
index 00000000000..de6476d2364
Binary files /dev/null and b/www/public/images/blog/2021-sept/columns.png differ
diff --git a/www/public/images/blog/2021-sept/discord.png b/www/public/images/blog/2021-sept/discord.png
new file mode 100644
index 00000000000..603dc0adec6
Binary files /dev/null and b/www/public/images/blog/2021-sept/discord.png differ
diff --git a/www/public/images/blog/2021-sept/edit-columns.png b/www/public/images/blog/2021-sept/edit-columns.png
new file mode 100644
index 00000000000..29d8079fd9b
Binary files /dev/null and b/www/public/images/blog/2021-sept/edit-columns.png differ
diff --git a/www/public/images/blog/2021-sept/hacktober.png b/www/public/images/blog/2021-sept/hacktober.png
new file mode 100644
index 00000000000..b5d3be84818
Binary files /dev/null and b/www/public/images/blog/2021-sept/hacktober.png differ
diff --git a/www/public/images/blog/2021-sept/hiring.png b/www/public/images/blog/2021-sept/hiring.png
new file mode 100644
index 00000000000..1f20dd5fdae
Binary files /dev/null and b/www/public/images/blog/2021-sept/hiring.png differ
diff --git a/www/public/images/blog/2021-sept/is-unique.png b/www/public/images/blog/2021-sept/is-unique.png
new file mode 100644
index 00000000000..b2588c01d45
Binary files /dev/null and b/www/public/images/blog/2021-sept/is-unique.png differ
diff --git a/www/public/images/blog/2021-sept/relationships.png b/www/public/images/blog/2021-sept/relationships.png
new file mode 100644
index 00000000000..ee268ade40d
Binary files /dev/null and b/www/public/images/blog/2021-sept/relationships.png differ
diff --git a/www/public/images/blog/2021-sept/release-sept-2021-cover.jpg b/www/public/images/blog/2021-sept/release-sept-2021-cover.jpg
new file mode 100644
index 00000000000..ae0b8c5fc8c
Binary files /dev/null and b/www/public/images/blog/2021-sept/release-sept-2021-cover.jpg differ
diff --git a/www/public/images/blog/2021-sept/release-sept-2021.jpg b/www/public/images/blog/2021-sept/release-sept-2021.jpg
new file mode 100644
index 00000000000..2914e23b691
Binary files /dev/null and b/www/public/images/blog/2021-sept/release-sept-2021.jpg differ
diff --git a/www/public/images/blog/2021-sept/stars.png b/www/public/images/blog/2021-sept/stars.png
new file mode 100644
index 00000000000..721b6d2c9e0
Binary files /dev/null and b/www/public/images/blog/2021-sept/stars.png differ
diff --git a/www/public/images/blog/2021-sept/twitter.png b/www/public/images/blog/2021-sept/twitter.png
new file mode 100644
index 00000000000..b30f698666a
Binary files /dev/null and b/www/public/images/blog/2021-sept/twitter.png differ
diff --git a/www/public/images/blog/2021-sept/types.png b/www/public/images/blog/2021-sept/types.png
new file mode 100644
index 00000000000..e7ab4b6741f
Binary files /dev/null and b/www/public/images/blog/2021-sept/types.png differ
diff --git a/www/public/images/blog/2022-january/new-auth-providers-supabase_monthly-email-jan-2022.png b/www/public/images/blog/2022-january/new-auth-providers-supabase_monthly-email-jan-2022.png
new file mode 100644
index 00000000000..cb9dd2751cd
Binary files /dev/null and b/www/public/images/blog/2022-january/new-auth-providers-supabase_monthly-email-jan-2022.png differ
diff --git a/www/public/images/blog/2022-january/new-sms-providers-supabase_monthly-email-jan-2022.png b/www/public/images/blog/2022-january/new-sms-providers-supabase_monthly-email-jan-2022.png
new file mode 100644
index 00000000000..aeb2c43e432
Binary files /dev/null and b/www/public/images/blog/2022-january/new-sms-providers-supabase_monthly-email-jan-2022.png differ
diff --git a/www/public/images/blog/2022-january/pg_graphql_0.1.0_monthly-email-dec-2021.png b/www/public/images/blog/2022-january/pg_graphql_0.1.0_monthly-email-dec-2021.png
new file mode 100644
index 00000000000..eeb04368aab
Binary files /dev/null and b/www/public/images/blog/2022-january/pg_graphql_0.1.0_monthly-email-dec-2021.png differ
diff --git a/www/public/images/blog/2022-january/thumb.jpg b/www/public/images/blog/2022-january/thumb.jpg
new file mode 100644
index 00000000000..c6d006125a7
Binary files /dev/null and b/www/public/images/blog/2022-january/thumb.jpg differ
diff --git a/www/public/images/blog/2022-march/community-day.png b/www/public/images/blog/2022-march/community-day.png
new file mode 100644
index 00000000000..acff29628b4
Binary files /dev/null and b/www/public/images/blog/2022-march/community-day.png differ
diff --git a/www/public/images/blog/2022-march/enterprise.png b/www/public/images/blog/2022-march/enterprise.png
new file mode 100644
index 00000000000..0b0e498023b
Binary files /dev/null and b/www/public/images/blog/2022-march/enterprise.png differ
diff --git a/www/public/images/blog/2022-march/functions.png b/www/public/images/blog/2022-march/functions.png
new file mode 100644
index 00000000000..ecec41070e8
Binary files /dev/null and b/www/public/images/blog/2022-march/functions.png differ
diff --git a/www/public/images/blog/2022-march/graphql.jpg b/www/public/images/blog/2022-march/graphql.jpg
new file mode 100644
index 00000000000..8602e8b8cab
Binary files /dev/null and b/www/public/images/blog/2022-march/graphql.jpg differ
diff --git a/www/public/images/blog/2022-march/open-source.png b/www/public/images/blog/2022-march/open-source.png
new file mode 100644
index 00000000000..0acd1e0edb9
Binary files /dev/null and b/www/public/images/blog/2022-march/open-source.png differ
diff --git a/www/public/images/blog/2022-march/realtime.png b/www/public/images/blog/2022-march/realtime.png
new file mode 100644
index 00000000000..f51f69b91e7
Binary files /dev/null and b/www/public/images/blog/2022-march/realtime.png differ
diff --git a/www/public/images/blog/2022-march/secret-scanning.png b/www/public/images/blog/2022-march/secret-scanning.png
new file mode 100644
index 00000000000..f2a2ad6556b
Binary files /dev/null and b/www/public/images/blog/2022-march/secret-scanning.png differ
diff --git a/www/public/images/blog/2022-march/supabrew.png b/www/public/images/blog/2022-march/supabrew.png
new file mode 100644
index 00000000000..9a51c319052
Binary files /dev/null and b/www/public/images/blog/2022-march/supabrew.png differ
diff --git a/www/public/images/blog/2022-march/thumb.jpg b/www/public/images/blog/2022-march/thumb.jpg
new file mode 100644
index 00000000000..5d0bf1c6d73
Binary files /dev/null and b/www/public/images/blog/2022-march/thumb.jpg differ
diff --git a/www/public/images/blog/2022-march/twitter.png b/www/public/images/blog/2022-march/twitter.png
new file mode 100644
index 00000000000..21f9c10e296
Binary files /dev/null and b/www/public/images/blog/2022-march/twitter.png differ
diff --git a/www/public/images/blog/angels-of-supabase.png b/www/public/images/blog/angels-of-supabase.png
new file mode 100644
index 00000000000..433b7fe1651
Binary files /dev/null and b/www/public/images/blog/angels-of-supabase.png differ
diff --git a/www/public/images/blog/angels/brian-douglas-supabase.png b/www/public/images/blog/angels/brian-douglas-supabase.png
new file mode 100644
index 00000000000..da66cb2fbe6
Binary files /dev/null and b/www/public/images/blog/angels/brian-douglas-supabase.png differ
diff --git a/www/public/images/blog/angels/cassidy-williams-supabase.png b/www/public/images/blog/angels/cassidy-williams-supabase.png
new file mode 100644
index 00000000000..f161b438b7e
Binary files /dev/null and b/www/public/images/blog/angels/cassidy-williams-supabase.png differ
diff --git a/www/public/images/blog/angels/iheanyi-ekechukwu-supabase.png b/www/public/images/blog/angels/iheanyi-ekechukwu-supabase.png
new file mode 100644
index 00000000000..d6e2b781a30
Binary files /dev/null and b/www/public/images/blog/angels/iheanyi-ekechukwu-supabase.png differ
diff --git a/www/public/images/blog/angels/justin-gauge-supabase.png b/www/public/images/blog/angels/justin-gauge-supabase.png
new file mode 100644
index 00000000000..7b3c473b0c6
Binary files /dev/null and b/www/public/images/blog/angels/justin-gauge-supabase.png differ
diff --git a/www/public/images/blog/angels/kwuchu.mp4 b/www/public/images/blog/angels/kwuchu.mp4
new file mode 100644
index 00000000000..75f6a12c1d6
Binary files /dev/null and b/www/public/images/blog/angels/kwuchu.mp4 differ
diff --git a/www/public/images/blog/angels/mike-krieger-supabase.png b/www/public/images/blog/angels/mike-krieger-supabase.png
new file mode 100644
index 00000000000..5b761e5dea2
Binary files /dev/null and b/www/public/images/blog/angels/mike-krieger-supabase.png differ
diff --git a/www/public/images/blog/angels/swyx-supabase.png b/www/public/images/blog/angels/swyx-supabase.png
new file mode 100644
index 00000000000..482d547da02
Binary files /dev/null and b/www/public/images/blog/angels/swyx-supabase.png differ
diff --git a/www/public/images/blog/angels/thor-supabase.png b/www/public/images/blog/angels/thor-supabase.png
new file mode 100644
index 00000000000..64bf9f3ab54
Binary files /dev/null and b/www/public/images/blog/angels/thor-supabase.png differ
diff --git a/www/public/images/blog/angels/zach-waterfield-supabase.png b/www/public/images/blog/angels/zach-waterfield-supabase.png
new file mode 100644
index 00000000000..f671775af4a
Binary files /dev/null and b/www/public/images/blog/angels/zach-waterfield-supabase.png differ
diff --git a/www/public/images/blog/april-2021/fireship.png b/www/public/images/blog/april-2021/fireship.png
new file mode 100644
index 00000000000..1e445a31bde
Binary files /dev/null and b/www/public/images/blog/april-2021/fireship.png differ
diff --git a/www/public/images/blog/april-2021/hiring.png b/www/public/images/blog/april-2021/hiring.png
new file mode 100644
index 00000000000..50ea98015ba
Binary files /dev/null and b/www/public/images/blog/april-2021/hiring.png differ
diff --git a/www/public/images/blog/april-2021/light-mode.mov b/www/public/images/blog/april-2021/light-mode.mov
new file mode 100644
index 00000000000..1072deba46c
Binary files /dev/null and b/www/public/images/blog/april-2021/light-mode.mov differ
diff --git a/www/public/images/blog/april-2021/light-mode.mp4 b/www/public/images/blog/april-2021/light-mode.mp4
new file mode 100644
index 00000000000..5a5516d2069
Binary files /dev/null and b/www/public/images/blog/april-2021/light-mode.mp4 differ
diff --git a/www/public/images/blog/april-2021/map.png b/www/public/images/blog/april-2021/map.png
new file mode 100644
index 00000000000..5b1a9be013c
Binary files /dev/null and b/www/public/images/blog/april-2021/map.png differ
diff --git a/www/public/images/blog/april-2021/release-apr-2021.jpg b/www/public/images/blog/april-2021/release-apr-2021.jpg
new file mode 100644
index 00000000000..8e16ed644f2
Binary files /dev/null and b/www/public/images/blog/april-2021/release-apr-2021.jpg differ
diff --git a/www/public/images/blog/april-2021/stars-all.png b/www/public/images/blog/april-2021/stars-all.png
new file mode 100644
index 00000000000..fffab3bb3ad
Binary files /dev/null and b/www/public/images/blog/april-2021/stars-all.png differ
diff --git a/www/public/images/blog/april-2021/stars-realtime.png b/www/public/images/blog/april-2021/stars-realtime.png
new file mode 100644
index 00000000000..0666c531242
Binary files /dev/null and b/www/public/images/blog/april-2021/stars-realtime.png differ
diff --git a/www/public/images/blog/april-2021/stars-ui.png b/www/public/images/blog/april-2021/stars-ui.png
new file mode 100644
index 00000000000..f8b0b81720c
Binary files /dev/null and b/www/public/images/blog/april-2021/stars-ui.png differ
diff --git a/www/public/images/blog/april-2021/storage-openapi.png b/www/public/images/blog/april-2021/storage-openapi.png
new file mode 100644
index 00000000000..380721e0f7b
Binary files /dev/null and b/www/public/images/blog/april-2021/storage-openapi.png differ
diff --git a/www/public/images/blog/april-2021/stripe-sync-engine.jpg b/www/public/images/blog/april-2021/stripe-sync-engine.jpg
new file mode 100644
index 00000000000..14c7e7f4784
Binary files /dev/null and b/www/public/images/blog/april-2021/stripe-sync-engine.jpg differ
diff --git a/www/public/images/blog/april-2021/supascript.png b/www/public/images/blog/april-2021/supascript.png
new file mode 100644
index 00000000000..9d0cebd1ad3
Binary files /dev/null and b/www/public/images/blog/april-2021/supascript.png differ
diff --git a/www/public/images/blog/april-2021/threaded-full.mov b/www/public/images/blog/april-2021/threaded-full.mov
new file mode 100644
index 00000000000..b58976960be
Binary files /dev/null and b/www/public/images/blog/april-2021/threaded-full.mov differ
diff --git a/www/public/images/blog/april-2021/threaded-small.mp4 b/www/public/images/blog/april-2021/threaded-small.mp4
new file mode 100644
index 00000000000..8761e65216d
Binary files /dev/null and b/www/public/images/blog/april-2021/threaded-small.mp4 differ
diff --git a/www/public/images/blog/april-2021/twitter-darkmode.png b/www/public/images/blog/april-2021/twitter-darkmode.png
new file mode 100644
index 00000000000..fc1f05b8512
Binary files /dev/null and b/www/public/images/blog/april-2021/twitter-darkmode.png differ
diff --git a/www/public/images/blog/auth-audit.png b/www/public/images/blog/auth-audit.png
new file mode 100644
index 00000000000..29a2f3a51ce
Binary files /dev/null and b/www/public/images/blog/auth-audit.png differ
diff --git a/www/public/images/blog/auth-azure-and-facebook.png b/www/public/images/blog/auth-azure-and-facebook.png
new file mode 100644
index 00000000000..560fb160a49
Binary files /dev/null and b/www/public/images/blog/auth-azure-and-facebook.png differ
diff --git a/www/public/images/blog/auth-v2/generate-links.png b/www/public/images/blog/auth-v2/generate-links.png
new file mode 100644
index 00000000000..3452514ac60
Binary files /dev/null and b/www/public/images/blog/auth-v2/generate-links.png differ
diff --git a/www/public/images/blog/auth-v2/passwordless-login.png b/www/public/images/blog/auth-v2/passwordless-login.png
new file mode 100644
index 00000000000..9ef7cb8918c
Binary files /dev/null and b/www/public/images/blog/auth-v2/passwordless-login.png differ
diff --git a/www/public/images/blog/auth-v2/phone-and-password-login.png b/www/public/images/blog/auth-v2/phone-and-password-login.png
new file mode 100644
index 00000000000..61856169543
Binary files /dev/null and b/www/public/images/blog/auth-v2/phone-and-password-login.png differ
diff --git a/www/public/images/blog/auth-v2/supabase-auth-v2-cover.jpg b/www/public/images/blog/auth-v2/supabase-auth-v2-cover.jpg
new file mode 100644
index 00000000000..8b3c3b9761a
Binary files /dev/null and b/www/public/images/blog/auth-v2/supabase-auth-v2-cover.jpg differ
diff --git a/www/public/images/blog/auth-v2/supabase-auth-v2-og.jpg b/www/public/images/blog/auth-v2/supabase-auth-v2-og.jpg
new file mode 100644
index 00000000000..414da6cb3ed
Binary files /dev/null and b/www/public/images/blog/auth-v2/supabase-auth-v2-og.jpg differ
diff --git a/www/public/images/blog/auth-v2/supabase-oauth-providers.png b/www/public/images/blog/auth-v2/supabase-oauth-providers.png
new file mode 100644
index 00000000000..3effaaa09ca
Binary files /dev/null and b/www/public/images/blog/auth-v2/supabase-oauth-providers.png differ
diff --git a/www/public/images/blog/auth-v2/verify-otp.png b/www/public/images/blog/auth-v2/verify-otp.png
new file mode 100644
index 00000000000..602c4af4b41
Binary files /dev/null and b/www/public/images/blog/auth-v2/verify-otp.png differ
diff --git a/www/public/images/blog/auth-widget.png b/www/public/images/blog/auth-widget.png
new file mode 100644
index 00000000000..64ebd80d301
Binary files /dev/null and b/www/public/images/blog/auth-widget.png differ
diff --git a/www/public/images/blog/avatars/aaron-epsilon3.png b/www/public/images/blog/avatars/aaron-epsilon3.png
new file mode 100644
index 00000000000..78b3ebcdd09
Binary files /dev/null and b/www/public/images/blog/avatars/aaron-epsilon3.png differ
diff --git a/www/public/images/blog/avatars/caryn-marooney.jpeg b/www/public/images/blog/avatars/caryn-marooney.jpeg
new file mode 100644
index 00000000000..4b14c5733ce
Binary files /dev/null and b/www/public/images/blog/avatars/caryn-marooney.jpeg differ
diff --git a/www/public/images/blog/avatars/chase-granberry.png b/www/public/images/blog/avatars/chase-granberry.png
new file mode 100644
index 00000000000..ab18ae99d85
Binary files /dev/null and b/www/public/images/blog/avatars/chase-granberry.png differ
diff --git a/www/public/images/blog/avatars/clark-dinnison.jpeg b/www/public/images/blog/avatars/clark-dinnison.jpeg
new file mode 100644
index 00000000000..42cc4b9f581
Binary files /dev/null and b/www/public/images/blog/avatars/clark-dinnison.jpeg differ
diff --git a/www/public/images/blog/avatars/intheloop-kevin.png b/www/public/images/blog/avatars/intheloop-kevin.png
new file mode 100644
index 00000000000..22e9c629f6c
Binary files /dev/null and b/www/public/images/blog/avatars/intheloop-kevin.png differ
diff --git a/www/public/images/blog/avatars/jian-mobbin.jpg b/www/public/images/blog/avatars/jian-mobbin.jpg
new file mode 100644
index 00000000000..092cf515a0f
Binary files /dev/null and b/www/public/images/blog/avatars/jian-mobbin.jpg differ
diff --git a/www/public/images/blog/avatars/tyler-spot.jpg b/www/public/images/blog/avatars/tyler-spot.jpg
new file mode 100644
index 00000000000..83e303c05c6
Binary files /dev/null and b/www/public/images/blog/avatars/tyler-spot.jpg differ
diff --git a/www/public/images/blog/avatars/vignesh-sound.jpeg b/www/public/images/blog/avatars/vignesh-sound.jpeg
new file mode 100644
index 00000000000..e823eccdbc4
Binary files /dev/null and b/www/public/images/blog/avatars/vignesh-sound.jpeg differ
diff --git a/www/public/images/blog/avatars/wataru.jpeg b/www/public/images/blog/avatars/wataru.jpeg
new file mode 100644
index 00000000000..42a728c9be4
Binary files /dev/null and b/www/public/images/blog/avatars/wataru.jpeg differ
diff --git a/www/public/images/blog/avatars/zach-waterfield.png b/www/public/images/blog/avatars/zach-waterfield.png
new file mode 100644
index 00000000000..056ef0310ff
Binary files /dev/null and b/www/public/images/blog/avatars/zach-waterfield.png differ
diff --git a/www/public/images/blog/blog-placeholder.png b/www/public/images/blog/blog-placeholder.png
new file mode 100644
index 00000000000..3466771560c
Binary files /dev/null and b/www/public/images/blog/blog-placeholder.png differ
diff --git a/www/public/images/blog/blog/auth-audit.png b/www/public/images/blog/blog/auth-audit.png
new file mode 100644
index 00000000000..29a2f3a51ce
Binary files /dev/null and b/www/public/images/blog/blog/auth-audit.png differ
diff --git a/www/public/images/blog/blog/auth-azure-and-facebook.png b/www/public/images/blog/blog/auth-azure-and-facebook.png
new file mode 100644
index 00000000000..560fb160a49
Binary files /dev/null and b/www/public/images/blog/blog/auth-azure-and-facebook.png differ
diff --git a/www/public/images/blog/blog/auth-widget.png b/www/public/images/blog/blog/auth-widget.png
new file mode 100644
index 00000000000..64ebd80d301
Binary files /dev/null and b/www/public/images/blog/blog/auth-widget.png differ
diff --git a/www/public/images/blog/blog/core-web-vitals.png b/www/public/images/blog/blog/core-web-vitals.png
new file mode 100644
index 00000000000..748e1d63c16
Binary files /dev/null and b/www/public/images/blog/blog/core-web-vitals.png differ
diff --git a/www/public/images/blog/blog/countries.gif b/www/public/images/blog/blog/countries.gif
new file mode 100644
index 00000000000..7ccbcec3d55
Binary files /dev/null and b/www/public/images/blog/blog/countries.gif differ
diff --git a/www/public/images/blog/blog/dec-beta.png b/www/public/images/blog/blog/dec-beta.png
new file mode 100644
index 00000000000..9afabe75f7e
Binary files /dev/null and b/www/public/images/blog/blog/dec-beta.png differ
diff --git a/www/public/images/blog/blog/dec-starcount.png b/www/public/images/blog/blog/dec-starcount.png
new file mode 100644
index 00000000000..c1cc76efa4c
Binary files /dev/null and b/www/public/images/blog/blog/dec-starcount.png differ
diff --git a/www/public/images/blog/blog/jan-21-starcount.png b/www/public/images/blog/blog/jan-21-starcount.png
new file mode 100644
index 00000000000..86cf0c10b2f
Binary files /dev/null and b/www/public/images/blog/blog/jan-21-starcount.png differ
diff --git a/www/public/images/blog/blog/nextjs-tree-analyzer.png b/www/public/images/blog/blog/nextjs-tree-analyzer.png
new file mode 100644
index 00000000000..d6f95674bd5
Binary files /dev/null and b/www/public/images/blog/blog/nextjs-tree-analyzer.png differ
diff --git a/www/public/images/blog/blog/npm-dependencies.png b/www/public/images/blog/blog/npm-dependencies.png
new file mode 100644
index 00000000000..853b6c8ab8c
Binary files /dev/null and b/www/public/images/blog/blog/npm-dependencies.png differ
diff --git a/www/public/images/blog/blog/policies-email.png b/www/public/images/blog/blog/policies-email.png
new file mode 100644
index 00000000000..2a6aafd6be6
Binary files /dev/null and b/www/public/images/blog/blog/policies-email.png differ
diff --git a/www/public/images/blog/blog/postgres-count.png b/www/public/images/blog/blog/postgres-count.png
new file mode 100644
index 00000000000..d61591f074a
Binary files /dev/null and b/www/public/images/blog/blog/postgres-count.png differ
diff --git a/www/public/images/blog/blog/react-server-components-supabase.png b/www/public/images/blog/blog/react-server-components-supabase.png
new file mode 100644
index 00000000000..f32424fbe50
Binary files /dev/null and b/www/public/images/blog/blog/react-server-components-supabase.png differ
diff --git a/www/public/images/blog/blog/regions-london-sydney.png b/www/public/images/blog/blog/regions-london-sydney.png
new file mode 100644
index 00000000000..51d458e4583
Binary files /dev/null and b/www/public/images/blog/blog/regions-london-sydney.png differ
diff --git a/www/public/images/blog/blog/sentry-results.png b/www/public/images/blog/blog/sentry-results.png
new file mode 100644
index 00000000000..d154faf6be8
Binary files /dev/null and b/www/public/images/blog/blog/sentry-results.png differ
diff --git a/www/public/images/blog/blog/supabase-auth-series.png b/www/public/images/blog/blog/supabase-auth-series.png
new file mode 100644
index 00000000000..f5e34f79268
Binary files /dev/null and b/www/public/images/blog/blog/supabase-auth-series.png differ
diff --git a/www/public/images/blog/bouncer/connection-pool.png b/www/public/images/blog/bouncer/connection-pool.png
new file mode 100644
index 00000000000..c1206da9695
Binary files /dev/null and b/www/public/images/blog/bouncer/connection-pool.png differ
diff --git a/www/public/images/blog/bouncer/pgbouncer-supabase-og.jpg b/www/public/images/blog/bouncer/pgbouncer-supabase-og.jpg
new file mode 100644
index 00000000000..54a579c380d
Binary files /dev/null and b/www/public/images/blog/bouncer/pgbouncer-supabase-og.jpg differ
diff --git a/www/public/images/blog/bouncer/pgbouncer-thumb.jpg b/www/public/images/blog/bouncer/pgbouncer-thumb.jpg
new file mode 100644
index 00000000000..a70b87be745
Binary files /dev/null and b/www/public/images/blog/bouncer/pgbouncer-thumb.jpg differ
diff --git a/www/public/images/blog/bouncer/pooler-supabase.png b/www/public/images/blog/bouncer/pooler-supabase.png
new file mode 100644
index 00000000000..c6eca7d6d31
Binary files /dev/null and b/www/public/images/blog/bouncer/pooler-supabase.png differ
diff --git a/www/public/images/blog/check.svg b/www/public/images/blog/check.svg
new file mode 100644
index 00000000000..c708bd28f7a
--- /dev/null
+++ b/www/public/images/blog/check.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/www/public/images/blog/cli/cli-og.jpg b/www/public/images/blog/cli/cli-og.jpg
new file mode 100644
index 00000000000..8c8e505dcc6
Binary files /dev/null and b/www/public/images/blog/cli/cli-og.jpg differ
diff --git a/www/public/images/blog/cli/pgadmin-diff.png b/www/public/images/blog/cli/pgadmin-diff.png
new file mode 100644
index 00000000000..c0c57d22d07
Binary files /dev/null and b/www/public/images/blog/cli/pgadmin-diff.png differ
diff --git a/www/public/images/blog/community-august.png b/www/public/images/blog/community-august.png
new file mode 100644
index 00000000000..ee62c54230c
Binary files /dev/null and b/www/public/images/blog/community-august.png differ
diff --git a/www/public/images/blog/community-day/star-growth-july.png b/www/public/images/blog/community-day/star-growth-july.png
new file mode 100644
index 00000000000..c6112110596
Binary files /dev/null and b/www/public/images/blog/community-day/star-growth-july.png differ
diff --git a/www/public/images/blog/core-web-vitals.png b/www/public/images/blog/core-web-vitals.png
new file mode 100644
index 00000000000..748e1d63c16
Binary files /dev/null and b/www/public/images/blog/core-web-vitals.png differ
diff --git a/www/public/images/blog/countries.gif b/www/public/images/blog/countries.gif
new file mode 100644
index 00000000000..7ccbcec3d55
Binary files /dev/null and b/www/public/images/blog/countries.gif differ
diff --git a/www/public/images/blog/custom-docs.png b/www/public/images/blog/custom-docs.png
new file mode 100644
index 00000000000..65b688effa6
Binary files /dev/null and b/www/public/images/blog/custom-docs.png differ
diff --git a/www/public/images/blog/dec-beta.png b/www/public/images/blog/dec-beta.png
new file mode 100644
index 00000000000..9afabe75f7e
Binary files /dev/null and b/www/public/images/blog/dec-beta.png differ
diff --git a/www/public/images/blog/dec-starcount.png b/www/public/images/blog/dec-starcount.png
new file mode 100644
index 00000000000..c1cc76efa4c
Binary files /dev/null and b/www/public/images/blog/dec-starcount.png differ
diff --git a/www/public/images/blog/delete-users.gif b/www/public/images/blog/delete-users.gif
new file mode 100644
index 00000000000..08eb2491e76
Binary files /dev/null and b/www/public/images/blog/delete-users.gif differ
diff --git a/www/public/images/blog/digital-ocean-emails-errors.png b/www/public/images/blog/digital-ocean-emails-errors.png
new file mode 100644
index 00000000000..aec2f7a5d82
Binary files /dev/null and b/www/public/images/blog/digital-ocean-emails-errors.png differ
diff --git a/www/public/images/blog/elephants.png b/www/public/images/blog/elephants.png
new file mode 100644
index 00000000000..8349e99af06
Binary files /dev/null and b/www/public/images/blog/elephants.png differ
diff --git a/www/public/images/blog/epsilon3/cover-epsilon3.jpg b/www/public/images/blog/epsilon3/cover-epsilon3.jpg
new file mode 100644
index 00000000000..5c0bd2abb68
Binary files /dev/null and b/www/public/images/blog/epsilon3/cover-epsilon3.jpg differ
diff --git a/www/public/images/blog/epsilon3/epsilon3-product.gif b/www/public/images/blog/epsilon3/epsilon3-product.gif
new file mode 100644
index 00000000000..d4cbd4a2f57
Binary files /dev/null and b/www/public/images/blog/epsilon3/epsilon3-product.gif differ
diff --git a/www/public/images/blog/epsilon3/og-epsilon3.jpg b/www/public/images/blog/epsilon3/og-epsilon3.jpg
new file mode 100644
index 00000000000..23648677f1f
Binary files /dev/null and b/www/public/images/blog/epsilon3/og-epsilon3.jpg differ
diff --git a/www/public/images/blog/epsilon3/supabase-epsilon3-architecture.png b/www/public/images/blog/epsilon3/supabase-epsilon3-architecture.png
new file mode 100644
index 00000000000..76912cefce4
Binary files /dev/null and b/www/public/images/blog/epsilon3/supabase-epsilon3-architecture.png differ
diff --git a/www/public/images/blog/feb/auth-redirect.png b/www/public/images/blog/feb/auth-redirect.png
new file mode 100644
index 00000000000..79fa8136503
Binary files /dev/null and b/www/public/images/blog/feb/auth-redirect.png differ
diff --git a/www/public/images/blog/feb/autocomplete.mp4 b/www/public/images/blog/feb/autocomplete.mp4
new file mode 100644
index 00000000000..73a4802dccc
Binary files /dev/null and b/www/public/images/blog/feb/autocomplete.mp4 differ
diff --git a/www/public/images/blog/feb/docs-resources.png b/www/public/images/blog/feb/docs-resources.png
new file mode 100644
index 00000000000..ef093486cc0
Binary files /dev/null and b/www/public/images/blog/feb/docs-resources.png differ
diff --git a/www/public/images/blog/feb/github-stars-feb-2021.png b/www/public/images/blog/feb/github-stars-feb-2021.png
new file mode 100644
index 00000000000..a8b707b004d
Binary files /dev/null and b/www/public/images/blog/feb/github-stars-feb-2021.png differ
diff --git a/www/public/images/blog/feb/manage-replication.png b/www/public/images/blog/feb/manage-replication.png
new file mode 100644
index 00000000000..1649b0a1ce1
Binary files /dev/null and b/www/public/images/blog/feb/manage-replication.png differ
diff --git a/www/public/images/blog/feb/new-region-south-africa.png b/www/public/images/blog/feb/new-region-south-africa.png
new file mode 100644
index 00000000000..03daa4e48a6
Binary files /dev/null and b/www/public/images/blog/feb/new-region-south-africa.png differ
diff --git a/www/public/images/blog/feb/sidebar-sql.png b/www/public/images/blog/feb/sidebar-sql.png
new file mode 100644
index 00000000000..9bf465178d7
Binary files /dev/null and b/www/public/images/blog/feb/sidebar-sql.png differ
diff --git a/www/public/images/blog/feb/sidebar-tables.png b/www/public/images/blog/feb/sidebar-tables.png
new file mode 100644
index 00000000000..d62ad7ebd61
Binary files /dev/null and b/www/public/images/blog/feb/sidebar-tables.png differ
diff --git a/www/public/images/blog/feb/supabase-stencil.png b/www/public/images/blog/feb/supabase-stencil.png
new file mode 100644
index 00000000000..3358b617167
Binary files /dev/null and b/www/public/images/blog/feb/supabase-stencil.png differ
diff --git a/www/public/images/blog/feb/supabase-storage.png b/www/public/images/blog/feb/supabase-storage.png
new file mode 100644
index 00000000000..52dce2f47b4
Binary files /dev/null and b/www/public/images/blog/feb/supabase-storage.png differ
diff --git a/www/public/images/blog/functions-updates/enable-hooks.png b/www/public/images/blog/functions-updates/enable-hooks.png
new file mode 100644
index 00000000000..6242e31f36f
Binary files /dev/null and b/www/public/images/blog/functions-updates/enable-hooks.png differ
diff --git a/www/public/images/blog/functions-updates/functions-timeline.png b/www/public/images/blog/functions-updates/functions-timeline.png
new file mode 100644
index 00000000000..359b4e437bb
Binary files /dev/null and b/www/public/images/blog/functions-updates/functions-timeline.png differ
diff --git a/www/public/images/blog/functions-updates/hook-events.png b/www/public/images/blog/functions-updates/hook-events.png
new file mode 100644
index 00000000000..756ad9cd34b
Binary files /dev/null and b/www/public/images/blog/functions-updates/hook-events.png differ
diff --git a/www/public/images/blog/functions-updates/og-supabase-hooks.jpg b/www/public/images/blog/functions-updates/og-supabase-hooks.jpg
new file mode 100644
index 00000000000..007bad66cec
Binary files /dev/null and b/www/public/images/blog/functions-updates/og-supabase-hooks.jpg differ
diff --git a/www/public/images/blog/functions-updates/postgres-functions.png b/www/public/images/blog/functions-updates/postgres-functions.png
new file mode 100644
index 00000000000..85fa386106f
Binary files /dev/null and b/www/public/images/blog/functions-updates/postgres-functions.png differ
diff --git a/www/public/images/blog/functions-updates/postgres-triggers.png b/www/public/images/blog/functions-updates/postgres-triggers.png
new file mode 100644
index 00000000000..26ab467b47c
Binary files /dev/null and b/www/public/images/blog/functions-updates/postgres-triggers.png differ
diff --git a/www/public/images/blog/functions-updates/supabase-function-hooks.png b/www/public/images/blog/functions-updates/supabase-function-hooks.png
new file mode 100644
index 00000000000..dd19502d02b
Binary files /dev/null and b/www/public/images/blog/functions-updates/supabase-function-hooks.png differ
diff --git a/www/public/images/blog/functions-updates/thumb-supabase-hooks.jpg b/www/public/images/blog/functions-updates/thumb-supabase-hooks.jpg
new file mode 100644
index 00000000000..ecf70548104
Binary files /dev/null and b/www/public/images/blog/functions-updates/thumb-supabase-hooks.jpg differ
diff --git a/www/public/images/blog/hackathon-winners/badges/gold-meme.png b/www/public/images/blog/hackathon-winners/badges/gold-meme.png
new file mode 100644
index 00000000000..424ccd35899
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/gold-meme.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/gold-technically-challenging.png b/www/public/images/blog/hackathon-winners/badges/gold-technically-challenging.png
new file mode 100644
index 00000000000..6dd1890711a
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/gold-technically-challenging.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/gold-visually-pleasing.png b/www/public/images/blog/hackathon-winners/badges/gold-visually-pleasing.png
new file mode 100644
index 00000000000..52905c69e3c
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/gold-visually-pleasing.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-best-project-1.png b/www/public/images/blog/hackathon-winners/badges/silver-best-project-1.png
new file mode 100644
index 00000000000..0d7632bdcdf
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-best-project-1.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-best-project-2.png b/www/public/images/blog/hackathon-winners/badges/silver-best-project-2.png
new file mode 100644
index 00000000000..108add728ca
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-best-project-2.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-best-project-3.png b/www/public/images/blog/hackathon-winners/badges/silver-best-project-3.png
new file mode 100644
index 00000000000..17a1df377d5
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-best-project-3.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-best-project-4.png b/www/public/images/blog/hackathon-winners/badges/silver-best-project-4.png
new file mode 100644
index 00000000000..370f13d894b
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-best-project-4.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-meme.png b/www/public/images/blog/hackathon-winners/badges/silver-meme.png
new file mode 100644
index 00000000000..d41ce76d73b
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-meme.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-most-fun.png b/www/public/images/blog/hackathon-winners/badges/silver-most-fun.png
new file mode 100644
index 00000000000..58f45487942
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-most-fun.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-technically-challenging.png b/www/public/images/blog/hackathon-winners/badges/silver-technically-challenging.png
new file mode 100644
index 00000000000..fe9b3febc87
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-technically-challenging.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/silver-visually-pleasing.png b/www/public/images/blog/hackathon-winners/badges/silver-visually-pleasing.png
new file mode 100644
index 00000000000..873c39db314
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/silver-visually-pleasing.png differ
diff --git a/www/public/images/blog/hackathon-winners/badges/winner-best-project.png b/www/public/images/blog/hackathon-winners/badges/winner-best-project.png
new file mode 100644
index 00000000000..612cb01c718
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/badges/winner-best-project.png differ
diff --git a/www/public/images/blog/hackathon-winners/bring-the-func/funcwinners.png b/www/public/images/blog/hackathon-winners/bring-the-func/funcwinners.png
new file mode 100644
index 00000000000..1ccd0d91a06
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/bring-the-func/funcwinners.png differ
diff --git a/www/public/images/blog/hackathon-winners/bring-the-func/gold_function_tee.png b/www/public/images/blog/hackathon-winners/bring-the-func/gold_function_tee.png
new file mode 100644
index 00000000000..18dd81ab14b
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/bring-the-func/gold_function_tee.png differ
diff --git a/www/public/images/blog/hackathon-winners/holiday-hackdays/holiday-hackdays-winners-og.png b/www/public/images/blog/hackathon-winners/holiday-hackdays/holiday-hackdays-winners-og.png
new file mode 100644
index 00000000000..100cb6d4432
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/holiday-hackdays/holiday-hackdays-winners-og.png differ
diff --git a/www/public/images/blog/hackathon-winners/holiday-hackdays/holiday-hackdays-winners-shirt.png b/www/public/images/blog/hackathon-winners/holiday-hackdays/holiday-hackdays-winners-shirt.png
new file mode 100644
index 00000000000..40473fe0a66
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/holiday-hackdays/holiday-hackdays-winners-shirt.png differ
diff --git a/www/public/images/blog/hackathon-winners/misc/hacktoberfest-og.png b/www/public/images/blog/hackathon-winners/misc/hacktoberfest-og.png
new file mode 100644
index 00000000000..663ac64ed9a
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/misc/hacktoberfest-og.png differ
diff --git a/www/public/images/blog/hackathon-winners/misc/judges.png b/www/public/images/blog/hackathon-winners/misc/judges.png
new file mode 100644
index 00000000000..2abd21534a8
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/misc/judges.png differ
diff --git a/www/public/images/blog/hackathon-winners/misc/meme3.jpg b/www/public/images/blog/hackathon-winners/misc/meme3.jpg
new file mode 100644
index 00000000000..a0947f8e42f
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/misc/meme3.jpg differ
diff --git a/www/public/images/blog/hackathon-winners/misc/winners-og.png b/www/public/images/blog/hackathon-winners/misc/winners-og.png
new file mode 100644
index 00000000000..bdddad0d7e7
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/misc/winners-og.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/addons.png b/www/public/images/blog/hackathon-winners/projects/addons.png
new file mode 100644
index 00000000000..3065efdc3dd
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/addons.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/coursebuddy.png b/www/public/images/blog/hackathon-winners/projects/coursebuddy.png
new file mode 100644
index 00000000000..00d35adcba4
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/coursebuddy.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/dictionary.png b/www/public/images/blog/hackathon-winners/projects/dictionary.png
new file mode 100644
index 00000000000..df537e9869d
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/dictionary.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/featureso.png b/www/public/images/blog/hackathon-winners/projects/featureso.png
new file mode 100644
index 00000000000..4c8e5008378
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/featureso.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/feedback.png b/www/public/images/blog/hackathon-winners/projects/feedback.png
new file mode 100644
index 00000000000..c64eb970404
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/feedback.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/fireplace.png b/www/public/images/blog/hackathon-winners/projects/fireplace.png
new file mode 100644
index 00000000000..7754837ed4b
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/fireplace.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/guest.gif b/www/public/images/blog/hackathon-winners/projects/guest.gif
new file mode 100644
index 00000000000..7c7c94751f3
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/guest.gif differ
diff --git a/www/public/images/blog/hackathon-winners/projects/intro.gif b/www/public/images/blog/hackathon-winners/projects/intro.gif
new file mode 100644
index 00000000000..1cece02abd9
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/intro.gif differ
diff --git a/www/public/images/blog/hackathon-winners/projects/ogsupa.png b/www/public/images/blog/hackathon-winners/projects/ogsupa.png
new file mode 100644
index 00000000000..cd8a5759838
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/ogsupa.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/peach1.png b/www/public/images/blog/hackathon-winners/projects/peach1.png
new file mode 100644
index 00000000000..01602a69e76
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/peach1.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/peach2.png b/www/public/images/blog/hackathon-winners/projects/peach2.png
new file mode 100644
index 00000000000..77b56550e58
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/peach2.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/pickle.png b/www/public/images/blog/hackathon-winners/projects/pickle.png
new file mode 100644
index 00000000000..24a4131fff6
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/pickle.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/ppaas.png b/www/public/images/blog/hackathon-winners/projects/ppaas.png
new file mode 100644
index 00000000000..108d89240c7
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/ppaas.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/relm.png b/www/public/images/blog/hackathon-winners/projects/relm.png
new file mode 100644
index 00000000000..d0e7f2b9bdf
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/relm.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/result.gif b/www/public/images/blog/hackathon-winners/projects/result.gif
new file mode 100644
index 00000000000..480aebe69fc
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/result.gif differ
diff --git a/www/public/images/blog/hackathon-winners/projects/spookd.png b/www/public/images/blog/hackathon-winners/projects/spookd.png
new file mode 100644
index 00000000000..a231714f6d0
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/spookd.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/suggestion.gif b/www/public/images/blog/hackathon-winners/projects/suggestion.gif
new file mode 100644
index 00000000000..fe592aa1d3c
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/suggestion.gif differ
diff --git a/www/public/images/blog/hackathon-winners/projects/tamog.png b/www/public/images/blog/hackathon-winners/projects/tamog.png
new file mode 100644
index 00000000000..7ceccf58adc
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/tamog.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/tlwr.png b/www/public/images/blog/hackathon-winners/projects/tlwr.png
new file mode 100644
index 00000000000..9dc7a4061dd
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/tlwr.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/tyler.png b/www/public/images/blog/hackathon-winners/projects/tyler.png
new file mode 100644
index 00000000000..e3ca53b2d18
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/tyler.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/utility.png b/www/public/images/blog/hackathon-winners/projects/utility.png
new file mode 100644
index 00000000000..664fd08b7fc
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/utility.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/uwu.png b/www/public/images/blog/hackathon-winners/projects/uwu.png
new file mode 100644
index 00000000000..9b64fcb5058
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/uwu.png differ
diff --git a/www/public/images/blog/hackathon-winners/projects/workday.png b/www/public/images/blog/hackathon-winners/projects/workday.png
new file mode 100644
index 00000000000..e11401461d6
Binary files /dev/null and b/www/public/images/blog/hackathon-winners/projects/workday.png differ
diff --git a/www/public/images/blog/hackathon/community.png b/www/public/images/blog/hackathon/community.png
new file mode 100644
index 00000000000..66fda404978
Binary files /dev/null and b/www/public/images/blog/hackathon/community.png differ
diff --git a/www/public/images/blog/hackathon/cover-supabase-hackathon.png b/www/public/images/blog/hackathon/cover-supabase-hackathon.png
new file mode 100644
index 00000000000..1a5d8fbb2be
Binary files /dev/null and b/www/public/images/blog/hackathon/cover-supabase-hackathon.png differ
diff --git a/www/public/images/blog/hackathon/judges.png b/www/public/images/blog/hackathon/judges.png
new file mode 100644
index 00000000000..ac71630df1e
Binary files /dev/null and b/www/public/images/blog/hackathon/judges.png differ
diff --git a/www/public/images/blog/hackathon/og-supabase-hackathon.png b/www/public/images/blog/hackathon/og-supabase-hackathon.png
new file mode 100644
index 00000000000..31e7bcc623f
Binary files /dev/null and b/www/public/images/blog/hackathon/og-supabase-hackathon.png differ
diff --git a/www/public/images/blog/hackathon/prizes.png b/www/public/images/blog/hackathon/prizes.png
new file mode 100644
index 00000000000..d7d7cb78c7e
Binary files /dev/null and b/www/public/images/blog/hackathon/prizes.png differ
diff --git a/www/public/images/blog/hackathon/tshirt.png b/www/public/images/blog/hackathon/tshirt.png
new file mode 100644
index 00000000000..a3bed914b1e
Binary files /dev/null and b/www/public/images/blog/hackathon/tshirt.png differ
diff --git a/www/public/images/blog/hacktoberfest-hackathon/hacktoberfest_banner.png b/www/public/images/blog/hacktoberfest-hackathon/hacktoberfest_banner.png
new file mode 100644
index 00000000000..9612f6bf392
Binary files /dev/null and b/www/public/images/blog/hacktoberfest-hackathon/hacktoberfest_banner.png differ
diff --git a/www/public/images/blog/hacktoberfest.png b/www/public/images/blog/hacktoberfest.png
new file mode 100644
index 00000000000..1df6e4aabaa
Binary files /dev/null and b/www/public/images/blog/hacktoberfest.png differ
diff --git a/www/public/images/blog/hn-launch.png b/www/public/images/blog/hn-launch.png
new file mode 100644
index 00000000000..33506a38075
Binary files /dev/null and b/www/public/images/blog/hn-launch.png differ
diff --git a/www/public/images/blog/how-client-libs.png b/www/public/images/blog/how-client-libs.png
new file mode 100644
index 00000000000..6362beeac67
Binary files /dev/null and b/www/public/images/blog/how-client-libs.png differ
diff --git a/www/public/images/blog/how-replication.png b/www/public/images/blog/how-replication.png
new file mode 100644
index 00000000000..97dad9afe1a
Binary files /dev/null and b/www/public/images/blog/how-replication.png differ
diff --git a/www/public/images/blog/how-transformation.png b/www/public/images/blog/how-transformation.png
new file mode 100644
index 00000000000..d0e404d821b
Binary files /dev/null and b/www/public/images/blog/how-transformation.png differ
diff --git a/www/public/images/blog/how-we-launch/how-we-launch-og.jpg b/www/public/images/blog/how-we-launch/how-we-launch-og.jpg
new file mode 100644
index 00000000000..b210ae358f7
Binary files /dev/null and b/www/public/images/blog/how-we-launch/how-we-launch-og.jpg differ
diff --git a/www/public/images/blog/how-we-launch/how-we-launch-retrospective.jpg b/www/public/images/blog/how-we-launch/how-we-launch-retrospective.jpg
new file mode 100644
index 00000000000..8c2a266b362
Binary files /dev/null and b/www/public/images/blog/how-we-launch/how-we-launch-retrospective.jpg differ
diff --git a/www/public/images/blog/how-we-launch/how-we-launch-stickers.jpg b/www/public/images/blog/how-we-launch/how-we-launch-stickers.jpg
new file mode 100644
index 00000000000..3ff0718db45
Binary files /dev/null and b/www/public/images/blog/how-we-launch/how-we-launch-stickers.jpg differ
diff --git a/www/public/images/blog/how-we-launch/how-we-launch-thumb.jpg b/www/public/images/blog/how-we-launch/how-we-launch-thumb.jpg
new file mode 100644
index 00000000000..106bda72778
Binary files /dev/null and b/www/public/images/blog/how-we-launch/how-we-launch-thumb.jpg differ
diff --git a/www/public/images/blog/how-we-launch/how-we-launch-timeline.jpg b/www/public/images/blog/how-we-launch/how-we-launch-timeline.jpg
new file mode 100644
index 00000000000..b6ce9e6d424
Binary files /dev/null and b/www/public/images/blog/how-we-launch/how-we-launch-timeline.jpg differ
diff --git a/www/public/images/blog/how-we-launch/supabase-universe.jpg b/www/public/images/blog/how-we-launch/supabase-universe.jpg
new file mode 100644
index 00000000000..f4528867bd1
Binary files /dev/null and b/www/public/images/blog/how-we-launch/supabase-universe.jpg differ
diff --git a/www/public/images/blog/how-we-launch/total-databases-launched.jpg b/www/public/images/blog/how-we-launch/total-databases-launched.jpg
new file mode 100644
index 00000000000..3e1cbdf2f3f
Binary files /dev/null and b/www/public/images/blog/how-we-launch/total-databases-launched.jpg differ
diff --git a/www/public/images/blog/intheloop-kevin.png b/www/public/images/blog/intheloop-kevin.png
new file mode 100644
index 00000000000..22e9c629f6c
Binary files /dev/null and b/www/public/images/blog/intheloop-kevin.png differ
diff --git a/www/public/images/blog/intheloop-screenshot.jpg b/www/public/images/blog/intheloop-screenshot.jpg
new file mode 100644
index 00000000000..4e1ce341ece
Binary files /dev/null and b/www/public/images/blog/intheloop-screenshot.jpg differ
diff --git a/www/public/images/blog/intheloop-supabase.jpg b/www/public/images/blog/intheloop-supabase.jpg
new file mode 100644
index 00000000000..bc7fd32c2b3
Binary files /dev/null and b/www/public/images/blog/intheloop-supabase.jpg differ
diff --git a/www/public/images/blog/invite-users.gif b/www/public/images/blog/invite-users.gif
new file mode 100644
index 00000000000..bd3a20c1c1f
Binary files /dev/null and b/www/public/images/blog/invite-users.gif differ
diff --git a/www/public/images/blog/jan-21-starcount.png b/www/public/images/blog/jan-21-starcount.png
new file mode 100644
index 00000000000..86cf0c10b2f
Binary files /dev/null and b/www/public/images/blog/jan-21-starcount.png differ
diff --git a/www/public/images/blog/keyboard-shortcuts.png b/www/public/images/blog/keyboard-shortcuts.png
new file mode 100644
index 00000000000..1d91c48b7bf
Binary files /dev/null and b/www/public/images/blog/keyboard-shortcuts.png differ
diff --git a/www/public/images/blog/launch-week-3/launch-week-3-og.jpg b/www/public/images/blog/launch-week-3/launch-week-3-og.jpg
new file mode 100644
index 00000000000..dcaece66ea8
Binary files /dev/null and b/www/public/images/blog/launch-week-3/launch-week-3-og.jpg differ
diff --git a/www/public/images/blog/launch-week-3/launch-week-3-thumb.jpg b/www/public/images/blog/launch-week-3/launch-week-3-thumb.jpg
new file mode 100644
index 00000000000..dcaece66ea8
Binary files /dev/null and b/www/public/images/blog/launch-week-3/launch-week-3-thumb.jpg differ
diff --git a/www/public/images/blog/launch-week-4/community-day/Untitled 1.png b/www/public/images/blog/launch-week-4/community-day/Untitled 1.png
new file mode 100644
index 00000000000..fc6ab47fc8a
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/Untitled 1.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/Untitled.png b/www/public/images/blog/launch-week-4/community-day/Untitled.png
new file mode 100644
index 00000000000..d46880d5eae
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/Untitled.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-auth-phone.png b/www/public/images/blog/launch-week-4/community-day/community-day-auth-phone.png
new file mode 100644
index 00000000000..b1cfbfa8430
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-auth-phone.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-auth-providers.png b/www/public/images/blog/launch-week-4/community-day/community-day-auth-providers.png
new file mode 100644
index 00000000000..9b8d42ab002
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-auth-providers.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-egghead.png b/www/public/images/blog/launch-week-4/community-day/community-day-egghead.png
new file mode 100644
index 00000000000..e6afd88d936
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-egghead.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-github.png b/www/public/images/blog/launch-week-4/community-day/community-day-github.png
new file mode 100644
index 00000000000..f2a2ad6556b
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-github.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-iconic.png b/www/public/images/blog/launch-week-4/community-day/community-day-iconic.png
new file mode 100644
index 00000000000..ecac071fb18
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-iconic.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-integrations.png b/www/public/images/blog/launch-week-4/community-day/community-day-integrations.png
new file mode 100644
index 00000000000..dd4e36920ab
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-integrations.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-level-up.png b/www/public/images/blog/launch-week-4/community-day/community-day-level-up.png
new file mode 100644
index 00000000000..65339a28b96
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-level-up.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-postgrest10.png b/www/public/images/blog/launch-week-4/community-day/community-day-postgrest10.png
new file mode 100644
index 00000000000..4efa109800b
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-postgrest10.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/community-day-thumb.png b/www/public/images/blog/launch-week-4/community-day/community-day-thumb.png
new file mode 100644
index 00000000000..69775fa3f90
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/community-day-thumb.png differ
diff --git a/www/public/images/blog/launch-week-4/community-day/supabase-auth-helpers-nextjs.png b/www/public/images/blog/launch-week-4/community-day/supabase-auth-helpers-nextjs.png
new file mode 100644
index 00000000000..03c1c6ec874
Binary files /dev/null and b/www/public/images/blog/launch-week-4/community-day/supabase-auth-helpers-nextjs.png differ
diff --git a/www/public/images/blog/launch-week-4/enterprise-day/enterprise-pricing.png b/www/public/images/blog/launch-week-4/enterprise-day/enterprise-pricing.png
new file mode 100644
index 00000000000..382cf0e232e
Binary files /dev/null and b/www/public/images/blog/launch-week-4/enterprise-day/enterprise-pricing.png differ
diff --git a/www/public/images/blog/launch-week-4/enterprise-day/enterprise-thumb.png b/www/public/images/blog/launch-week-4/enterprise-day/enterprise-thumb.png
new file mode 100644
index 00000000000..677fc39c811
Binary files /dev/null and b/www/public/images/blog/launch-week-4/enterprise-day/enterprise-thumb.png differ
diff --git a/www/public/images/blog/launch-week-4/enterprise-day/pg-bouncer.png b/www/public/images/blog/launch-week-4/enterprise-day/pg-bouncer.png
new file mode 100644
index 00000000000..9ed74c6f3f3
Binary files /dev/null and b/www/public/images/blog/launch-week-4/enterprise-day/pg-bouncer.png differ
diff --git a/www/public/images/blog/launch-week-4/enterprise-day/prometheus.png b/www/public/images/blog/launch-week-4/enterprise-day/prometheus.png
new file mode 100644
index 00000000000..db80ae48b21
Binary files /dev/null and b/www/public/images/blog/launch-week-4/enterprise-day/prometheus.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/beatles.png b/www/public/images/blog/launch-week-4/friday-before/beatles.png
new file mode 100644
index 00000000000..431a75d166f
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/beatles.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/channel-4-news.png b/www/public/images/blog/launch-week-4/friday-before/channel-4-news.png
new file mode 100644
index 00000000000..fa078037c10
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/channel-4-news.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/community.png b/www/public/images/blog/launch-week-4/friday-before/community.png
new file mode 100644
index 00000000000..54dfa931907
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/community.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/dino.png b/www/public/images/blog/launch-week-4/friday-before/dino.png
new file mode 100644
index 00000000000..a67d0dd7f32
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/dino.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/fantastic.png b/www/public/images/blog/launch-week-4/friday-before/fantastic.png
new file mode 100644
index 00000000000..2c8b9406758
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/fantastic.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo-cal.png b/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo-cal.png
new file mode 100644
index 00000000000..7c8c83fd46c
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo-cal.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo-detail.png b/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo-detail.png
new file mode 100644
index 00000000000..1f1c2db2a75
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo-detail.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo.png b/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo.png
new file mode 100644
index 00000000000..7e1bd4374b0
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/launchweek-4-promo.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-before/turtles.png b/www/public/images/blog/launch-week-4/friday-before/turtles.png
new file mode 100644
index 00000000000..f5e2a6faf34
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-before/turtles.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-hackathon/hackathon-fun-og.png b/www/public/images/blog/launch-week-4/friday-hackathon/hackathon-fun-og.png
new file mode 100644
index 00000000000..0c986911d63
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-hackathon/hackathon-fun-og.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-hackathon/hackathon_bring_the_func.png b/www/public/images/blog/launch-week-4/friday-hackathon/hackathon_bring_the_func.png
new file mode 100644
index 00000000000..28b8c6ef367
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-hackathon/hackathon_bring_the_func.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-realtime/multiplayer-realtime-thumb.png b/www/public/images/blog/launch-week-4/friday-realtime/multiplayer-realtime-thumb.png
new file mode 100644
index 00000000000..fc950c9fb25
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-realtime/multiplayer-realtime-thumb.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-broadcast.png b/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-broadcast.png
new file mode 100644
index 00000000000..fde0464c679
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-broadcast.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-og.png b/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-og.png
new file mode 100644
index 00000000000..fe97b1cbbb9
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-og.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-presence.png b/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-presence.png
new file mode 100644
index 00000000000..39e4a191fef
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-realtime/realtime-multiplayer-presence.png differ
diff --git a/www/public/images/blog/launch-week-4/friday-supabrew/antines.jpg b/www/public/images/blog/launch-week-4/friday-supabrew/antines.jpg
new file mode 100644
index 00000000000..ac3d778863d
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-supabrew/antines.jpg differ
diff --git a/www/public/images/blog/launch-week-4/friday-supabrew/copplepack.jpg b/www/public/images/blog/launch-week-4/friday-supabrew/copplepack.jpg
new file mode 100644
index 00000000000..3399af52a14
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-supabrew/copplepack.jpg differ
diff --git a/www/public/images/blog/launch-week-4/friday-supabrew/ines_swing.jpg b/www/public/images/blog/launch-week-4/friday-supabrew/ines_swing.jpg
new file mode 100644
index 00000000000..77019c06ae7
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-supabrew/ines_swing.jpg differ
diff --git a/www/public/images/blog/launch-week-4/friday-supabrew/productShot1.jpg b/www/public/images/blog/launch-week-4/friday-supabrew/productShot1.jpg
new file mode 100644
index 00000000000..9a556b0fc3c
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-supabrew/productShot1.jpg differ
diff --git a/www/public/images/blog/launch-week-4/friday-supabrew/productShot1.png b/www/public/images/blog/launch-week-4/friday-supabrew/productShot1.png
new file mode 100644
index 00000000000..bee3bf7f92e
Binary files /dev/null and b/www/public/images/blog/launch-week-4/friday-supabrew/productShot1.png differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/functions-architecture.png b/www/public/images/blog/launch-week-4/thursday-functions/functions-architecture.png
new file mode 100644
index 00000000000..3811d72facf
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/functions-architecture.png differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/functions-new-deploy-invoke-logs.gif b/www/public/images/blog/launch-week-4/thursday-functions/functions-new-deploy-invoke-logs.gif
new file mode 100644
index 00000000000..a68cc6e3e90
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/functions-new-deploy-invoke-logs.gif differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/functions-payment.gif b/www/public/images/blog/launch-week-4/thursday-functions/functions-payment.gif
new file mode 100644
index 00000000000..fd36a1e3eeb
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/functions-payment.gif differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/functions-quickstart.png b/www/public/images/blog/launch-week-4/thursday-functions/functions-quickstart.png
new file mode 100644
index 00000000000..cdf0090f083
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/functions-quickstart.png differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/functions-thumb.png b/www/public/images/blog/launch-week-4/thursday-functions/functions-thumb.png
new file mode 100644
index 00000000000..2e98c82c9ef
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/functions-thumb.png differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/invoke-logs.gif b/www/public/images/blog/launch-week-4/thursday-functions/invoke-logs.gif
new file mode 100644
index 00000000000..de97034af4f
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/invoke-logs.gif differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/new-deploy.gif b/www/public/images/blog/launch-week-4/thursday-functions/new-deploy.gif
new file mode 100644
index 00000000000..c9d8703561b
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/new-deploy.gif differ
diff --git a/www/public/images/blog/launch-week-4/thursday-functions/where-functions-deploy.png b/www/public/images/blog/launch-week-4/thursday-functions/where-functions-deploy.png
new file mode 100644
index 00000000000..3805f7dd3e0
Binary files /dev/null and b/www/public/images/blog/launch-week-4/thursday-functions/where-functions-deploy.png differ
diff --git a/www/public/images/blog/launch-week-4/tuesday-graphql/graph-ql-example-app-2.png b/www/public/images/blog/launch-week-4/tuesday-graphql/graph-ql-example-app-2.png
new file mode 100644
index 00000000000..48135bd5ad3
Binary files /dev/null and b/www/public/images/blog/launch-week-4/tuesday-graphql/graph-ql-example-app-2.png differ
diff --git a/www/public/images/blog/launch-week-4/tuesday-graphql/graph-ql-example-app.png b/www/public/images/blog/launch-week-4/tuesday-graphql/graph-ql-example-app.png
new file mode 100644
index 00000000000..a2b4123bbdb
Binary files /dev/null and b/www/public/images/blog/launch-week-4/tuesday-graphql/graph-ql-example-app.png differ
diff --git a/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-supabase-guild.png b/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-supabase-guild.png
new file mode 100644
index 00000000000..68639a1180a
Binary files /dev/null and b/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-supabase-guild.png differ
diff --git a/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-thumb-og.png b/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-thumb-og.png
new file mode 100644
index 00000000000..e132c772882
Binary files /dev/null and b/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-thumb-og.png differ
diff --git a/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-thumb.png b/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-thumb.png
new file mode 100644
index 00000000000..12ef9f5bc25
Binary files /dev/null and b/www/public/images/blog/launch-week-4/tuesday-graphql/graphql-thumb.png differ
diff --git a/www/public/images/blog/launch-week-4/tuesday-graphql/supameme.png b/www/public/images/blog/launch-week-4/tuesday-graphql/supameme.png
new file mode 100644
index 00000000000..2d912cbccc3
Binary files /dev/null and b/www/public/images/blog/launch-week-4/tuesday-graphql/supameme.png differ
diff --git a/www/public/images/blog/launch-week-pricing.jpg b/www/public/images/blog/launch-week-pricing.jpg
new file mode 100644
index 00000000000..2f33000ae36
Binary files /dev/null and b/www/public/images/blog/launch-week-pricing.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-discord-server.jpg b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-discord-server.jpg
new file mode 100644
index 00000000000..b045f5efa7c
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-discord-server.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-flutter-library.jpg b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-flutter-library.jpg
new file mode 100644
index 00000000000..e6be4803b27
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-flutter-library.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-og.jpg b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-og.jpg
new file mode 100644
index 00000000000..07836254615
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-og.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-postgres-upgrade.jpg b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-postgres-upgrade.jpg
new file mode 100644
index 00000000000..6abc0016021
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-postgres-upgrade.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-postgrest.jpg b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-postgrest.jpg
new file mode 100644
index 00000000000..1c1514eada0
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-postgrest.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-supasquad.jpg b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-supasquad.jpg
new file mode 100644
index 00000000000..3ef7e09f559
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-supasquad.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-thumb.jpg b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-thumb.jpg
new file mode 100644
index 00000000000..a806a6dba8c
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-1-community-day/launch-week-sql-day-1-community-day-thumb.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/context-menu-1.png b/www/public/images/blog/launch-week-sql-day-2/context-menu-1.png
new file mode 100644
index 00000000000..b85f33b8505
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/context-menu-1.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/context-menu-2.png b/www/public/images/blog/launch-week-sql-day-2/context-menu-2.png
new file mode 100644
index 00000000000..7d077bf8460
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/context-menu-2.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/policy-editor-1.png b/www/public/images/blog/launch-week-sql-day-2/policy-editor-1.png
new file mode 100644
index 00000000000..7465b200ed0
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/policy-editor-1.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/policy-editor-2.png b/www/public/images/blog/launch-week-sql-day-2/policy-editor-2.png
new file mode 100644
index 00000000000..b779aff7a22
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/policy-editor-2.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/stream-upload.png b/www/public/images/blog/launch-week-sql-day-2/stream-upload.png
new file mode 100644
index 00000000000..aae6af9feba
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/stream-upload.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/supabase-js-size.png b/www/public/images/blog/launch-week-sql-day-2/supabase-js-size.png
new file mode 100644
index 00000000000..434f7f23ec9
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/supabase-js-size.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/supabase-storage-beta-og.jpg b/www/public/images/blog/launch-week-sql-day-2/supabase-storage-beta-og.jpg
new file mode 100644
index 00000000000..6a701df2eb1
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/supabase-storage-beta-og.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/supabase-storage-beta.jpg b/www/public/images/blog/launch-week-sql-day-2/supabase-storage-beta.jpg
new file mode 100644
index 00000000000..ac5a4fb7717
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/supabase-storage-beta.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-2/wataru.jpeg b/www/public/images/blog/launch-week-sql-day-2/wataru.jpeg
new file mode 100644
index 00000000000..42a728c9be4
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-2/wataru.jpeg differ
diff --git a/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/prometheus.png b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/prometheus.png
new file mode 100644
index 00000000000..bb2700878b8
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/prometheus.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-homepage.jpg b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-homepage.jpg
new file mode 100644
index 00000000000..5cd6b2fcaf1
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-homepage.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-observability-screen.jpg b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-observability-screen.jpg
new file mode 100644
index 00000000000..6dbf3ecebb1
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-observability-screen.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-reports-screen.jpg b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-reports-screen.jpg
new file mode 100644
index 00000000000..dc33cb3022d
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-reports-screen.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-thumb.jpg b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-thumb.jpg
new file mode 100644
index 00000000000..cc2394c97ea
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-and-metrics-thumb.jpg differ
diff --git a/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-infra.png b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-infra.png
new file mode 100644
index 00000000000..57ff3abdcf1
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/reports-infra.png differ
diff --git a/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/supabase-reports-and-metrics-og.jpg b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/supabase-reports-and-metrics-og.jpg
new file mode 100644
index 00000000000..edae876d962
Binary files /dev/null and b/www/public/images/blog/launch-week-sql-day-4-reports-and-metrics/supabase-reports-and-metrics-og.jpg differ
diff --git a/www/public/images/blog/launch-week-sql/auth-v2.png b/www/public/images/blog/launch-week-sql/auth-v2.png
new file mode 100644
index 00000000000..b55a96d7701
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/auth-v2.png differ
diff --git a/www/public/images/blog/launch-week-sql/community-day.png b/www/public/images/blog/launch-week-sql/community-day.png
new file mode 100644
index 00000000000..ea1e19f2b63
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/community-day.png differ
diff --git a/www/public/images/blog/launch-week-sql/dashboards.png b/www/public/images/blog/launch-week-sql/dashboards.png
new file mode 100644
index 00000000000..af39505e683
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/dashboards.png differ
diff --git a/www/public/images/blog/launch-week-sql/launchweek-2-the-sql-og.jpg b/www/public/images/blog/launch-week-sql/launchweek-2-the-sql-og.jpg
new file mode 100644
index 00000000000..ee527a37fd7
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/launchweek-2-the-sql-og.jpg differ
diff --git a/www/public/images/blog/launch-week-sql/prequel.png b/www/public/images/blog/launch-week-sql/prequel.png
new file mode 100644
index 00000000000..acff2dea477
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/prequel.png differ
diff --git a/www/public/images/blog/launch-week-sql/storage.png b/www/public/images/blog/launch-week-sql/storage.png
new file mode 100644
index 00000000000..365ebff17e5
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/storage.png differ
diff --git a/www/public/images/blog/launch-week-sql/supabase-launch-the-sql.png b/www/public/images/blog/launch-week-sql/supabase-launch-the-sql.png
new file mode 100644
index 00000000000..d4ed4f207b9
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/supabase-launch-the-sql.png differ
diff --git a/www/public/images/blog/launch-week-sql/supabase-postgres.jpg b/www/public/images/blog/launch-week-sql/supabase-postgres.jpg
new file mode 100644
index 00000000000..8df8f7e9fab
Binary files /dev/null and b/www/public/images/blog/launch-week-sql/supabase-postgres.jpg differ
diff --git a/www/public/images/blog/launch-week-three/arnie.jpg b/www/public/images/blog/launch-week-three/arnie.jpg
new file mode 100644
index 00000000000..c6c61eb43ad
Binary files /dev/null and b/www/public/images/blog/launch-week-three/arnie.jpg differ
diff --git a/www/public/images/blog/launch-week-three/community-day/client-libs.jpg b/www/public/images/blog/launch-week-three/community-day/client-libs.jpg
new file mode 100644
index 00000000000..ebcc7f7f85f
Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/client-libs.jpg differ
diff --git a/www/public/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg b/www/public/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg
new file mode 100644
index 00000000000..f71e5ccd910
Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/gitguardian-supabase-partnership.jpeg differ
diff --git a/www/public/images/blog/launch-week-three/community-day/new-oauth-providers.jpg b/www/public/images/blog/launch-week-three/community-day/new-oauth-providers.jpg
new file mode 100644
index 00000000000..95219ee34b2
Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/new-oauth-providers.jpg differ
diff --git a/www/public/images/blog/launch-week-three/community-day/postgrest-9-og.png b/www/public/images/blog/launch-week-three/community-day/postgrest-9-og.png
new file mode 100644
index 00000000000..09eaecf8f8e
Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/postgrest-9-og.png differ
diff --git a/www/public/images/blog/launch-week-three/community-day/postgrest-9-thumb.png b/www/public/images/blog/launch-week-three/community-day/postgrest-9-thumb.png
new file mode 100644
index 00000000000..b5008e00eb3
Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/postgrest-9-thumb.png differ
diff --git a/www/public/images/blog/launch-week-three/community-day/supabase-oss.jpg b/www/public/images/blog/launch-week-three/community-day/supabase-oss.jpg
new file mode 100644
index 00000000000..5c00cb91094
Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/supabase-oss.jpg differ
diff --git a/www/public/images/blog/launch-week-three/community-day/tiktok.png b/www/public/images/blog/launch-week-three/community-day/tiktok.png
new file mode 100644
index 00000000000..bdc723f3edf
Binary files /dev/null and b/www/public/images/blog/launch-week-three/community-day/tiktok.png differ
diff --git a/www/public/images/blog/launch-week-three/communityday.jpg b/www/public/images/blog/launch-week-three/communityday.jpg
new file mode 100644
index 00000000000..d859e87a0d9
Binary files /dev/null and b/www/public/images/blog/launch-week-three/communityday.jpg differ
diff --git a/www/public/images/blog/launch-week-three/danny.jpg b/www/public/images/blog/launch-week-three/danny.jpg
new file mode 100644
index 00000000000..a059eb3a6fb
Binary files /dev/null and b/www/public/images/blog/launch-week-three/danny.jpg differ
diff --git a/www/public/images/blog/launch-week-three/elf.jpg b/www/public/images/blog/launch-week-three/elf.jpg
new file mode 100644
index 00000000000..52c9aa80667
Binary files /dev/null and b/www/public/images/blog/launch-week-three/elf.jpg differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/build-a-saas-product-with-next-js-supabase-and-stripe.png b/www/public/images/blog/launch-week-three/five-more-things/build-a-saas-product-with-next-js-supabase-and-stripe.png
new file mode 100644
index 00000000000..14e5c3c0387
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/build-a-saas-product-with-next-js-supabase-and-stripe.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/devs.png b/www/public/images/blog/launch-week-three/five-more-things/devs.png
new file mode 100644
index 00000000000..6b44fd1870a
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/devs.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/five-more-things-og.png b/www/public/images/blog/launch-week-three/five-more-things/five-more-things-og.png
new file mode 100644
index 00000000000..69f011c548d
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/five-more-things-og.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/five-more-things-thumb.png b/www/public/images/blog/launch-week-three/five-more-things/five-more-things-thumb.png
new file mode 100644
index 00000000000..69f011c548d
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/five-more-things-thumb.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/functions.png b/www/public/images/blog/launch-week-three/five-more-things/functions.png
new file mode 100644
index 00000000000..a4c7f1777ba
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/functions.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/graphQL.png b/www/public/images/blog/launch-week-three/five-more-things/graphQL.png
new file mode 100644
index 00000000000..3c22d610515
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/graphQL.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/holiday-hackdays-og.png b/www/public/images/blog/launch-week-three/five-more-things/holiday-hackdays-og.png
new file mode 100644
index 00000000000..1165461f991
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/holiday-hackdays-og.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/saas-meme.png b/www/public/images/blog/launch-week-three/five-more-things/saas-meme.png
new file mode 100644
index 00000000000..22e0c62ae58
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/saas-meme.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/supabase-pg-graphql-og.png b/www/public/images/blog/launch-week-three/five-more-things/supabase-pg-graphql-og.png
new file mode 100644
index 00000000000..bfc624056a5
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/supabase-pg-graphql-og.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/supabase-pg-graphql-thumb.png b/www/public/images/blog/launch-week-three/five-more-things/supabase-pg-graphql-thumb.png
new file mode 100644
index 00000000000..bfc624056a5
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/supabase-pg-graphql-thumb.png differ
diff --git a/www/public/images/blog/launch-week-three/five-more-things/too_damn_high.png b/www/public/images/blog/launch-week-three/five-more-things/too_damn_high.png
new file mode 100644
index 00000000000..ef72c9dc834
Binary files /dev/null and b/www/public/images/blog/launch-week-three/five-more-things/too_damn_high.png differ
diff --git a/www/public/images/blog/launch-week-three/grinch.jpg b/www/public/images/blog/launch-week-three/grinch.jpg
new file mode 100644
index 00000000000..93b7bfd5936
Binary files /dev/null and b/www/public/images/blog/launch-week-three/grinch.jpg differ
diff --git a/www/public/images/blog/launch-week-three/holiday-hackdays-og.png b/www/public/images/blog/launch-week-three/holiday-hackdays-og.png
new file mode 100644
index 00000000000..1165461f991
Binary files /dev/null and b/www/public/images/blog/launch-week-three/holiday-hackdays-og.png differ
diff --git a/www/public/images/blog/launch-week-three/launch-week-three-og.jpg b/www/public/images/blog/launch-week-three/launch-week-three-og.jpg
new file mode 100644
index 00000000000..dcaece66ea8
Binary files /dev/null and b/www/public/images/blog/launch-week-three/launch-week-three-og.jpg differ
diff --git a/www/public/images/blog/launch-week-three/launch-week-three-thumb.jpg b/www/public/images/blog/launch-week-three/launch-week-three-thumb.jpg
new file mode 100644
index 00000000000..dcaece66ea8
Binary files /dev/null and b/www/public/images/blog/launch-week-three/launch-week-three-thumb.jpg differ
diff --git a/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-og.png b/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-og.png
new file mode 100644
index 00000000000..bc11f5552fd
Binary files /dev/null and b/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-og.png differ
diff --git a/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-thumb.png b/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-thumb.png
new file mode 100644
index 00000000000..bc11f5552fd
Binary files /dev/null and b/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/realtime-row-level-security-in-postgresql-thumb.png differ
diff --git a/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/supabase-realtime-processing-per-subscription.png b/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/supabase-realtime-processing-per-subscription.png
new file mode 100644
index 00000000000..5495ff21e02
Binary files /dev/null and b/www/public/images/blog/launch-week-three/realtime-row-level-security-in-postgresql/supabase-realtime-processing-per-subscription.png differ
diff --git a/www/public/images/blog/launch-week-three/studio/open-source-studio-og.png b/www/public/images/blog/launch-week-three/studio/open-source-studio-og.png
new file mode 100644
index 00000000000..54bfa2c4510
Binary files /dev/null and b/www/public/images/blog/launch-week-three/studio/open-source-studio-og.png differ
diff --git a/www/public/images/blog/launch-week-three/studio/open-source-studio-table-editor.png b/www/public/images/blog/launch-week-three/studio/open-source-studio-table-editor.png
new file mode 100644
index 00000000000..44b2672aad4
Binary files /dev/null and b/www/public/images/blog/launch-week-three/studio/open-source-studio-table-editor.png differ
diff --git a/www/public/images/blog/launch-week-three/studio/open-source-studio-thumb.png b/www/public/images/blog/launch-week-three/studio/open-source-studio-thumb.png
new file mode 100644
index 00000000000..54bfa2c4510
Binary files /dev/null and b/www/public/images/blog/launch-week-three/studio/open-source-studio-thumb.png differ
diff --git a/www/public/images/blog/launch-week-three/supabase-acquires-logflare/logflare-screenshot.png b/www/public/images/blog/launch-week-three/supabase-acquires-logflare/logflare-screenshot.png
new file mode 100644
index 00000000000..c110b093e50
Binary files /dev/null and b/www/public/images/blog/launch-week-three/supabase-acquires-logflare/logflare-screenshot.png differ
diff --git a/www/public/images/blog/launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-og.png b/www/public/images/blog/launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-og.png
new file mode 100644
index 00000000000..ae5663bc90a
Binary files /dev/null and b/www/public/images/blog/launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-og.png differ
diff --git a/www/public/images/blog/launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-thumb.png b/www/public/images/blog/launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-thumb.png
new file mode 100644
index 00000000000..ae5663bc90a
Binary files /dev/null and b/www/public/images/blog/launch-week-three/supabase-acquires-logflare/supabase-acquires-logflare-thumb.png differ
diff --git a/www/public/images/blog/launch-week/bernie-1.png b/www/public/images/blog/launch-week/bernie-1.png
new file mode 100644
index 00000000000..763e1c7cb02
Binary files /dev/null and b/www/public/images/blog/launch-week/bernie-1.png differ
diff --git a/www/public/images/blog/launch-week/bernie-2.png b/www/public/images/blog/launch-week/bernie-2.png
new file mode 100644
index 00000000000..5c410ec2392
Binary files /dev/null and b/www/public/images/blog/launch-week/bernie-2.png differ
diff --git a/www/public/images/blog/launch-week/bernie-3.png b/www/public/images/blog/launch-week/bernie-3.png
new file mode 100644
index 00000000000..017a486676f
Binary files /dev/null and b/www/public/images/blog/launch-week/bernie-3.png differ
diff --git a/www/public/images/blog/launch-week/bernie-4.png b/www/public/images/blog/launch-week/bernie-4.png
new file mode 100644
index 00000000000..6e820cf6418
Binary files /dev/null and b/www/public/images/blog/launch-week/bernie-4.png differ
diff --git a/www/public/images/blog/launch-week/bernie-5.png b/www/public/images/blog/launch-week/bernie-5.png
new file mode 100644
index 00000000000..e722b3d1028
Binary files /dev/null and b/www/public/images/blog/launch-week/bernie-5.png differ
diff --git a/www/public/images/blog/magic-links.png b/www/public/images/blog/magic-links.png
new file mode 100644
index 00000000000..acc767b5001
Binary files /dev/null and b/www/public/images/blog/magic-links.png differ
diff --git a/www/public/images/blog/march-2021/oauth-scopes.png b/www/public/images/blog/march-2021/oauth-scopes.png
new file mode 100644
index 00000000000..d96a5ebcbf4
Binary files /dev/null and b/www/public/images/blog/march-2021/oauth-scopes.png differ
diff --git a/www/public/images/blog/march-2021/release-mar-2021.jpg b/www/public/images/blog/march-2021/release-mar-2021.jpg
new file mode 100644
index 00000000000..4c53c2a16f6
Binary files /dev/null and b/www/public/images/blog/march-2021/release-mar-2021.jpg differ
diff --git a/www/public/images/blog/march-2021/supabase-cli.png b/www/public/images/blog/march-2021/supabase-cli.png
new file mode 100644
index 00000000000..8249e3ab824
Binary files /dev/null and b/www/public/images/blog/march-2021/supabase-cli.png differ
diff --git a/www/public/images/blog/march-2021/supabase-pricing.jpg b/www/public/images/blog/march-2021/supabase-pricing.jpg
new file mode 100644
index 00000000000..902bd4d3120
Binary files /dev/null and b/www/public/images/blog/march-2021/supabase-pricing.jpg differ
diff --git a/www/public/images/blog/march-2021/supabase-stars-march-2021.png b/www/public/images/blog/march-2021/supabase-stars-march-2021.png
new file mode 100644
index 00000000000..6df3991ecfd
Binary files /dev/null and b/www/public/images/blog/march-2021/supabase-stars-march-2021.png differ
diff --git a/www/public/images/blog/march-2021/supabase-ui.png b/www/public/images/blog/march-2021/supabase-ui.png
new file mode 100644
index 00000000000..e3d59e6e366
Binary files /dev/null and b/www/public/images/blog/march-2021/supabase-ui.png differ
diff --git a/www/public/images/blog/mobbin/cover-mobbin-supabase.jpg b/www/public/images/blog/mobbin/cover-mobbin-supabase.jpg
new file mode 100644
index 00000000000..82023c5f7ac
Binary files /dev/null and b/www/public/images/blog/mobbin/cover-mobbin-supabase.jpg differ
diff --git a/www/public/images/blog/mobbin/mobbin-cover.png b/www/public/images/blog/mobbin/mobbin-cover.png
new file mode 100644
index 00000000000..0acbe53849a
Binary files /dev/null and b/www/public/images/blog/mobbin/mobbin-cover.png differ
diff --git a/www/public/images/blog/mobbin/mobbin-screenshots.jpg b/www/public/images/blog/mobbin/mobbin-screenshots.jpg
new file mode 100644
index 00000000000..ea315b98f7c
Binary files /dev/null and b/www/public/images/blog/mobbin/mobbin-screenshots.jpg differ
diff --git a/www/public/images/blog/mobbin/og-mobbin-supabase.jpg b/www/public/images/blog/mobbin/og-mobbin-supabase.jpg
new file mode 100644
index 00000000000..53b287a49eb
Binary files /dev/null and b/www/public/images/blog/mobbin/og-mobbin-supabase.jpg differ
diff --git a/www/public/images/blog/monitoro-requests.png b/www/public/images/blog/monitoro-requests.png
new file mode 100644
index 00000000000..623ba2edc29
Binary files /dev/null and b/www/public/images/blog/monitoro-requests.png differ
diff --git a/www/public/images/blog/new-sponsor-dark.png b/www/public/images/blog/new-sponsor-dark.png
new file mode 100644
index 00000000000..f9956d222d6
Binary files /dev/null and b/www/public/images/blog/new-sponsor-dark.png differ
diff --git a/www/public/images/blog/nextjs-tree-analyzer.png b/www/public/images/blog/nextjs-tree-analyzer.png
new file mode 100644
index 00000000000..d6f95674bd5
Binary files /dev/null and b/www/public/images/blog/nextjs-tree-analyzer.png differ
diff --git a/www/public/images/blog/nft/nft-1.png b/www/public/images/blog/nft/nft-1.png
new file mode 100644
index 00000000000..2bc158485ed
Binary files /dev/null and b/www/public/images/blog/nft/nft-1.png differ
diff --git a/www/public/images/blog/nft/nft-2.png b/www/public/images/blog/nft/nft-2.png
new file mode 100644
index 00000000000..0985e597d6d
Binary files /dev/null and b/www/public/images/blog/nft/nft-2.png differ
diff --git a/www/public/images/blog/nft/nft-3.png b/www/public/images/blog/nft/nft-3.png
new file mode 100644
index 00000000000..5d1bf3b055a
Binary files /dev/null and b/www/public/images/blog/nft/nft-3.png differ
diff --git a/www/public/images/blog/nikki-supabase.jpg b/www/public/images/blog/nikki-supabase.jpg
new file mode 100644
index 00000000000..2b48a2c954b
Binary files /dev/null and b/www/public/images/blog/nikki-supabase.jpg differ
diff --git a/www/public/images/blog/npm-dependencies.png b/www/public/images/blog/npm-dependencies.png
new file mode 100644
index 00000000000..853b6c8ab8c
Binary files /dev/null and b/www/public/images/blog/npm-dependencies.png differ
diff --git a/www/public/images/blog/omar-monitoro.png b/www/public/images/blog/omar-monitoro.png
new file mode 100644
index 00000000000..5d285f2e240
Binary files /dev/null and b/www/public/images/blog/omar-monitoro.png differ
diff --git a/www/public/images/blog/open-source/bad-code.png b/www/public/images/blog/open-source/bad-code.png
new file mode 100644
index 00000000000..e4390770584
Binary files /dev/null and b/www/public/images/blog/open-source/bad-code.png differ
diff --git a/www/public/images/blog/open-source/leetcode.png b/www/public/images/blog/open-source/leetcode.png
new file mode 100644
index 00000000000..c9a325c0c24
Binary files /dev/null and b/www/public/images/blog/open-source/leetcode.png differ
diff --git a/www/public/images/blog/open-source/open-source-thumb.png b/www/public/images/blog/open-source/open-source-thumb.png
new file mode 100644
index 00000000000..bf38884d23a
Binary files /dev/null and b/www/public/images/blog/open-source/open-source-thumb.png differ
diff --git a/www/public/images/blog/open-source/open-source.png b/www/public/images/blog/open-source/open-source.png
new file mode 100644
index 00000000000..dc5664a33a6
Binary files /dev/null and b/www/public/images/blog/open-source/open-source.png differ
diff --git a/www/public/images/blog/open-source/secrets.png b/www/public/images/blog/open-source/secrets.png
new file mode 100644
index 00000000000..06fd030352f
Binary files /dev/null and b/www/public/images/blog/open-source/secrets.png differ
diff --git a/www/public/images/blog/open-source/security.png b/www/public/images/blog/open-source/security.png
new file mode 100644
index 00000000000..d228a8d04a5
Binary files /dev/null and b/www/public/images/blog/open-source/security.png differ
diff --git a/www/public/images/blog/partner-gallery/expert-quinence.png b/www/public/images/blog/partner-gallery/expert-quinence.png
new file mode 100644
index 00000000000..88237a3a556
Binary files /dev/null and b/www/public/images/blog/partner-gallery/expert-quinence.png differ
diff --git a/www/public/images/blog/partner-gallery/integration-draftbit.png b/www/public/images/blog/partner-gallery/integration-draftbit.png
new file mode 100644
index 00000000000..75283abc08b
Binary files /dev/null and b/www/public/images/blog/partner-gallery/integration-draftbit.png differ
diff --git a/www/public/images/blog/partner-gallery/integration-stytch.png b/www/public/images/blog/partner-gallery/integration-stytch.png
new file mode 100644
index 00000000000..c61fabae6b0
Binary files /dev/null and b/www/public/images/blog/partner-gallery/integration-stytch.png differ
diff --git a/www/public/images/blog/partner-gallery/integration-vercel.png b/www/public/images/blog/partner-gallery/integration-vercel.png
new file mode 100644
index 00000000000..e5f420918c0
Binary files /dev/null and b/www/public/images/blog/partner-gallery/integration-vercel.png differ
diff --git a/www/public/images/blog/partner-gallery/partner-gallery-screenshot.png b/www/public/images/blog/partner-gallery/partner-gallery-screenshot.png
new file mode 100644
index 00000000000..dc5844bb30a
Binary files /dev/null and b/www/public/images/blog/partner-gallery/partner-gallery-screenshot.png differ
diff --git a/www/public/images/blog/partner-gallery/partner-showcase-intro.png b/www/public/images/blog/partner-gallery/partner-showcase-intro.png
new file mode 100644
index 00000000000..c88f7f17bef
Binary files /dev/null and b/www/public/images/blog/partner-gallery/partner-showcase-intro.png differ
diff --git a/www/public/images/blog/partner-gallery/partner-showcase-thumb.png b/www/public/images/blog/partner-gallery/partner-showcase-thumb.png
new file mode 100644
index 00000000000..b81458ce748
Binary files /dev/null and b/www/public/images/blog/partner-gallery/partner-showcase-thumb.png differ
diff --git a/www/public/images/blog/pg13/postgres-13-og.jpg b/www/public/images/blog/pg13/postgres-13-og.jpg
new file mode 100644
index 00000000000..925679e02f1
Binary files /dev/null and b/www/public/images/blog/pg13/postgres-13-og.jpg differ
diff --git a/www/public/images/blog/pg13/postgres-13-performance.png b/www/public/images/blog/pg13/postgres-13-performance.png
new file mode 100644
index 00000000000..10c25a1b3b1
Binary files /dev/null and b/www/public/images/blog/pg13/postgres-13-performance.png differ
diff --git a/www/public/images/blog/pg13/postgres-13-thumb.jpg b/www/public/images/blog/pg13/postgres-13-thumb.jpg
new file mode 100644
index 00000000000..6abc0016021
Binary files /dev/null and b/www/public/images/blog/pg13/postgres-13-thumb.jpg differ
diff --git a/www/public/images/blog/policies-email.png b/www/public/images/blog/policies-email.png
new file mode 100644
index 00000000000..2a6aafd6be6
Binary files /dev/null and b/www/public/images/blog/policies-email.png differ
diff --git a/www/public/images/blog/postgres-count.png b/www/public/images/blog/postgres-count.png
new file mode 100644
index 00000000000..d61591f074a
Binary files /dev/null and b/www/public/images/blog/postgres-count.png differ
diff --git a/www/public/images/blog/postgres-hooks/cover-postgres-hooks.jpg b/www/public/images/blog/postgres-hooks/cover-postgres-hooks.jpg
new file mode 100644
index 00000000000..e7a1da86408
Binary files /dev/null and b/www/public/images/blog/postgres-hooks/cover-postgres-hooks.jpg differ
diff --git a/www/public/images/blog/postgres-hooks/hooks-postgres-alter-role.png b/www/public/images/blog/postgres-hooks/hooks-postgres-alter-role.png
new file mode 100644
index 00000000000..3d7e0f798af
Binary files /dev/null and b/www/public/images/blog/postgres-hooks/hooks-postgres-alter-role.png differ
diff --git a/www/public/images/blog/postgres-hooks/og-postgres-hooks.jpg b/www/public/images/blog/postgres-hooks/og-postgres-hooks.jpg
new file mode 100644
index 00000000000..9cdd3721195
Binary files /dev/null and b/www/public/images/blog/postgres-hooks/og-postgres-hooks.jpg differ
diff --git a/www/public/images/blog/postgres-views.png b/www/public/images/blog/postgres-views.png
new file mode 100644
index 00000000000..36a3841bbe0
Binary files /dev/null and b/www/public/images/blog/postgres-views.png differ
diff --git a/www/public/images/blog/postgrest-9/whats-new-in-postgrest-9-og.png b/www/public/images/blog/postgrest-9/whats-new-in-postgrest-9-og.png
new file mode 100644
index 00000000000..09eaecf8f8e
Binary files /dev/null and b/www/public/images/blog/postgrest-9/whats-new-in-postgrest-9-og.png differ
diff --git a/www/public/images/blog/postgrest-9/whats-new-in-postgrest-9-thumb.png b/www/public/images/blog/postgrest-9/whats-new-in-postgrest-9-thumb.png
new file mode 100644
index 00000000000..b5008e00eb3
Binary files /dev/null and b/www/public/images/blog/postgrest-9/whats-new-in-postgrest-9-thumb.png differ
diff --git a/www/public/images/blog/pricing.jpg b/www/public/images/blog/pricing.jpg
new file mode 100644
index 00000000000..4692b61f8d2
Binary files /dev/null and b/www/public/images/blog/pricing.jpg differ
diff --git a/www/public/images/blog/product-hunt-golden-kitty-awards-2021-thumb.png b/www/public/images/blog/product-hunt-golden-kitty-awards-2021-thumb.png
new file mode 100644
index 00000000000..c4f3ab90c66
Binary files /dev/null and b/www/public/images/blog/product-hunt-golden-kitty-awards-2021-thumb.png differ
diff --git a/www/public/images/blog/product-hunt-golden-kitty-awards-2021.png b/www/public/images/blog/product-hunt-golden-kitty-awards-2021.png
new file mode 100644
index 00000000000..e05ed5aa6d4
Binary files /dev/null and b/www/public/images/blog/product-hunt-golden-kitty-awards-2021.png differ
diff --git a/www/public/images/blog/react-server-components-supabase.png b/www/public/images/blog/react-server-components-supabase.png
new file mode 100644
index 00000000000..f32424fbe50
Binary files /dev/null and b/www/public/images/blog/react-server-components-supabase.png differ
diff --git a/www/public/images/blog/regions-london-sydney.png b/www/public/images/blog/regions-london-sydney.png
new file mode 100644
index 00000000000..51d458e4583
Binary files /dev/null and b/www/public/images/blog/regions-london-sydney.png differ
diff --git a/www/public/images/blog/release-dec-2020.jpg b/www/public/images/blog/release-dec-2020.jpg
new file mode 100644
index 00000000000..dd6d2d6e76b
Binary files /dev/null and b/www/public/images/blog/release-dec-2020.jpg differ
diff --git a/www/public/images/blog/release-feb-2021.jpg b/www/public/images/blog/release-feb-2021.jpg
new file mode 100644
index 00000000000..9348e74ad4b
Binary files /dev/null and b/www/public/images/blog/release-feb-2021.jpg differ
diff --git a/www/public/images/blog/release-jan-2021.jpg b/www/public/images/blog/release-jan-2021.jpg
new file mode 100644
index 00000000000..7b0df47e0f1
Binary files /dev/null and b/www/public/images/blog/release-jan-2021.jpg differ
diff --git a/www/public/images/blog/replenysh/Replenysh-Mobile-App.png b/www/public/images/blog/replenysh/Replenysh-Mobile-App.png
new file mode 100644
index 00000000000..30bffab2ce7
Binary files /dev/null and b/www/public/images/blog/replenysh/Replenysh-Mobile-App.png differ
diff --git a/www/public/images/blog/replenysh/Replenysh-large-screen-view.png b/www/public/images/blog/replenysh/Replenysh-large-screen-view.png
new file mode 100644
index 00000000000..3e766224f6d
Binary files /dev/null and b/www/public/images/blog/replenysh/Replenysh-large-screen-view.png differ
diff --git a/www/public/images/blog/replenysh/circular-economy.png b/www/public/images/blog/replenysh/circular-economy.png
new file mode 100644
index 00000000000..a18309a3413
Binary files /dev/null and b/www/public/images/blog/replenysh/circular-economy.png differ
diff --git a/www/public/images/blog/replenysh/og-replenysh.png b/www/public/images/blog/replenysh/og-replenysh.png
new file mode 100644
index 00000000000..64eaaaa23ea
Binary files /dev/null and b/www/public/images/blog/replenysh/og-replenysh.png differ
diff --git a/www/public/images/blog/replenysh/thumb-replenysh.png b/www/public/images/blog/replenysh/thumb-replenysh.png
new file mode 100644
index 00000000000..0ae64c257db
Binary files /dev/null and b/www/public/images/blog/replenysh/thumb-replenysh.png differ
diff --git a/www/public/images/blog/replit-og.jpg b/www/public/images/blog/replit-og.jpg
new file mode 100644
index 00000000000..75db5880ee1
Binary files /dev/null and b/www/public/images/blog/replit-og.jpg differ
diff --git a/www/public/images/blog/roboflow-gallery.png b/www/public/images/blog/roboflow-gallery.png
new file mode 100644
index 00000000000..4f04b4afa94
Binary files /dev/null and b/www/public/images/blog/roboflow-gallery.png differ
diff --git a/www/public/images/blog/roboflow-og.png b/www/public/images/blog/roboflow-og.png
new file mode 100644
index 00000000000..4dc7c43baf9
Binary files /dev/null and b/www/public/images/blog/roboflow-og.png differ
diff --git a/www/public/images/blog/roboflow-quote.png b/www/public/images/blog/roboflow-quote.png
new file mode 100644
index 00000000000..d88f5c129b4
Binary files /dev/null and b/www/public/images/blog/roboflow-quote.png differ
diff --git a/www/public/images/blog/roboflow-stat.png b/www/public/images/blog/roboflow-stat.png
new file mode 100644
index 00000000000..b83f978e72a
Binary files /dev/null and b/www/public/images/blog/roboflow-stat.png differ
diff --git a/www/public/images/blog/roboflow-website.png b/www/public/images/blog/roboflow-website.png
new file mode 100644
index 00000000000..8e7de1cafab
Binary files /dev/null and b/www/public/images/blog/roboflow-website.png differ
diff --git a/www/public/images/blog/sarup-tayfa.png b/www/public/images/blog/sarup-tayfa.png
new file mode 100644
index 00000000000..5c443ca87bf
Binary files /dev/null and b/www/public/images/blog/sarup-tayfa.png differ
diff --git a/www/public/images/blog/sentry-results.png b/www/public/images/blog/sentry-results.png
new file mode 100644
index 00000000000..d154faf6be8
Binary files /dev/null and b/www/public/images/blog/sentry-results.png differ
diff --git a/www/public/images/blog/series-a/dashboard.png b/www/public/images/blog/series-a/dashboard.png
new file mode 100644
index 00000000000..dabcc64361d
Binary files /dev/null and b/www/public/images/blog/series-a/dashboard.png differ
diff --git a/www/public/images/blog/series-a/discord-supabase-community.png b/www/public/images/blog/series-a/discord-supabase-community.png
new file mode 100644
index 00000000000..ae390ae0502
Binary files /dev/null and b/www/public/images/blog/series-a/discord-supabase-community.png differ
diff --git a/www/public/images/blog/series-a/supabase-series-a.png b/www/public/images/blog/series-a/supabase-series-a.png
new file mode 100644
index 00000000000..ee155290796
Binary files /dev/null and b/www/public/images/blog/series-a/supabase-series-a.png differ
diff --git a/www/public/images/blog/series-a/total-databases.png b/www/public/images/blog/series-a/total-databases.png
new file mode 100644
index 00000000000..0af1cecf6c7
Binary files /dev/null and b/www/public/images/blog/series-a/total-databases.png differ
diff --git a/www/public/images/blog/showcase-logo/supabase-logo.svg b/www/public/images/blog/showcase-logo/supabase-logo.svg
new file mode 100644
index 00000000000..1315b0a5ccf
--- /dev/null
+++ b/www/public/images/blog/showcase-logo/supabase-logo.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/blog/spot/cover-spot-flutter-supabase.jpg b/www/public/images/blog/spot/cover-spot-flutter-supabase.jpg
new file mode 100644
index 00000000000..d7456346012
Binary files /dev/null and b/www/public/images/blog/spot/cover-spot-flutter-supabase.jpg differ
diff --git a/www/public/images/blog/spot/og-spot-flutter-supabase.jpg b/www/public/images/blog/spot/og-spot-flutter-supabase.jpg
new file mode 100644
index 00000000000..ea6d5c4461e
Binary files /dev/null and b/www/public/images/blog/spot/og-spot-flutter-supabase.jpg differ
diff --git a/www/public/images/blog/spot/spot-screenshots.jpg b/www/public/images/blog/spot/spot-screenshots.jpg
new file mode 100644
index 00000000000..d3829f0c027
Binary files /dev/null and b/www/public/images/blog/spot/spot-screenshots.jpg differ
diff --git a/www/public/images/blog/sql-editor.png b/www/public/images/blog/sql-editor.png
new file mode 100644
index 00000000000..2f84849abde
Binary files /dev/null and b/www/public/images/blog/sql-editor.png differ
diff --git a/www/public/images/blog/status-page.png b/www/public/images/blog/status-page.png
new file mode 100644
index 00000000000..8b5460b8a41
Binary files /dev/null and b/www/public/images/blog/status-page.png differ
diff --git a/www/public/images/blog/storage/infra.png b/www/public/images/blog/storage/infra.png
new file mode 100644
index 00000000000..0caff1c9632
Binary files /dev/null and b/www/public/images/blog/storage/infra.png differ
diff --git a/www/public/images/blog/storage/ph-1.png b/www/public/images/blog/storage/ph-1.png
new file mode 100644
index 00000000000..a4642e88551
Binary files /dev/null and b/www/public/images/blog/storage/ph-1.png differ
diff --git a/www/public/images/blog/storage/ph-2.png b/www/public/images/blog/storage/ph-2.png
new file mode 100644
index 00000000000..c389a16bfe5
Binary files /dev/null and b/www/public/images/blog/storage/ph-2.png differ
diff --git a/www/public/images/blog/storage/ph-4.png b/www/public/images/blog/storage/ph-4.png
new file mode 100644
index 00000000000..6a4ba8e1de1
Binary files /dev/null and b/www/public/images/blog/storage/ph-4.png differ
diff --git a/www/public/images/blog/storage/ph-5.png b/www/public/images/blog/storage/ph-5.png
new file mode 100644
index 00000000000..fc5518e3552
Binary files /dev/null and b/www/public/images/blog/storage/ph-5.png differ
diff --git a/www/public/images/blog/storage/ph-6.png b/www/public/images/blog/storage/ph-6.png
new file mode 100644
index 00000000000..66e4481f10c
Binary files /dev/null and b/www/public/images/blog/storage/ph-6.png differ
diff --git a/www/public/images/blog/storage/ph-7.png b/www/public/images/blog/storage/ph-7.png
new file mode 100644
index 00000000000..58e5d3da6da
Binary files /dev/null and b/www/public/images/blog/storage/ph-7.png differ
diff --git a/www/public/images/blog/storage/true-language.png b/www/public/images/blog/storage/true-language.png
new file mode 100644
index 00000000000..27f3fc15e74
Binary files /dev/null and b/www/public/images/blog/storage/true-language.png differ
diff --git a/www/public/images/blog/strive-supabase.png b/www/public/images/blog/strive-supabase.png
new file mode 100644
index 00000000000..9656ce4b5b9
Binary files /dev/null and b/www/public/images/blog/strive-supabase.png differ
diff --git a/www/public/images/blog/supa-audit/postgres_auditing_in_150_lines_of_SQL.png b/www/public/images/blog/supa-audit/postgres_auditing_in_150_lines_of_SQL.png
new file mode 100644
index 00000000000..769aa5c7f16
Binary files /dev/null and b/www/public/images/blog/supa-audit/postgres_auditing_in_150_lines_of_SQL.png differ
diff --git a/www/public/images/blog/supabase-architecture.png b/www/public/images/blog/supabase-architecture.png
new file mode 100644
index 00000000000..258225a1e37
Binary files /dev/null and b/www/public/images/blog/supabase-architecture.png differ
diff --git a/www/public/images/blog/supabase-auth-cover.png b/www/public/images/blog/supabase-auth-cover.png
new file mode 100644
index 00000000000..627e77779f7
Binary files /dev/null and b/www/public/images/blog/supabase-auth-cover.png differ
diff --git a/www/public/images/blog/supabase-auth-series.png b/www/public/images/blog/supabase-auth-series.png
new file mode 100644
index 00000000000..f5e34f79268
Binary files /dev/null and b/www/public/images/blog/supabase-auth-series.png differ
diff --git a/www/public/images/blog/supabase-december-2020.png b/www/public/images/blog/supabase-december-2020.png
new file mode 100644
index 00000000000..9d871a77993
Binary files /dev/null and b/www/public/images/blog/supabase-december-2020.png differ
diff --git a/www/public/images/blog/supabase-dot-com-og.jpg b/www/public/images/blog/supabase-dot-com-og.jpg
new file mode 100644
index 00000000000..f4ac5acb456
Binary files /dev/null and b/www/public/images/blog/supabase-dot-com-og.jpg differ
diff --git a/www/public/images/blog/supabase-extensions.png b/www/public/images/blog/supabase-extensions.png
new file mode 100644
index 00000000000..413ea2b8f20
Binary files /dev/null and b/www/public/images/blog/supabase-extensions.png differ
diff --git a/www/public/images/blog/supabase-github-discussions.png b/www/public/images/blog/supabase-github-discussions.png
new file mode 100644
index 00000000000..3cc3deb7e81
Binary files /dev/null and b/www/public/images/blog/supabase-github-discussions.png differ
diff --git a/www/public/images/blog/supabase-github-stars-june.png b/www/public/images/blog/supabase-github-stars-june.png
new file mode 100644
index 00000000000..db26c6c30fc
Binary files /dev/null and b/www/public/images/blog/supabase-github-stars-june.png differ
diff --git a/www/public/images/blog/supabase-hacktoberfest-board.png b/www/public/images/blog/supabase-hacktoberfest-board.png
new file mode 100644
index 00000000000..de69c097bfa
Binary files /dev/null and b/www/public/images/blog/supabase-hacktoberfest-board.png differ
diff --git a/www/public/images/blog/supabase-hn-launch.png b/www/public/images/blog/supabase-hn-launch.png
new file mode 100644
index 00000000000..3f26b60faff
Binary files /dev/null and b/www/public/images/blog/supabase-hn-launch.png differ
diff --git a/www/public/images/blog/supabase-january-2021.png b/www/public/images/blog/supabase-january-2021.png
new file mode 100644
index 00000000000..730c79231cb
Binary files /dev/null and b/www/public/images/blog/supabase-january-2021.png differ
diff --git a/www/public/images/blog/supabase-js-1-0.png b/www/public/images/blog/supabase-js-1-0.png
new file mode 100644
index 00000000000..dad6ec0a4dd
Binary files /dev/null and b/www/public/images/blog/supabase-js-1-0.png differ
diff --git a/www/public/images/blog/supabase-launch-week.png b/www/public/images/blog/supabase-launch-week.png
new file mode 100644
index 00000000000..cf46c007046
Binary files /dev/null and b/www/public/images/blog/supabase-launch-week.png differ
diff --git a/www/public/images/blog/supabase-middleware-docker.png b/www/public/images/blog/supabase-middleware-docker.png
new file mode 100644
index 00000000000..29fa1c875e2
Binary files /dev/null and b/www/public/images/blog/supabase-middleware-docker.png differ
diff --git a/www/public/images/blog/supabase-monaco-editor.png b/www/public/images/blog/supabase-monaco-editor.png
new file mode 100644
index 00000000000..f6091d117fd
Binary files /dev/null and b/www/public/images/blog/supabase-monaco-editor.png differ
diff --git a/www/public/images/blog/supabase-monitoro.png b/www/public/images/blog/supabase-monitoro.png
new file mode 100644
index 00000000000..272ad8c47fe
Binary files /dev/null and b/www/public/images/blog/supabase-monitoro.png differ
diff --git a/www/public/images/blog/supabase-november-2020.png b/www/public/images/blog/supabase-november-2020.png
new file mode 100644
index 00000000000..fcac70e83e5
Binary files /dev/null and b/www/public/images/blog/supabase-november-2020.png differ
diff --git a/www/public/images/blog/supabase-oauth-logins.png b/www/public/images/blog/supabase-oauth-logins.png
new file mode 100644
index 00000000000..2e2aa3db2be
Binary files /dev/null and b/www/public/images/blog/supabase-oauth-logins.png differ
diff --git a/www/public/images/blog/supabase-october-2020.png b/www/public/images/blog/supabase-october-2020.png
new file mode 100644
index 00000000000..1abacc71a31
Binary files /dev/null and b/www/public/images/blog/supabase-october-2020.png differ
diff --git a/www/public/images/blog/supabase-og-image.png b/www/public/images/blog/supabase-og-image.png
new file mode 100644
index 00000000000..1bf57f36301
Binary files /dev/null and b/www/public/images/blog/supabase-og-image.png differ
diff --git a/www/public/images/blog/supabase-postgres-cron.png b/www/public/images/blog/supabase-postgres-cron.png
new file mode 100644
index 00000000000..e006bf00de5
Binary files /dev/null and b/www/public/images/blog/supabase-postgres-cron.png differ
diff --git a/www/public/images/blog/supabase-september-2020.png b/www/public/images/blog/supabase-september-2020.png
new file mode 100644
index 00000000000..9103aae8db6
Binary files /dev/null and b/www/public/images/blog/supabase-september-2020.png differ
diff --git a/www/public/images/blog/supabase-strive-school.png b/www/public/images/blog/supabase-strive-school.png
new file mode 100644
index 00000000000..445f48589f8
Binary files /dev/null and b/www/public/images/blog/supabase-strive-school.png differ
diff --git a/www/public/images/blog/supabase-tayfa.png b/www/public/images/blog/supabase-tayfa.png
new file mode 100644
index 00000000000..215ce4677e8
Binary files /dev/null and b/www/public/images/blog/supabase-tayfa.png differ
diff --git a/www/public/images/blog/supabase-traffic-may.png b/www/public/images/blog/supabase-traffic-may.png
new file mode 100644
index 00000000000..e5f40eb2c1b
Binary files /dev/null and b/www/public/images/blog/supabase-traffic-may.png differ
diff --git a/www/public/images/blog/supabase-xendit-thumb.jpg b/www/public/images/blog/supabase-xendit-thumb.jpg
new file mode 100644
index 00000000000..cca55cd8998
Binary files /dev/null and b/www/public/images/blog/supabase-xendit-thumb.jpg differ
diff --git a/www/public/images/blog/supabase-xendit.png b/www/public/images/blog/supabase-xendit.png
new file mode 100644
index 00000000000..b1dc884c608
Binary files /dev/null and b/www/public/images/blog/supabase-xendit.png differ
diff --git a/www/public/images/blog/swag-store/cover-swag-store.jpg b/www/public/images/blog/swag-store/cover-swag-store.jpg
new file mode 100644
index 00000000000..43c3a5ecf0a
Binary files /dev/null and b/www/public/images/blog/swag-store/cover-swag-store.jpg differ
diff --git a/www/public/images/blog/swag-store/i-will-find-you-meme.jpg b/www/public/images/blog/swag-store/i-will-find-you-meme.jpg
new file mode 100644
index 00000000000..e40fe054e71
Binary files /dev/null and b/www/public/images/blog/swag-store/i-will-find-you-meme.jpg differ
diff --git a/www/public/images/blog/swag-store/og-supabase-swag-store.jpg b/www/public/images/blog/swag-store/og-supabase-swag-store.jpg
new file mode 100644
index 00000000000..59743255dad
Binary files /dev/null and b/www/public/images/blog/swag-store/og-supabase-swag-store.jpg differ
diff --git a/www/public/images/blog/swag-store/swag-shipping.jpg b/www/public/images/blog/swag-store/swag-shipping.jpg
new file mode 100644
index 00000000000..4bf824879ae
Binary files /dev/null and b/www/public/images/blog/swag-store/swag-shipping.jpg differ
diff --git a/www/public/images/blog/swag-store/swag-winners.png b/www/public/images/blog/swag-store/swag-winners.png
new file mode 100644
index 00000000000..55059063278
Binary files /dev/null and b/www/public/images/blog/swag-store/swag-winners.png differ
diff --git a/www/public/images/blog/table-view.png b/www/public/images/blog/table-view.png
new file mode 100644
index 00000000000..dbc9fc6ed58
Binary files /dev/null and b/www/public/images/blog/table-view.png differ
diff --git a/www/public/images/blog/tanmai-tayfa.png b/www/public/images/blog/tanmai-tayfa.png
new file mode 100644
index 00000000000..ed9cfe76773
Binary files /dev/null and b/www/public/images/blog/tanmai-tayfa.png differ
diff --git a/www/public/images/blog/toadli-og.jpg b/www/public/images/blog/toadli-og.jpg
new file mode 100644
index 00000000000..322fb54f500
Binary files /dev/null and b/www/public/images/blog/toadli-og.jpg differ
diff --git a/www/public/images/blog/toadli-website.jpg b/www/public/images/blog/toadli-website.jpg
new file mode 100644
index 00000000000..9044aaaf625
Binary files /dev/null and b/www/public/images/blog/toadli-website.jpg differ
diff --git a/www/public/images/blog/typescript-support.gif b/www/public/images/blog/typescript-support.gif
new file mode 100644
index 00000000000..615d600d864
Binary files /dev/null and b/www/public/images/blog/typescript-support.gif differ
diff --git a/www/public/images/blog/website-hook.jpeg b/www/public/images/blog/website-hook.jpeg
new file mode 100644
index 00000000000..0cf412b6c0a
Binary files /dev/null and b/www/public/images/blog/website-hook.jpeg differ
diff --git a/www/public/images/blog/whats-new-in-postgres-14/explain-statement.png b/www/public/images/blog/whats-new-in-postgres-14/explain-statement.png
new file mode 100644
index 00000000000..a23780b8252
Binary files /dev/null and b/www/public/images/blog/whats-new-in-postgres-14/explain-statement.png differ
diff --git a/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png
new file mode 100644
index 00000000000..b857fb4b808
Binary files /dev/null and b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-og.png differ
diff --git a/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png
new file mode 100644
index 00000000000..24c97250f06
Binary files /dev/null and b/www/public/images/blog/whats-new-in-postgres-14/whats-new-in-postgres-14-thumb.png differ
diff --git a/www/public/images/blog/workflows/functions.jpg b/www/public/images/blog/workflows/functions.jpg
new file mode 100644
index 00000000000..ff9a00893d6
Binary files /dev/null and b/www/public/images/blog/workflows/functions.jpg differ
diff --git a/www/public/images/blog/workflows/workflows-og.jpg b/www/public/images/blog/workflows/workflows-og.jpg
new file mode 100644
index 00000000000..13698310be9
Binary files /dev/null and b/www/public/images/blog/workflows/workflows-og.jpg differ
diff --git a/www/public/images/blog/workflows/workflows-thumb.jpg b/www/public/images/blog/workflows/workflows-thumb.jpg
new file mode 100644
index 00000000000..531ccba97a3
Binary files /dev/null and b/www/public/images/blog/workflows/workflows-thumb.jpg differ
diff --git a/www/public/images/blog/worklife-dark.png b/www/public/images/blog/worklife-dark.png
new file mode 100644
index 00000000000..b1454797d14
Binary files /dev/null and b/www/public/images/blog/worklife-dark.png differ
diff --git a/www/public/images/blog/yc-gray.png b/www/public/images/blog/yc-gray.png
new file mode 100644
index 00000000000..f3fade0625b
Binary files /dev/null and b/www/public/images/blog/yc-gray.png differ
diff --git a/www/public/images/case-studies/logos/epsilon3.png b/www/public/images/case-studies/logos/epsilon3.png
new file mode 100644
index 00000000000..9895b8f5ae0
Binary files /dev/null and b/www/public/images/case-studies/logos/epsilon3.png differ
diff --git a/www/public/images/case-studies/logos/mobbin.png b/www/public/images/case-studies/logos/mobbin.png
new file mode 100644
index 00000000000..715a1a4a4be
Binary files /dev/null and b/www/public/images/case-studies/logos/mobbin.png differ
diff --git a/www/public/images/case-studies/logos/netlify.png b/www/public/images/case-studies/logos/netlify.png
new file mode 100644
index 00000000000..1e6594bfe67
Binary files /dev/null and b/www/public/images/case-studies/logos/netlify.png differ
diff --git a/www/public/images/case-studies/logos/replenysh.png b/www/public/images/case-studies/logos/replenysh.png
new file mode 100644
index 00000000000..e67f67fb788
Binary files /dev/null and b/www/public/images/case-studies/logos/replenysh.png differ
diff --git a/www/public/images/case-studies/logos/vercel.png b/www/public/images/case-studies/logos/vercel.png
new file mode 100644
index 00000000000..fb5d63e5ba6
Binary files /dev/null and b/www/public/images/case-studies/logos/vercel.png differ
diff --git a/www/public/images/case-studies/logos/xendit.png b/www/public/images/case-studies/logos/xendit.png
new file mode 100644
index 00000000000..1e79b75c831
Binary files /dev/null and b/www/public/images/case-studies/logos/xendit.png differ
diff --git a/www/public/images/case-study-monitoro.jpg b/www/public/images/case-study-monitoro.jpg
new file mode 100644
index 00000000000..b8626307f44
Binary files /dev/null and b/www/public/images/case-study-monitoro.jpg differ
diff --git a/www/public/images/case-study-tayfab.jpg b/www/public/images/case-study-tayfab.jpg
new file mode 100644
index 00000000000..e5a89156286
Binary files /dev/null and b/www/public/images/case-study-tayfab.jpg differ
diff --git a/www/public/images/case-study-xendit.jpg b/www/public/images/case-study-xendit.jpg
new file mode 100644
index 00000000000..0cd5c4e1285
Binary files /dev/null and b/www/public/images/case-study-xendit.jpg differ
diff --git a/www/public/images/casestudy.png b/www/public/images/casestudy.png
new file mode 100644
index 00000000000..0bca2daf29a
Binary files /dev/null and b/www/public/images/casestudy.png differ
diff --git a/www/public/images/company/community/discord.png b/www/public/images/company/community/discord.png
new file mode 100644
index 00000000000..c6512565d34
Binary files /dev/null and b/www/public/images/company/community/discord.png differ
diff --git a/www/public/images/company/community/github.png b/www/public/images/company/community/github.png
new file mode 100644
index 00000000000..ea6ff545a24
Binary files /dev/null and b/www/public/images/company/community/github.png differ
diff --git a/www/public/images/company/community/supabase.png b/www/public/images/company/community/supabase.png
new file mode 100644
index 00000000000..a3b7b36f929
Binary files /dev/null and b/www/public/images/company/community/supabase.png differ
diff --git a/www/public/images/company/community/twitter.png b/www/public/images/company/community/twitter.png
new file mode 100644
index 00000000000..4e72f8cb100
Binary files /dev/null and b/www/public/images/company/community/twitter.png differ
diff --git a/www/public/images/company/companies-using-supabase/audi-logo.png b/www/public/images/company/companies-using-supabase/audi-logo.png
new file mode 100644
index 00000000000..8e39b698932
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/audi-logo.png differ
diff --git a/www/public/images/company/companies-using-supabase/capitalone.png b/www/public/images/company/companies-using-supabase/capitalone.png
new file mode 100644
index 00000000000..99d1c53be7e
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/capitalone.png differ
diff --git a/www/public/images/company/companies-using-supabase/coinbase.png b/www/public/images/company/companies-using-supabase/coinbase.png
new file mode 100644
index 00000000000..a0ab389d759
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/coinbase.png differ
diff --git a/www/public/images/company/companies-using-supabase/facebook.png b/www/public/images/company/companies-using-supabase/facebook.png
new file mode 100644
index 00000000000..3379e2d64bb
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/facebook.png differ
diff --git a/www/public/images/company/companies-using-supabase/github.png b/www/public/images/company/companies-using-supabase/github.png
new file mode 100644
index 00000000000..14ed56b9ae1
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/github.png differ
diff --git a/www/public/images/company/companies-using-supabase/google.png b/www/public/images/company/companies-using-supabase/google.png
new file mode 100644
index 00000000000..e3e4e3b7bee
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/google.png differ
diff --git a/www/public/images/company/companies-using-supabase/gsk.png b/www/public/images/company/companies-using-supabase/gsk.png
new file mode 100644
index 00000000000..154714cecea
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/gsk.png differ
diff --git a/www/public/images/company/companies-using-supabase/hewlett-packard.png b/www/public/images/company/companies-using-supabase/hewlett-packard.png
new file mode 100644
index 00000000000..5befb2837a2
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/hewlett-packard.png differ
diff --git a/www/public/images/company/companies-using-supabase/hubspot.png b/www/public/images/company/companies-using-supabase/hubspot.png
new file mode 100644
index 00000000000..2203af105b3
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/hubspot.png differ
diff --git a/www/public/images/company/companies-using-supabase/ibm.png b/www/public/images/company/companies-using-supabase/ibm.png
new file mode 100644
index 00000000000..59b6d73e4a4
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/ibm.png differ
diff --git a/www/public/images/company/companies-using-supabase/instagram.png b/www/public/images/company/companies-using-supabase/instagram.png
new file mode 100644
index 00000000000..185e14dd191
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/instagram.png differ
diff --git a/www/public/images/company/companies-using-supabase/linkedin.png b/www/public/images/company/companies-using-supabase/linkedin.png
new file mode 100644
index 00000000000..6f19a71882f
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/linkedin.png differ
diff --git a/www/public/images/company/companies-using-supabase/microsoft.png b/www/public/images/company/companies-using-supabase/microsoft.png
new file mode 100644
index 00000000000..86999445641
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/microsoft.png differ
diff --git a/www/public/images/company/companies-using-supabase/netflix.png b/www/public/images/company/companies-using-supabase/netflix.png
new file mode 100755
index 00000000000..9c3ebc92e52
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/netflix.png differ
diff --git a/www/public/images/company/companies-using-supabase/notion.png b/www/public/images/company/companies-using-supabase/notion.png
new file mode 100644
index 00000000000..20f800d42a6
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/notion.png differ
diff --git a/www/public/images/company/companies-using-supabase/red-hat.png b/www/public/images/company/companies-using-supabase/red-hat.png
new file mode 100644
index 00000000000..78730e3957b
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/red-hat.png differ
diff --git a/www/public/images/company/companies-using-supabase/robinhood.png b/www/public/images/company/companies-using-supabase/robinhood.png
new file mode 100644
index 00000000000..8ea237a4a09
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/robinhood.png differ
diff --git a/www/public/images/company/companies-using-supabase/salesforce.png b/www/public/images/company/companies-using-supabase/salesforce.png
new file mode 100644
index 00000000000..4383b3dbaf5
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/salesforce.png differ
diff --git a/www/public/images/company/companies-using-supabase/santander.png b/www/public/images/company/companies-using-supabase/santander.png
new file mode 100644
index 00000000000..04950b00a0b
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/santander.png differ
diff --git a/www/public/images/company/companies-using-supabase/sap.png b/www/public/images/company/companies-using-supabase/sap.png
new file mode 100644
index 00000000000..0c5d208f094
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/sap.png differ
diff --git a/www/public/images/company/companies-using-supabase/shopify.png b/www/public/images/company/companies-using-supabase/shopify.png
new file mode 100755
index 00000000000..0e20ff43c7e
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/shopify.png differ
diff --git a/www/public/images/company/companies-using-supabase/squarespace.png b/www/public/images/company/companies-using-supabase/squarespace.png
new file mode 100644
index 00000000000..d85dfd0cda9
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/squarespace.png differ
diff --git a/www/public/images/company/companies-using-supabase/twitter.png b/www/public/images/company/companies-using-supabase/twitter.png
new file mode 100644
index 00000000000..040ca169956
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/twitter.png differ
diff --git a/www/public/images/company/companies-using-supabase/under-armour.png b/www/public/images/company/companies-using-supabase/under-armour.png
new file mode 100644
index 00000000000..f495880424a
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/under-armour.png differ
diff --git a/www/public/images/company/companies-using-supabase/wells-fargo.png b/www/public/images/company/companies-using-supabase/wells-fargo.png
new file mode 100644
index 00000000000..5a174ff43b9
Binary files /dev/null and b/www/public/images/company/companies-using-supabase/wells-fargo.png differ
diff --git a/www/public/images/github/supabase-dashboard.png b/www/public/images/github/supabase-dashboard.png
new file mode 100644
index 00000000000..ad4aed574d8
Binary files /dev/null and b/www/public/images/github/supabase-dashboard.png differ
diff --git a/www/public/images/hero.png b/www/public/images/hero.png
new file mode 100644
index 00000000000..f1b4d3a9e23
Binary files /dev/null and b/www/public/images/hero.png differ
diff --git a/www/public/images/index/slack-mark.svg b/www/public/images/index/slack-mark.svg
new file mode 100644
index 00000000000..a049d09d4d2
--- /dev/null
+++ b/www/public/images/index/slack-mark.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/logo-dark.png b/www/public/images/logo-dark.png
new file mode 100644
index 00000000000..cba20968f07
Binary files /dev/null and b/www/public/images/logo-dark.png differ
diff --git a/www/public/images/logo-light.png b/www/public/images/logo-light.png
new file mode 100644
index 00000000000..5c6e57b30d6
Binary files /dev/null and b/www/public/images/logo-light.png differ
diff --git a/www/public/images/logo-preview.jpg b/www/public/images/logo-preview.jpg
new file mode 100644
index 00000000000..ba27a9067eb
Binary files /dev/null and b/www/public/images/logo-preview.jpg differ
diff --git a/www/public/images/logos/beta-hero.png b/www/public/images/logos/beta-hero.png
new file mode 100644
index 00000000000..f42724f7ded
Binary files /dev/null and b/www/public/images/logos/beta-hero.png differ
diff --git a/www/public/images/logos/coatue.png b/www/public/images/logos/coatue.png
new file mode 100644
index 00000000000..76227fe5da9
Binary files /dev/null and b/www/public/images/logos/coatue.png differ
diff --git a/www/public/images/logos/monitoro.png b/www/public/images/logos/monitoro.png
new file mode 100644
index 00000000000..7a2efe7f563
Binary files /dev/null and b/www/public/images/logos/monitoro.png differ
diff --git a/www/public/images/logos/mozilla--grey.png b/www/public/images/logos/mozilla--grey.png
new file mode 100644
index 00000000000..eb448fbfbaf
Binary files /dev/null and b/www/public/images/logos/mozilla--grey.png differ
diff --git a/www/public/images/logos/mozilla-logo-bw-rgb-1024x293.png b/www/public/images/logos/mozilla-logo-bw-rgb-1024x293.png
new file mode 100644
index 00000000000..a9a40ef680e
Binary files /dev/null and b/www/public/images/logos/mozilla-logo-bw-rgb-1024x293.png differ
diff --git a/www/public/images/logos/xendit.png b/www/public/images/logos/xendit.png
new file mode 100644
index 00000000000..d2f2f8a94fd
Binary files /dev/null and b/www/public/images/logos/xendit.png differ
diff --git a/www/public/images/logos/yc--grey.png b/www/public/images/logos/yc--grey.png
new file mode 100644
index 00000000000..a1d3aaf642f
Binary files /dev/null and b/www/public/images/logos/yc--grey.png differ
diff --git a/www/public/images/logos/yc.png b/www/public/images/logos/yc.png
new file mode 100644
index 00000000000..d5d970da6e8
Binary files /dev/null and b/www/public/images/logos/yc.png differ
diff --git a/www/public/images/og/og-image.jpg b/www/public/images/og/og-image.jpg
new file mode 100644
index 00000000000..7c10220bf58
Binary files /dev/null and b/www/public/images/og/og-image.jpg differ
diff --git a/www/public/images/payments-demo.png b/www/public/images/payments-demo.png
new file mode 100644
index 00000000000..524cb1abbe5
Binary files /dev/null and b/www/public/images/payments-demo.png differ
diff --git a/www/public/images/post-beta.jpg b/www/public/images/post-beta.jpg
new file mode 100644
index 00000000000..18e8f642d90
Binary files /dev/null and b/www/public/images/post-beta.jpg differ
diff --git a/www/public/images/product/auth/angular-icon.svg b/www/public/images/product/auth/angular-icon.svg
new file mode 100644
index 00000000000..09c59e99fa9
--- /dev/null
+++ b/www/public/images/product/auth/angular-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/apple-icon.svg b/www/public/images/product/auth/apple-icon.svg
new file mode 100644
index 00000000000..3902c024ec0
--- /dev/null
+++ b/www/public/images/product/auth/apple-icon.svg
@@ -0,0 +1,56 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/product/auth/auth-og.jpg b/www/public/images/product/auth/auth-og.jpg
new file mode 100644
index 00000000000..22dcfe42527
Binary files /dev/null and b/www/public/images/product/auth/auth-og.jpg differ
diff --git a/www/public/images/product/auth/bitbucket-icon.svg b/www/public/images/product/auth/bitbucket-icon.svg
new file mode 100644
index 00000000000..cdf84686d93
--- /dev/null
+++ b/www/public/images/product/auth/bitbucket-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/discord-icon.svg b/www/public/images/product/auth/discord-icon.svg
new file mode 100644
index 00000000000..3efe1ec110f
--- /dev/null
+++ b/www/public/images/product/auth/discord-icon.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/product/auth/electron-icon.svg b/www/public/images/product/auth/electron-icon.svg
new file mode 100644
index 00000000000..dc81c99d2cf
--- /dev/null
+++ b/www/public/images/product/auth/electron-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/facebook-icon.svg b/www/public/images/product/auth/facebook-icon.svg
new file mode 100644
index 00000000000..916c8eff2b7
--- /dev/null
+++ b/www/public/images/product/auth/facebook-icon.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/product/auth/flutter-icon.svg b/www/public/images/product/auth/flutter-icon.svg
new file mode 100644
index 00000000000..001b2b8049b
--- /dev/null
+++ b/www/public/images/product/auth/flutter-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/github-icon-dark.svg b/www/public/images/product/auth/github-icon-dark.svg
new file mode 100644
index 00000000000..2667c90a499
--- /dev/null
+++ b/www/public/images/product/auth/github-icon-dark.svg
@@ -0,0 +1,6 @@
+
+
+
diff --git a/www/public/images/product/auth/github-icon.svg b/www/public/images/product/auth/github-icon.svg
new file mode 100644
index 00000000000..61c01f33e16
--- /dev/null
+++ b/www/public/images/product/auth/github-icon.svg
@@ -0,0 +1,6 @@
+
+
+
diff --git a/www/public/images/product/auth/gitlab-icon.svg b/www/public/images/product/auth/gitlab-icon.svg
new file mode 100644
index 00000000000..07da670ab19
--- /dev/null
+++ b/www/public/images/product/auth/gitlab-icon.svg
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1x
+
+
+ 1x
+
+
+ 1x
+
+
+
+ 1x
+
+
+
diff --git a/www/public/images/product/auth/google-icon.svg b/www/public/images/product/auth/google-icon.svg
new file mode 100644
index 00000000000..06dc52f0aa6
--- /dev/null
+++ b/www/public/images/product/auth/google-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/header--dark.png b/www/public/images/product/auth/header--dark.png
new file mode 100644
index 00000000000..0086c4816fb
Binary files /dev/null and b/www/public/images/product/auth/header--dark.png differ
diff --git a/www/public/images/product/auth/header--light.png b/www/public/images/product/auth/header--light.png
new file mode 100644
index 00000000000..89ad60db598
Binary files /dev/null and b/www/public/images/product/auth/header--light.png differ
diff --git a/www/public/images/product/auth/messagebird-icon.svg b/www/public/images/product/auth/messagebird-icon.svg
new file mode 100644
index 00000000000..b9c98603bc7
--- /dev/null
+++ b/www/public/images/product/auth/messagebird-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/microsoft-icon.svg b/www/public/images/product/auth/microsoft-icon.svg
new file mode 100644
index 00000000000..5334aa7ca68
--- /dev/null
+++ b/www/public/images/product/auth/microsoft-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/nuxt-icon.svg b/www/public/images/product/auth/nuxt-icon.svg
new file mode 100644
index 00000000000..1cc014898bb
--- /dev/null
+++ b/www/public/images/product/auth/nuxt-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/react-icon.svg b/www/public/images/product/auth/react-icon.svg
new file mode 100644
index 00000000000..945ab385dfc
--- /dev/null
+++ b/www/public/images/product/auth/react-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/redwood-icon.svg b/www/public/images/product/auth/redwood-icon.svg
new file mode 100644
index 00000000000..e85b6861921
--- /dev/null
+++ b/www/public/images/product/auth/redwood-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/slack-icon.svg b/www/public/images/product/auth/slack-icon.svg
new file mode 100644
index 00000000000..69a4eb6a217
--- /dev/null
+++ b/www/public/images/product/auth/slack-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/spotify-icon.svg b/www/public/images/product/auth/spotify-icon.svg
new file mode 100644
index 00000000000..41d8137620f
--- /dev/null
+++ b/www/public/images/product/auth/spotify-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/twilio-icon.svg b/www/public/images/product/auth/twilio-icon.svg
new file mode 100644
index 00000000000..76d12c7164a
--- /dev/null
+++ b/www/public/images/product/auth/twilio-icon.svg
@@ -0,0 +1 @@
+
diff --git a/www/public/images/product/auth/twitch-icon.svg b/www/public/images/product/auth/twitch-icon.svg
new file mode 100644
index 00000000000..ee4a95fbf02
--- /dev/null
+++ b/www/public/images/product/auth/twitch-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/twitter-icon.svg b/www/public/images/product/auth/twitter-icon.svg
new file mode 100644
index 00000000000..c0364cc1527
--- /dev/null
+++ b/www/public/images/product/auth/twitter-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/www/public/images/product/auth/vue-icon.png b/www/public/images/product/auth/vue-icon.png
new file mode 100644
index 00000000000..5310793a383
Binary files /dev/null and b/www/public/images/product/auth/vue-icon.png differ
diff --git a/www/public/images/product/auth/vue-icon.svg b/www/public/images/product/auth/vue-icon.svg
new file mode 100644
index 00000000000..a1d285eb2a1
--- /dev/null
+++ b/www/public/images/product/auth/vue-icon.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/www/public/images/product/database/database-og.jpg b/www/public/images/product/database/database-og.jpg
new file mode 100644
index 00000000000..af715a48b93
Binary files /dev/null and b/www/public/images/product/database/database-og.jpg differ
diff --git a/www/public/images/product/database/header--dark-2.png b/www/public/images/product/database/header--dark-2.png
new file mode 100644
index 00000000000..10ac26ef3cd
Binary files /dev/null and b/www/public/images/product/database/header--dark-2.png differ
diff --git a/www/public/images/product/database/header--dark.png b/www/public/images/product/database/header--dark.png
new file mode 100644
index 00000000000..a860ede1b50
Binary files /dev/null and b/www/public/images/product/database/header--dark.png differ
diff --git a/www/public/images/product/database/header--light-2.png b/www/public/images/product/database/header--light-2.png
new file mode 100644
index 00000000000..14c8c1f5532
Binary files /dev/null and b/www/public/images/product/database/header--light-2.png differ
diff --git a/www/public/images/product/database/header--light.png b/www/public/images/product/database/header--light.png
new file mode 100644
index 00000000000..c8e84d3cf7e
Binary files /dev/null and b/www/public/images/product/database/header--light.png differ
diff --git a/www/public/images/product/database/postgresql-icon.svg b/www/public/images/product/database/postgresql-icon.svg
new file mode 100644
index 00000000000..161286bffbc
--- /dev/null
+++ b/www/public/images/product/database/postgresql-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/www/public/images/product/database/sql-view/export.png b/www/public/images/product/database/sql-view/export.png
new file mode 100644
index 00000000000..d4fb4275889
Binary files /dev/null and b/www/public/images/product/database/sql-view/export.png differ
diff --git a/www/public/images/product/database/sql-view/favorites.png b/www/public/images/product/database/sql-view/favorites.png
new file mode 100644
index 00000000000..180e90f58e3
Binary files /dev/null and b/www/public/images/product/database/sql-view/favorites.png differ
diff --git a/www/public/images/product/database/sql-view/manaco-editor.png b/www/public/images/product/database/sql-view/manaco-editor.png
new file mode 100644
index 00000000000..7079e06c895
Binary files /dev/null and b/www/public/images/product/database/sql-view/manaco-editor.png differ
diff --git a/www/public/images/product/database/sql-view/sql-editor.png b/www/public/images/product/database/sql-view/sql-editor.png
new file mode 100644
index 00000000000..afef41ce8bb
Binary files /dev/null and b/www/public/images/product/database/sql-view/sql-editor.png differ
diff --git a/www/public/images/product/database/table-view/create-table.png b/www/public/images/product/database/table-view/create-table.png
new file mode 100644
index 00000000000..d959294d972
Binary files /dev/null and b/www/public/images/product/database/table-view/create-table.png differ
diff --git a/www/public/images/product/database/table-view/export.png b/www/public/images/product/database/table-view/export.png
new file mode 100644
index 00000000000..e8d87d59924
Binary files /dev/null and b/www/public/images/product/database/table-view/export.png differ
diff --git a/www/public/images/product/database/table-view/foreign-keys.png b/www/public/images/product/database/table-view/foreign-keys.png
new file mode 100644
index 00000000000..bc508524e53
Binary files /dev/null and b/www/public/images/product/database/table-view/foreign-keys.png differ
diff --git a/www/public/images/product/database/table-view/spreadsheet-interface.png b/www/public/images/product/database/table-view/spreadsheet-interface.png
new file mode 100644
index 00000000000..f9d520ce402
Binary files /dev/null and b/www/public/images/product/database/table-view/spreadsheet-interface.png differ
diff --git a/www/public/images/product/functions/functions-hero-image.png b/www/public/images/product/functions/functions-hero-image.png
new file mode 100644
index 00000000000..ea8ebf8ac0a
Binary files /dev/null and b/www/public/images/product/functions/functions-hero-image.png differ
diff --git a/www/public/images/product/functions/functions-hero.png b/www/public/images/product/functions/functions-hero.png
new file mode 100644
index 00000000000..89b599f15e5
Binary files /dev/null and b/www/public/images/product/functions/functions-hero.png differ
diff --git a/www/public/images/product/functions/typescript.svg b/www/public/images/product/functions/typescript.svg
new file mode 100644
index 00000000000..339da0b637e
--- /dev/null
+++ b/www/public/images/product/functions/typescript.svg
@@ -0,0 +1,6 @@
+
+
+TypeScript logo
+
+
+
diff --git a/www/public/images/product/storage/dashboard-view/column-view.png b/www/public/images/product/storage/dashboard-view/column-view.png
new file mode 100644
index 00000000000..aff1bfa0f53
Binary files /dev/null and b/www/public/images/product/storage/dashboard-view/column-view.png differ
diff --git a/www/public/images/product/storage/dashboard-view/file-previews.png b/www/public/images/product/storage/dashboard-view/file-previews.png
new file mode 100644
index 00000000000..88ae4f60abf
Binary files /dev/null and b/www/public/images/product/storage/dashboard-view/file-previews.png differ
diff --git a/www/public/images/product/storage/dashboard-view/list-view.png b/www/public/images/product/storage/dashboard-view/list-view.png
new file mode 100644
index 00000000000..d6f24fada73
Binary files /dev/null and b/www/public/images/product/storage/dashboard-view/list-view.png differ
diff --git a/www/public/images/product/storage/dashboard-view/multi-column-selection.png b/www/public/images/product/storage/dashboard-view/multi-column-selection.png
new file mode 100644
index 00000000000..186c6bf187b
Binary files /dev/null and b/www/public/images/product/storage/dashboard-view/multi-column-selection.png differ
diff --git a/www/public/images/product/storage/dashboard-view/path-setting.png b/www/public/images/product/storage/dashboard-view/path-setting.png
new file mode 100644
index 00000000000..9a712483001
Binary files /dev/null and b/www/public/images/product/storage/dashboard-view/path-setting.png differ
diff --git a/www/public/images/product/storage/header--dark.png b/www/public/images/product/storage/header--dark.png
new file mode 100644
index 00000000000..6340792df67
Binary files /dev/null and b/www/public/images/product/storage/header--dark.png differ
diff --git a/www/public/images/product/storage/header--light.png b/www/public/images/product/storage/header--light.png
new file mode 100644
index 00000000000..8c190b936c3
Binary files /dev/null and b/www/public/images/product/storage/header--light.png differ
diff --git a/www/public/images/product/storage/storage-og.jpg b/www/public/images/product/storage/storage-og.jpg
new file mode 100644
index 00000000000..3b9fee0d5bc
Binary files /dev/null and b/www/public/images/product/storage/storage-og.jpg differ
diff --git a/www/public/images/product/storage/videos/column-view.mov b/www/public/images/product/storage/videos/column-view.mov
new file mode 100644
index 00000000000..aa96a194785
Binary files /dev/null and b/www/public/images/product/storage/videos/column-view.mov differ
diff --git a/www/public/images/product/storage/videos/file-previews.mov b/www/public/images/product/storage/videos/file-previews.mov
new file mode 100644
index 00000000000..50f54dcbd85
Binary files /dev/null and b/www/public/images/product/storage/videos/file-previews.mov differ
diff --git a/www/public/images/product/storage/videos/header--light.png b/www/public/images/product/storage/videos/header--light.png
new file mode 100644
index 00000000000..03316d97384
Binary files /dev/null and b/www/public/images/product/storage/videos/header--light.png differ
diff --git a/www/public/images/product/storage/videos/list-view.mov b/www/public/images/product/storage/videos/list-view.mov
new file mode 100644
index 00000000000..7be1378f72e
Binary files /dev/null and b/www/public/images/product/storage/videos/list-view.mov differ
diff --git a/www/public/images/product/storage/videos/multi-column-selection.mov b/www/public/images/product/storage/videos/multi-column-selection.mov
new file mode 100644
index 00000000000..757e6a95a34
Binary files /dev/null and b/www/public/images/product/storage/videos/multi-column-selection.mov differ
diff --git a/www/public/images/product/storage/videos/path-setting.mov b/www/public/images/product/storage/videos/path-setting.mov
new file mode 100644
index 00000000000..3340e8b5373
Binary files /dev/null and b/www/public/images/product/storage/videos/path-setting.mov differ
diff --git a/www/public/images/slack-clone.jpg b/www/public/images/slack-clone.jpg
new file mode 100644
index 00000000000..dbf0bf658a1
Binary files /dev/null and b/www/public/images/slack-clone.jpg differ
diff --git a/www/public/images/slack-clone.png b/www/public/images/slack-clone.png
new file mode 100644
index 00000000000..1091ed6414d
Binary files /dev/null and b/www/public/images/slack-clone.png differ
diff --git a/www/public/images/stripe.jpg b/www/public/images/stripe.jpg
new file mode 100644
index 00000000000..05c8aee59a1
Binary files /dev/null and b/www/public/images/stripe.jpg differ
diff --git a/www/public/images/supabase-logo-icon.png b/www/public/images/supabase-logo-icon.png
new file mode 100644
index 00000000000..a3b7b36f929
Binary files /dev/null and b/www/public/images/supabase-logo-icon.png differ
diff --git a/www/public/images/supabase-logo-icon.svg b/www/public/images/supabase-logo-icon.svg
new file mode 100644
index 00000000000..ad802ac16ae
--- /dev/null
+++ b/www/public/images/supabase-logo-icon.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/supabase-logo-wordmark--dark.png b/www/public/images/supabase-logo-wordmark--dark.png
new file mode 100644
index 00000000000..821c42ce283
Binary files /dev/null and b/www/public/images/supabase-logo-wordmark--dark.png differ
diff --git a/www/public/images/supabase-logo-wordmark--dark.svg b/www/public/images/supabase-logo-wordmark--dark.svg
new file mode 100644
index 00000000000..9e96fab4ddc
--- /dev/null
+++ b/www/public/images/supabase-logo-wordmark--dark.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/supabase-logo-wordmark--light.png b/www/public/images/supabase-logo-wordmark--light.png
new file mode 100644
index 00000000000..0277fee2bbe
Binary files /dev/null and b/www/public/images/supabase-logo-wordmark--light.png differ
diff --git a/www/public/images/supabase-logo-wordmark--light.svg b/www/public/images/supabase-logo-wordmark--light.svg
new file mode 100644
index 00000000000..60cbc71dc7c
--- /dev/null
+++ b/www/public/images/supabase-logo-wordmark--light.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/public/images/supabase-logos.zip b/www/public/images/supabase-logos.zip
new file mode 100644
index 00000000000..fca943f9002
Binary files /dev/null and b/www/public/images/supabase-logos.zip differ
diff --git a/www/public/images/t-shirt-promo.jpg b/www/public/images/t-shirt-promo.jpg
new file mode 100644
index 00000000000..998a3417c5d
Binary files /dev/null and b/www/public/images/t-shirt-promo.jpg differ
diff --git a/www/public/images/to-do-app.jpg b/www/public/images/to-do-app.jpg
new file mode 100644
index 00000000000..e57511971ce
Binary files /dev/null and b/www/public/images/to-do-app.jpg differ
diff --git a/www/public/images/twitter-profiles/1FyEWRE8_400x400.jpg b/www/public/images/twitter-profiles/1FyEWRE8_400x400.jpg
new file mode 100644
index 00000000000..f890417e468
Binary files /dev/null and b/www/public/images/twitter-profiles/1FyEWRE8_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/1PH2mt6v_400x400.jpg b/www/public/images/twitter-profiles/1PH2mt6v_400x400.jpg
new file mode 100644
index 00000000000..40b9a14eeda
Binary files /dev/null and b/www/public/images/twitter-profiles/1PH2mt6v_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/2ilFPL2Z_400x400.jpg b/www/public/images/twitter-profiles/2ilFPL2Z_400x400.jpg
new file mode 100644
index 00000000000..b9e49708841
Binary files /dev/null and b/www/public/images/twitter-profiles/2ilFPL2Z_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/4mD0C5Wk_400x400.jpg b/www/public/images/twitter-profiles/4mD0C5Wk_400x400.jpg
new file mode 100644
index 00000000000..80d8d1ed23f
Binary files /dev/null and b/www/public/images/twitter-profiles/4mD0C5Wk_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/5LMWEACf_400x400.jpg b/www/public/images/twitter-profiles/5LMWEACf_400x400.jpg
new file mode 100644
index 00000000000..638c3afe91a
Binary files /dev/null and b/www/public/images/twitter-profiles/5LMWEACf_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/66VSV9Mm_400x400.png b/www/public/images/twitter-profiles/66VSV9Mm_400x400.png
new file mode 100644
index 00000000000..dd480929c8a
Binary files /dev/null and b/www/public/images/twitter-profiles/66VSV9Mm_400x400.png differ
diff --git a/www/public/images/twitter-profiles/6XKH3Rm6_400x400.jpg b/www/public/images/twitter-profiles/6XKH3Rm6_400x400.jpg
new file mode 100644
index 00000000000..fd5ccc1ef13
Binary files /dev/null and b/www/public/images/twitter-profiles/6XKH3Rm6_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/6f1O8ZOW_400x400.jpg b/www/public/images/twitter-profiles/6f1O8ZOW_400x400.jpg
new file mode 100644
index 00000000000..dcf106bbfbd
Binary files /dev/null and b/www/public/images/twitter-profiles/6f1O8ZOW_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/6rd3xub9_400x400.png b/www/public/images/twitter-profiles/6rd3xub9_400x400.png
new file mode 100644
index 00000000000..f2eee3ffa8f
Binary files /dev/null and b/www/public/images/twitter-profiles/6rd3xub9_400x400.png differ
diff --git a/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg b/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg
new file mode 100644
index 00000000000..95940763e1f
Binary files /dev/null and b/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg.1 b/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg.1
new file mode 100644
index 00000000000..95940763e1f
Binary files /dev/null and b/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg.1 differ
diff --git a/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg.2 b/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg.2
new file mode 100644
index 00000000000..95940763e1f
Binary files /dev/null and b/www/public/images/twitter-profiles/6zCnwpvi_400x400.jpg.2 differ
diff --git a/www/public/images/twitter-profiles/AiaH9vJ2_400x400.jpg b/www/public/images/twitter-profiles/AiaH9vJ2_400x400.jpg
new file mode 100644
index 00000000000..1a9bbdda98b
Binary files /dev/null and b/www/public/images/twitter-profiles/AiaH9vJ2_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/AiaH9vJ2_400x400.jpg.1 b/www/public/images/twitter-profiles/AiaH9vJ2_400x400.jpg.1
new file mode 100644
index 00000000000..1a9bbdda98b
Binary files /dev/null and b/www/public/images/twitter-profiles/AiaH9vJ2_400x400.jpg.1 differ
diff --git a/www/public/images/twitter-profiles/F_8WdZbZ_400x400.jpg b/www/public/images/twitter-profiles/F_8WdZbZ_400x400.jpg
new file mode 100644
index 00000000000..2e81b22c8c3
Binary files /dev/null and b/www/public/images/twitter-profiles/F_8WdZbZ_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/IgXniSVk_400x400.jpg b/www/public/images/twitter-profiles/IgXniSVk_400x400.jpg
new file mode 100644
index 00000000000..29be5e4f006
Binary files /dev/null and b/www/public/images/twitter-profiles/IgXniSVk_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/IhXPN_CQ_400x400.jpg b/www/public/images/twitter-profiles/IhXPN_CQ_400x400.jpg
new file mode 100644
index 00000000000..919a964bd02
Binary files /dev/null and b/www/public/images/twitter-profiles/IhXPN_CQ_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/Jqle_tE6_400x400.jpg b/www/public/images/twitter-profiles/Jqle_tE6_400x400.jpg
new file mode 100644
index 00000000000..deec988bf46
Binary files /dev/null and b/www/public/images/twitter-profiles/Jqle_tE6_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/LQYfHXBp_400x400.jpg b/www/public/images/twitter-profiles/LQYfHXBp_400x400.jpg
new file mode 100644
index 00000000000..cad157a10ef
Binary files /dev/null and b/www/public/images/twitter-profiles/LQYfHXBp_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/LTw5OCnv_400x400.jpg b/www/public/images/twitter-profiles/LTw5OCnv_400x400.jpg
new file mode 100644
index 00000000000..d3e4c2e200f
Binary files /dev/null and b/www/public/images/twitter-profiles/LTw5OCnv_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/Os4nhKIr_400x400.jpg b/www/public/images/twitter-profiles/Os4nhKIr_400x400.jpg
new file mode 100644
index 00000000000..3d554e78d9f
Binary files /dev/null and b/www/public/images/twitter-profiles/Os4nhKIr_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/SvAyLaWV_400x400.jpg b/www/public/images/twitter-profiles/SvAyLaWV_400x400.jpg
new file mode 100644
index 00000000000..6d554a6a26b
Binary files /dev/null and b/www/public/images/twitter-profiles/SvAyLaWV_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/UCBhUBZl_400x400.jpg b/www/public/images/twitter-profiles/UCBhUBZl_400x400.jpg
new file mode 100644
index 00000000000..5147f36e448
Binary files /dev/null and b/www/public/images/twitter-profiles/UCBhUBZl_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/_ki30kYo_400x400.jpg b/www/public/images/twitter-profiles/_ki30kYo_400x400.jpg
new file mode 100644
index 00000000000..c4d1e5875bb
Binary files /dev/null and b/www/public/images/twitter-profiles/_ki30kYo_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/aNx9O0lH_400x400.jpg b/www/public/images/twitter-profiles/aNx9O0lH_400x400.jpg
new file mode 100644
index 00000000000..7348b11f90c
Binary files /dev/null and b/www/public/images/twitter-profiles/aNx9O0lH_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/aNx9O0lH_400x400.jpg.1 b/www/public/images/twitter-profiles/aNx9O0lH_400x400.jpg.1
new file mode 100644
index 00000000000..7348b11f90c
Binary files /dev/null and b/www/public/images/twitter-profiles/aNx9O0lH_400x400.jpg.1 differ
diff --git a/www/public/images/twitter-profiles/eGjSYbQd_400x400.jpg b/www/public/images/twitter-profiles/eGjSYbQd_400x400.jpg
new file mode 100644
index 00000000000..1b97f63a289
Binary files /dev/null and b/www/public/images/twitter-profiles/eGjSYbQd_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/eRvqp-t0_400x400.jpg b/www/public/images/twitter-profiles/eRvqp-t0_400x400.jpg
new file mode 100644
index 00000000000..36eeea2f140
Binary files /dev/null and b/www/public/images/twitter-profiles/eRvqp-t0_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/eYP6YXr7_400x400.jpg b/www/public/images/twitter-profiles/eYP6YXr7_400x400.jpg
new file mode 100644
index 00000000000..5f17dd36fa2
Binary files /dev/null and b/www/public/images/twitter-profiles/eYP6YXr7_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/e_2eQt6C_400x400.jpg b/www/public/images/twitter-profiles/e_2eQt6C_400x400.jpg
new file mode 100644
index 00000000000..53056f7f2b6
Binary files /dev/null and b/www/public/images/twitter-profiles/e_2eQt6C_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/ext7ggBo_400x400.jpg b/www/public/images/twitter-profiles/ext7ggBo_400x400.jpg
new file mode 100644
index 00000000000..e68b10e6a9d
Binary files /dev/null and b/www/public/images/twitter-profiles/ext7ggBo_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/iMBvvQdn_400x400.jpg b/www/public/images/twitter-profiles/iMBvvQdn_400x400.jpg
new file mode 100644
index 00000000000..a495ecac91a
Binary files /dev/null and b/www/public/images/twitter-profiles/iMBvvQdn_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/mZAIoZM1_400x400.jpg b/www/public/images/twitter-profiles/mZAIoZM1_400x400.jpg
new file mode 100644
index 00000000000..d127b86bf4d
Binary files /dev/null and b/www/public/images/twitter-profiles/mZAIoZM1_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/nc2Ms5hH_400x400.jpg b/www/public/images/twitter-profiles/nc2Ms5hH_400x400.jpg
new file mode 100644
index 00000000000..0070a16af5b
Binary files /dev/null and b/www/public/images/twitter-profiles/nc2Ms5hH_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/pgHIGqZ0_400x400.jpg b/www/public/images/twitter-profiles/pgHIGqZ0_400x400.jpg
new file mode 100644
index 00000000000..29b7cff36e1
Binary files /dev/null and b/www/public/images/twitter-profiles/pgHIGqZ0_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/qhvO9V6x_400x400.jpg b/www/public/images/twitter-profiles/qhvO9V6x_400x400.jpg
new file mode 100644
index 00000000000..eb0d4e6411e
Binary files /dev/null and b/www/public/images/twitter-profiles/qhvO9V6x_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg b/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg
new file mode 100644
index 00000000000..2d20c6f04f5
Binary files /dev/null and b/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg.1 b/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg.1
new file mode 100644
index 00000000000..2d20c6f04f5
Binary files /dev/null and b/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg.1 differ
diff --git a/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg.2 b/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg.2
new file mode 100644
index 00000000000..2d20c6f04f5
Binary files /dev/null and b/www/public/images/twitter-profiles/rLgwUZSB_400x400.jpg.2 differ
diff --git a/www/public/images/twitter-profiles/v6citnk33y2wpeyzrq05_400x400.jpeg b/www/public/images/twitter-profiles/v6citnk33y2wpeyzrq05_400x400.jpeg
new file mode 100644
index 00000000000..d99a8e84e4e
Binary files /dev/null and b/www/public/images/twitter-profiles/v6citnk33y2wpeyzrq05_400x400.jpeg differ
diff --git a/www/public/images/twitter-profiles/vppimY3M_400x400.jpg b/www/public/images/twitter-profiles/vppimY3M_400x400.jpg
new file mode 100644
index 00000000000..22c5f8c10f4
Binary files /dev/null and b/www/public/images/twitter-profiles/vppimY3M_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/w8HLdlC7_400x400.jpg b/www/public/images/twitter-profiles/w8HLdlC7_400x400.jpg
new file mode 100644
index 00000000000..3d17d2ee52a
Binary files /dev/null and b/www/public/images/twitter-profiles/w8HLdlC7_400x400.jpg differ
diff --git a/www/public/images/twitter-profiles/w_zNZAs7_400x400.jpg b/www/public/images/twitter-profiles/w_zNZAs7_400x400.jpg
new file mode 100644
index 00000000000..c5a2ae08d79
Binary files /dev/null and b/www/public/images/twitter-profiles/w_zNZAs7_400x400.jpg differ
diff --git a/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-auth-social-0auth.jpg b/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-auth-social-0auth.jpg
new file mode 100644
index 00000000000..575d8e0255f
Binary files /dev/null and b/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-auth-social-0auth.jpg differ
diff --git a/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-dashboard-sql-editor.jpg b/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-dashboard-sql-editor.jpg
new file mode 100644
index 00000000000..9c81a19db3a
Binary files /dev/null and b/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-dashboard-sql-editor.jpg differ
diff --git a/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-dashboard-table-editor.jpg b/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-dashboard-table-editor.jpg
new file mode 100644
index 00000000000..f03f8389795
Binary files /dev/null and b/www/public/new/external-comms/vercel-integration/vercel-integration-supabase-dashboard-table-editor.jpg differ
diff --git a/www/public/robots.txt b/www/public/robots.txt
new file mode 100644
index 00000000000..a2529d03fe7
--- /dev/null
+++ b/www/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Sitemap: https://supabase.com/sitemap.xml
\ No newline at end of file
diff --git a/www/public/rss.xml b/www/public/rss.xml
new file mode 100644
index 00000000000..d0f17d88f03
--- /dev/null
+++ b/www/public/rss.xml
@@ -0,0 +1,772 @@
+
+
+
+ Blog - Supabase
+ https://supabase.com
+ Latest news from Supabase
+ en
+ Tue, 19 Apr 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/04/20/partner-gallery-works-with-supabase
+ Works With Supabase - announcing our Partner Gallery
+ https://supabase.com/blog/2022/04/20/partner-gallery-works-with-supabase
+ Introducing our Partner Gallery - open source and made with Supabase.
+ Tue, 19 Apr 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/04/18/bring-the-func-hackathon-winners
+ Bring the Func Hackathon Winners 2022
+ https://supabase.com/blog/2022/04/18/bring-the-func-hackathon-winners
+ Celebrating many amazing OSS Hackathon projects using GraphQL and Edge Functions.
+ Sun, 17 Apr 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/04/15/beta-update-march-2022
+ Supabase Beta March 2022
+ https://supabase.com/blog/2022/04/15/beta-update-march-2022
+ Functions, GraphQL, and much more.
+ Thu, 14 Apr 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/04/01/supabrew
+ Supabrew - Never Code Thirsty
+ https://supabase.com/blog/2022/04/01/supabrew
+ A light and refreshing non-alcoholic beer for devs.
+ Thu, 31 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/04/01/supabase-realtime-with-multiplayer-features
+ Supabase Realtime, with Multiplayer Features
+ https://supabase.com/blog/2022/04/01/supabase-realtime-with-multiplayer-features
+ Today we're announced Realtime, with multiplayer features. Realtime enables broadcast, presence, and listening to database changes delivered over WebSockets.
+ Thu, 31 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/04/01/hackathon-bring-the-func
+ Hackathon: Bring the Func(🕺)
+ https://supabase.com/blog/2022/04/01/hackathon-bring-the-func
+ Build open-source projects with our latest features, win limited edition swag and plant a tree!
+ Thu, 31 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/03/31/supabase-edge-functions
+ Edge Functions are now available in Supabase
+ https://supabase.com/blog/2022/03/31/supabase-edge-functions
+ Today we're launching Edge Functions. Edge Functions let you execute Typescript code close to your users, no matter where they're located.
+ Wed, 30 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/03/30/supabase-enterprise
+ Introducing Supabase Enterprise
+ https://supabase.com/blog/2022/03/30/supabase-enterprise
+ Today we are releasing Supabase Enterprise, a suite of features to scale your project.
+ Tue, 29 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/03/29/graphql-now-available
+ GraphQL is now available in Supabase
+ https://supabase.com/blog/2022/03/29/graphql-now-available
+ GraphQL support is now in general availability on the Supabase platform via our open source PostgreSQL extension, pg_graphql (beta).
+ Mon, 28 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/03/28/community-day
+ Community Day
+ https://supabase.com/blog/2022/03/28/community-day
+ Kicking off Launch Week IV with contributors, partners, and friends.
+ Sun, 27 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/03/25/supabase-launch-week-four
+ Supabase Launch Week IV
+ https://supabase.com/blog/2022/03/25/supabase-launch-week-four
+ Launch Week 4: One new feature every day for an entire week. Starting Monday 28th March.
+ Thu, 24 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/03/25/should-i-open-source-my-company
+ Should I Open Source my Company?
+ https://supabase.com/blog/2022/03/25/should-i-open-source-my-company
+ The unexpected upsides of building in public
+ Thu, 24 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/03/08/audit
+ Postgres Auditing in 150 lines of SQL
+ https://supabase.com/blog/2022/03/08/audit
+ PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL.
+ Mon, 07 Mar 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/02/22/supabase-beta-january-2022
+ Supabase Beta January 2022
+ https://supabase.com/blog/2022/02/22/supabase-beta-january-2022
+ New auth providers, SMS providers, and new videos.
+ Mon, 21 Feb 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/01/20/supabase-beta-december-2021
+ Supabase Beta December 2021
+ https://supabase.com/blog/2022/01/20/supabase-beta-december-2021
+ New crypto extension, Postgres videos, and a bunch of cool integrations.
+ Wed, 19 Jan 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2022/01/20/product-hunt-golden-kitty-awards-2021
+ Golden Kitty Awards Ceremony Watch Party with Supabase
+ https://supabase.com/blog/2022/01/20/product-hunt-golden-kitty-awards-2021
+ Hang out with us while watching the Product Hunt Golden Kitty Awards Ceremony
+ Wed, 19 Jan 2022 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/12/17/holiday-hackdays-winners-2021
+ Holiday Hackdays Winners 2021
+ https://supabase.com/blog/2021/12/17/holiday-hackdays-winners-2021
+ Celebrating many amazing projects submitted to our Holiday Hackdays Hackathon.
+ Thu, 16 Dec 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/12/15/beta-november-2021-launch-week-recap
+ Supabase Beta November 2021: Launch Week Recap
+ https://supabase.com/blog/2021/12/15/beta-november-2021-launch-week-recap
+ We wrapped up November with Supabase's third Launch Week. Here's all the awesome stuff that got shipped ...
+ Tue, 14 Dec 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/12/03/supabase-holiday-hackdays-hackathon
+ Kicking off the Holiday Hackdays
+ https://supabase.com/blog/2021/12/03/supabase-holiday-hackdays-hackathon
+ Build cool stuff and celebrate open-source software with us during the Holiday Hackdays!
+ Thu, 02 Dec 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/12/03/pg-graphql
+ pg_graphql: A GraphQL extension for PostgreSQL
+ https://supabase.com/blog/2021/12/03/pg-graphql
+ GraphQL support is in development for PostgreSQL + Supabase.
+ Thu, 02 Dec 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/12/03/launch-week-three-friday-five-more-things
+ Five more things
+ https://supabase.com/blog/2021/12/03/launch-week-three-friday-five-more-things
+ It's never just one more thing!
+ Thu, 02 Dec 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/12/02/supabase-acquires-logflare
+ Supabase acquires Logflare
+ https://supabase.com/blog/2021/12/02/supabase-acquires-logflare
+ Today, we're ecstatic to announce that Logflare is joining Supabase.
+ Wed, 01 Dec 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/12/01/realtime-row-level-security-in-postgresql
+ Realtime Postgres RLS now available on Supabase
+ https://supabase.com/blog/2021/12/01/realtime-row-level-security-in-postgresql
+ Realtime database changes are now broadcast to authenticated users, respecting the same PostgreSQL policies that you use for Row Level Security.
+ Tue, 30 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/11/30/supabase-studio
+ Supabase Studio
+ https://supabase.com/blog/2021/11/30/supabase-studio
+ The same Dashboard that you're using on our Platform is now available for local development and Self-Hosting.
+ Mon, 29 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/11/29/community-day
+ Community Day
+ https://supabase.com/blog/2021/11/29/community-day
+ Kicking off launch week by highlighting the communities around Supabase.
+ Sun, 28 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/11/28/whats-new-in-postgres-14
+ New in PostgreSQL 14: What every developer should know
+ https://supabase.com/blog/2021/11/28/whats-new-in-postgres-14
+ A quick look at some new features and functionality in PostgreSQL 14.
+ Sat, 27 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/11/28/postgrest-9
+ PostgREST 9
+ https://supabase.com/blog/2021/11/28/postgrest-9
+ New features and updates in PostgREST version 9.
+ Fri, 26 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/11/26/supabase-launch-week-the-trilogy
+ Supabase Launch Week III: Holiday Special
+ https://supabase.com/blog/2021/11/26/supabase-launch-week-the-trilogy
+ Tis the season to be shipping.
+ Thu, 25 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/11/26/supabase-how-we-launch
+ How we launch at Supabase
+ https://supabase.com/blog/2021/11/26/supabase-how-we-launch
+ The history and methodology of Supabase Launch Week.
+ Thu, 25 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/11/05/supabase-beta-october-2021
+ Supabase Beta October 2021
+ https://supabase.com/blog/2021/11/05/supabase-beta-october-2021
+ Three new Auth providers, multi-schema support, and we're gearing up for another Launch Week.
+ Sat, 06 Nov 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/10/28/supabase-series-a
+ Supabase $30m Series A
+ https://supabase.com/blog/2021/10/28/supabase-series-a
+ Supabase just raised $30M, bringing our total funding to $36M.
+ Wed, 27 Oct 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/10/19/replenysh-time-to-value-in-less-than-24-hours
+ Replenysh uses Supabase to implement OTP in less than 24-hours
+ https://supabase.com/blog/2021/10/19/replenysh-time-to-value-in-less-than-24-hours
+ Learn how Replenysh uses Supabase to power the circular economy, redefining how brands interact with their customers and products.
+ Mon, 18 Oct 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/10/14/hacktoberfest-hackathon-winners-2021
+ Hacktoberfest Hackathon Winners 2021
+ https://supabase.com/blog/2021/10/14/hacktoberfest-hackathon-winners-2021
+ Celebrating many amazing projects submitted to our Hacktoberfest Hackathon.
+ Wed, 13 Oct 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/10/04/supabase-beta-sept-2021
+ Supabase Beta Sept 2021
+ https://supabase.com/blog/2021/10/04/supabase-beta-sept-2021
+ Hackathon, Aborting request, UI updates, and now Hiring.
+ Sun, 03 Oct 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/09/28/supabase-hacktoberfest-hackathon-2021
+ Supabase Hacktoberfest Hackathon 2021
+ https://supabase.com/blog/2021/09/28/supabase-hacktoberfest-hackathon-2021
+ We're running another Supabase Hackathon during Hacktoberfest!
+ Mon, 27 Sep 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/09/10/supabase-beta-august-2021
+ Supabase Beta August 2021
+ https://supabase.com/blog/2021/09/10/supabase-beta-august-2021
+ Fundraising, Realtime Security, custom SMS templates, and deployments in South Korea.
+ Thu, 09 Sep 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/08/12/supabase-beta-july-2021
+ Supabase Beta July 2021
+ https://supabase.com/blog/2021/08/12/supabase-beta-july-2021
+ Discord Logins, Vercel Integration, Full text search, and OAuth guides.
+ Wed, 11 Aug 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/08/09/hackathon-winners
+ Open Source Hackathon Winners
+ https://supabase.com/blog/2021/08/09/hackathon-winners
+ Let the medal ceremony begin for the best projects submitted during the Supabase Hackathon.
+ Sun, 08 Aug 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/30/supabase-swag-store
+ Supabase Swag Store
+ https://supabase.com/blog/2021/07/30/supabase-swag-store
+ Today we are officially launching the Supabase Swag Store.
+ Thu, 29 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/30/supabase-functions-updates
+ Updates for Supabase Functions
+ https://supabase.com/blog/2021/07/30/supabase-functions-updates
+ The question on everyone's mind - are we launching Supabase Functions? Well, it's complicated.
+ Thu, 29 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/30/1-the-supabase-hackathon
+ The Supabase Hackathon
+ https://supabase.com/blog/2021/07/30/1-the-supabase-hackathon
+ A whole week of Hacking for Fun and Prizes.
+ Thu, 29 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/29/supabase-reports-and-metrics
+ Supabase Reports and Metrics
+ https://supabase.com/blog/2021/07/29/supabase-reports-and-metrics
+ We're exposing a full set of metrics in your projects, so that you can build better (and faster) products for your users.
+ Wed, 28 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/28/supabase-auth-passwordless-sms-login
+ Supabase Auth v2: Phone Auth now available
+ https://supabase.com/blog/2021/07/28/supabase-auth-passwordless-sms-login
+ Phone Auth is available today on all new and existing Supabase projects.
+ Tue, 27 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/28/mobbin-supabase-200000-users
+ Mobbin uses Supabase to authenticate 200,000 users
+ https://supabase.com/blog/2021/07/28/mobbin-supabase-200000-users
+ Learn how Mobbin migrated 200,000 users from Firebase for a better authentication experience.
+ Tue, 27 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/27/storage-beta
+ Supabase Storage now in Beta
+ https://supabase.com/blog/2021/07/27/storage-beta
+ Supabase Storage moves into Beta.
+ Mon, 26 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/27/spot-flutter-with-postgres
+ Spot: a video sharing app built with Flutter
+ https://supabase.com/blog/2021/07/27/spot-flutter-with-postgres
+ Spot is a geolocation-based video-sharing app with some social networking features.
+ Mon, 26 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/26/supabase-postgres-13
+ Supabase is now on Postgres 13.3
+ https://supabase.com/blog/2021/07/26/supabase-postgres-13
+ From today, new Supabase projects will be on a version of Supabase Postgres that runs on Postgres 13.3.
+ Sun, 25 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/26/supabase-community-day
+ Supabase Community Day
+ https://supabase.com/blog/2021/07/26/supabase-community-day
+ Community Day
+ Sun, 25 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/26/epsilon3-self-hosting
+ Epsilon3 Self-Host Supabase To Revolutionize Space Operations
+ https://supabase.com/blog/2021/07/26/epsilon3-self-hosting
+ Learn how the team at Epsilon3 use Supabase to help teams execute secure and reliable operations in an industry that project spend runs into the billions.
+ Sun, 25 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/22/supabase-launch-week-sql
+ Supabase Launch Week II: The SQL
+ https://supabase.com/blog/2021/07/22/supabase-launch-week-sql
+ Five days of Supabase. Again.
+ Wed, 21 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/01/roles-postgres-hooks
+ Protecting reserved roles with PostgreSQL Hooks
+ https://supabase.com/blog/2021/07/01/roles-postgres-hooks
+ Using Postgres Hooks to protect functionality in your Postgres database.
+ Thu, 01 Jul 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/07/02/supabase-beta-june-2021
+ Supabase Beta June 2021
+ https://supabase.com/blog/2021/07/02/supabase-beta-june-2021
+ Discord Logins, Vercel Integration, Full text search, and OAuth guides.
+ Tue, 01 Jun 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/06/02/supabase-beta-may-2021
+ Supabase Beta May 2021
+ https://supabase.com/blog/2021/06/02/supabase-beta-may-2021
+ Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries.
+ Tue, 01 Jun 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/05/03/supabase-beta-april-2021
+ Supabase Beta April 2021
+ https://supabase.com/blog/2021/05/03/supabase-beta-april-2021
+ Supabase "gardening" - stability, security, and community support.
+ Tue, 04 May 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/04/06/supabase-beta-march-2021
+ Supabase Beta March 2021
+ https://supabase.com/blog/2021/04/06/supabase-beta-march-2021
+ Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing.
+ Mon, 05 Apr 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/04/02/supabase-workflows
+ Workflows are coming to Supabase
+ https://supabase.com/blog/2021/04/02/supabase-workflows
+ Functions are great, but you know what's better?
+ Thu, 01 Apr 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/04/02/supabase-pgbouncer
+ PgBouncer is now available in Supabase
+ https://supabase.com/blog/2021/04/02/supabase-pgbouncer
+ Better support for Serverless and Postgres.
+ Thu, 01 Apr 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/04/02/supabase-dot-com
+ Supabase Dot Com
+ https://supabase.com/blog/2021/04/02/supabase-dot-com
+ The Supabase Domain name is changing.
+ Thu, 01 Apr 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/04/01/supabase-nft-marketplace
+ Supabase Launches NFT Marketplace
+ https://supabase.com/blog/2021/04/01/supabase-nft-marketplace
+ A fully encrypted NFT platform to protect and transact your digital assets
+ Wed, 31 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/31/supabase-cli
+ Supabase CLI
+ https://supabase.com/blog/2021/03/31/supabase-cli
+ Local development, database migrations, and self-hosting.
+ Tue, 30 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/30/supabase-storage
+ Storage is now available in Supabase
+ https://supabase.com/blog/2021/03/30/supabase-storage
+ Launching Supabase Storage and how you can use it in your apps
+ Mon, 29 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/29/pricing
+ Supabase Beta Pricing
+ https://supabase.com/blog/2021/03/29/pricing
+ Supabase launches Beta pricing structure
+ Sun, 28 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/25/launch-week
+ Launch week
+ https://supabase.com/blog/2021/03/25/launch-week
+ Five days of Supabase.
+ Wed, 24 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/25/angels-of-supabase
+ Angels of Supabase
+ https://supabase.com/blog/2021/03/25/angels-of-supabase
+ Meet the investors of Supabase.
+ Wed, 24 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/22/In-The-Loop
+ Developers stay up to date with intheloop.dev
+ https://supabase.com/blog/2021/03/22/In-The-Loop
+ Learn why Kevin is building intheloop.dev with Supabase
+ Sun, 21 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/11/using-supabase-replit
+ Using Supabase in Replit
+ https://supabase.com/blog/2021/03/11/using-supabase-replit
+ Free hosted relational database from within your node.js repl
+ Wed, 10 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/08/toad-a-link-shortener-with-simple-apis-for-low-coders
+ Toad, a link shortener with simple APIs for low-coders
+ https://supabase.com/blog/2021/03/08/toad-a-link-shortener-with-simple-apis-for-low-coders
+ An easy-to-use link shortening tool with simple APIs
+ Sun, 07 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/05/postgres-as-a-cron-server
+ Postgres as a CRON Server
+ https://supabase.com/blog/2021/03/05/postgres-as-a-cron-server
+ Running repetitive tasks with your Postgres database.
+ Thu, 04 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/03/02/supabase-beta-february-2021
+ Supabase Beta February 2021
+ https://supabase.com/blog/2021/03/02/supabase-beta-february-2021
+ One year of building.
+ Mon, 01 Mar 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/02/27/cracking-postgres-interview
+ Cracking PostgreSQL Interview Questions
+ https://supabase.com/blog/2021/02/27/cracking-postgres-interview
+ Understand the top PostgreSQL Interview Questions
+ Fri, 26 Feb 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/02/09/case-study-roboflow
+ Roboflow.com choose Supabase to power Paint.wtf leaderboard
+ https://supabase.com/blog/2021/02/09/case-study-roboflow
+ Learn how Roboflow.com used Supabase to build their Paint.wtf leaderboard
+ Mon, 08 Feb 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/02/02/supabase-beta-january-2021
+ Supabase Beta January 2021
+ https://supabase.com/blog/2021/02/02/supabase-beta-january-2021
+ Eleven months of building.
+ Mon, 01 Feb 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2021/01/02/supabase-beta-december-2020
+ Supabase Beta December 2020
+ https://supabase.com/blog/2021/01/02/supabase-beta-december-2020
+ Ten months of building.
+ Fri, 01 Jan 2021 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/12/13/supabase-dashboard-performance
+ Making the Supabase Dashboard Supa-fast
+ https://supabase.com/blog/2020/12/13/supabase-dashboard-performance
+ Improving the performance of the Supabase dashboard
+ Sat, 12 Dec 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/12/02/supabase-striveschool
+ Supabase Partners With Strive School To Help Teach Open Source
+ https://supabase.com/blog/2020/12/02/supabase-striveschool
+ Supabase Partners With Strive School To Help Teach Open Source To The Next Generation Of Developers
+ Tue, 01 Dec 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/12/02/case-study-xendit
+ Xendit Built a Counter-Fraud Watchlist for the Fintech Industry
+ https://supabase.com/blog/2020/12/02/case-study-xendit
+ See how Xendit use Supabase to build a full-text search engine.
+ Tue, 01 Dec 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/12/02/case-study-tayfa
+ TAYFA Built a No-Code Website Builder in Seven Days
+ https://supabase.com/blog/2020/12/02/case-study-tayfa
+ See how Tayfa went from idea to paying customer in less than 30 days.
+ Tue, 01 Dec 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/12/02/case-study-monitoro
+ Monitoro Built a Web Crawler Handling Millions of API Requests
+ https://supabase.com/blog/2020/12/02/case-study-monitoro
+ See how Monitoro built an automated scraping platform using Supabase.
+ Tue, 01 Dec 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/12/01/supabase-alpha-november-2020
+ Supabase Alpha November 2020
+ https://supabase.com/blog/2020/12/01/supabase-alpha-november-2020
+ Nine months of building.
+ Mon, 30 Nov 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/11/18/postgresql-views
+ Postgres Views
+ https://supabase.com/blog/2020/11/18/postgresql-views
+ Creating and using a view in PostgreSQL.
+ Tue, 17 Nov 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/11/02/supabase-alpha-october-2020
+ Supabase Alpha October 2020
+ https://supabase.com/blog/2020/11/02/supabase-alpha-october-2020
+ Eight months of building.
+ Sun, 01 Nov 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/10/30/improved-dx
+ Supabase.js 1.0
+ https://supabase.com/blog/2020/10/30/improved-dx
+ We're releasing a new version of our Supabase client with some awesome new improvements.
+ Thu, 29 Oct 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/10/03/supabase-alpha-september-2020
+ Supabase Alpha September 2020
+ https://supabase.com/blog/2020/10/03/supabase-alpha-september-2020
+ Seven months of building.
+ Fri, 02 Oct 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/09/11/supabase-hacktoberfest-2020
+ Supabase Hacktoberfest 2020
+ https://supabase.com/blog/2020/09/11/supabase-hacktoberfest-2020
+ Join us for a celebration of open source software and learn how to contribute to Supabase.
+ Thu, 10 Sep 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/09/03/supabase-alpha-august-2020
+ Supabase Alpha August 2020
+ https://supabase.com/blog/2020/09/03/supabase-alpha-august-2020
+ Six months of building
+ Wed, 02 Sep 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/08/05/supabase-auth
+ Supabase Auth
+ https://supabase.com/blog/2020/08/05/supabase-auth
+ Authenticate and authorize your users with Supabase Auth
+ Tue, 04 Aug 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/08/02/supabase-alpha-july-2020
+ Supabase Alpha July 2020
+ https://supabase.com/blog/2020/08/02/supabase-alpha-july-2020
+ Five months of building
+ Sat, 01 Aug 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/08/02/continuous-postgresql-backup-walg
+ Continuous PostgreSQL Backups using WAL-G
+ https://supabase.com/blog/2020/08/02/continuous-postgresql-backup-walg
+ Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G.
+ Sat, 01 Aug 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/07/10/alpha-launch-postmortem
+ Alpha Launch Postmortem
+ https://supabase.com/blog/2020/07/10/alpha-launch-postmortem
+ Everything that went wrong with Supabase's launch
+ Thu, 09 Jul 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/07/09/postgresql-templates
+ What are PostgreSQL Templates?
+ https://supabase.com/blog/2020/07/09/postgresql-templates
+ What are PostgreSQL templates and what are they used for?
+ Wed, 08 Jul 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/07/17/postgresql-physical-logical-backups
+ Physical vs Logical Backups in PostgreSQL
+ https://supabase.com/blog/2020/07/17/postgresql-physical-logical-backups
+ What are physical and logical backups in Postgres?
+ Mon, 06 Jul 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/07/01/supabase-alpha-june-2020
+ Supabase Alpha June 2020
+ https://supabase.com/blog/2020/07/01/supabase-alpha-june-2020
+ Four months of building
+ Tue, 30 Jun 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/06/15/supabase-steve-chavez
+ Steve Chavez has joined Supabase
+ https://supabase.com/blog/2020/06/15/supabase-steve-chavez
+ Steve joins Supabase to help build Auth.
+ Sun, 14 Jun 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/06/01/supabase-alpha-may-2020
+ Supabase Alpha May 2020
+ https://supabase.com/blog/2020/06/01/supabase-alpha-may-2020
+ Three months of building
+ Sun, 31 May 2020 16:00:00 GMT
+
+
+-
+
https://supabase.com/blog/2020/05/01/supabase-alpha-april-2020
+ Supabase Alpha April 2020
+ https://supabase.com/blog/2020/05/01/supabase-alpha-april-2020
+ Two months of building
+ Sun, 31 May 2020 16:00:00 GMT
+
+
+
+
diff --git a/www/public/sitemap.xml b/www/public/sitemap.xml
new file mode 100644
index 00000000000..aa271b28c9b
--- /dev/null
+++ b/www/public/sitemap.xml
@@ -0,0 +1,9 @@
+
+
+
+ https://supabase.com/sitemap_www.xml
+
+
+ https://supabase.com/docs/sitemap.xml
+
+
\ No newline at end of file
diff --git a/www/public/sitemap_www.xml b/www/public/sitemap_www.xml
new file mode 100644
index 00000000000..170d40bb3ef
--- /dev/null
+++ b/www/public/sitemap_www.xml
@@ -0,0 +1,652 @@
+
+
+
+ https://supabase.com/404
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/_app
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/beta
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/brand-assets
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/company
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/support
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/auth
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/contact/enterprise
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/database
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/edge-functions/edge-functions
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/partners/[slug]
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/storage
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/05/01/supabase-alpha-april-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/06/01/supabase-alpha-may-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/06/15/supabase-steve-chavez
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/07/01/supabase-alpha-june-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/07/09/postgresql-templates
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/07/10/alpha-launch-postmortem
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/07/17/postgresql-physical-logical-backups
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/08/02/continuous-postgresql-backup-walg
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/08/02/supabase-alpha-july-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/08/05/supabase-auth
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/09/03/supabase-alpha-august-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/09/11/supabase-hacktoberfest-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/10/03/supabase-alpha-september-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/10/30/improved-dx
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/11/02/supabase-alpha-october-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/11/18/postgresql-views
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/12/01/supabase-alpha-november-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/12/02/case-study-monitoro
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/12/02/case-study-tayfa
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/12/02/case-study-xendit
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/12/02/supabase-striveschool
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2020/12/13/supabase-dashboard-performance
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/01/02/supabase-beta-december-2020
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/02/02/supabase-beta-january-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/02/09/case-study-roboflow
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/02/27/cracking-postgres-interview
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/02/supabase-beta-february-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/05/postgres-as-a-cron-server
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/08/toad-a-link-shortener-with-simple-apis-for-low-coders
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/11/using-supabase-replit
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/22/In-The-Loop
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/25/angels-of-supabase
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/25/launch-week
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/29/pricing
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/30/supabase-storage
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/03/31/supabase-cli
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/04/01/supabase-nft-marketplace
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/04/02/supabase-dot-com
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/04/02/supabase-pgbouncer
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/04/02/supabase-workflows
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/04/06/supabase-beta-march-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/05/03/supabase-beta-april-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/06/02/supabase-beta-may-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/01/roles-postgres-hooks
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/02/supabase-beta-june-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/22/supabase-launch-week-sql
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/26/epsilon3-self-hosting
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/26/supabase-community-day
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/26/supabase-postgres-13
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/27/spot-flutter-with-postgres
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/27/storage-beta
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/28/mobbin-supabase-200000-users
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/28/supabase-auth-passwordless-sms-login
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/29/supabase-reports-and-metrics
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/30/1-the-supabase-hackathon
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/30/supabase-functions-updates
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/07/30/supabase-swag-store
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/08/09/hackathon-winners
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/08/12/supabase-beta-july-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/09/10/supabase-beta-august-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/09/28/supabase-hacktoberfest-hackathon-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/10/04/supabase-beta-sept-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/10/14/hacktoberfest-hackathon-winners-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/10/19/replenysh-time-to-value-in-less-than-24-hours
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/10/28/supabase-series-a
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/11/05/supabase-beta-october-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/11/26/supabase-how-we-launch
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/11/26/supabase-launch-week-the-trilogy
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/11/28/postgrest-9
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/11/28/whats-new-in-postgres-14
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/11/29/community-day
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/11/30/supabase-studio
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/12/01/realtime-row-level-security-in-postgresql
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/12/02/supabase-acquires-logflare
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/12/03/launch-week-three-friday-five-more-things
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/12/03/pg-graphql
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/12/03/supabase-holiday-hackdays-hackathon
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/12/15/beta-november-2021-launch-week-recap
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2021/12/17/holiday-hackdays-winners-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/01/20/product-hunt-golden-kitty-awards-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/01/20/supabase-beta-december-2021
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/02/22/supabase-beta-january-2022
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/03/08/audit
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/03/25/should-i-open-source-my-company
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/03/25/supabase-launch-week-four
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/03/28/community-day
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/03/29/graphql-now-available
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/03/30/supabase-enterprise
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/03/31/supabase-edge-functions
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/04/01/hackathon-bring-the-func
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/04/01/supabase-realtime-with-multiplayer-features
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/04/01/supabrew
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/04/15/beta-update-march-2022
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/04/18/bring-the-func-hackathon-winners
+ weekly
+ 0.5
+
+
+
+ https://supabase.com/blog/2022/04/20/partner-gallery-works-with-supabase
+ weekly
+ 0.5
+
+
diff --git a/www/public/videos/blog/launch-week-4/api-enable-graphql.mp4 b/www/public/videos/blog/launch-week-4/api-enable-graphql.mp4
new file mode 100644
index 00000000000..f563d278f21
Binary files /dev/null and b/www/public/videos/blog/launch-week-4/api-enable-graphql.mp4 differ
diff --git a/www/public/videos/blog/launch-week-4/database-addons.mp4 b/www/public/videos/blog/launch-week-4/database-addons.mp4
new file mode 100644
index 00000000000..d7a79504b2d
Binary files /dev/null and b/www/public/videos/blog/launch-week-4/database-addons.mp4 differ
diff --git a/www/public/videos/blog/launch-week-4/functions-hot-reloading.mp4 b/www/public/videos/blog/launch-week-4/functions-hot-reloading.mp4
new file mode 100644
index 00000000000..21cb44e7fdd
Binary files /dev/null and b/www/public/videos/blog/launch-week-4/functions-hot-reloading.mp4 differ
diff --git a/www/public/videos/blog/launch-week-4/logexplorer.mp4 b/www/public/videos/blog/launch-week-4/logexplorer.mp4
new file mode 100644
index 00000000000..00aaa7ae74c
Binary files /dev/null and b/www/public/videos/blog/launch-week-4/logexplorer.mp4 differ
diff --git a/www/public/videos/blog/launch-week-4/logs-polish.mov b/www/public/videos/blog/launch-week-4/logs-polish.mov
new file mode 100644
index 00000000000..cf1d85eae86
Binary files /dev/null and b/www/public/videos/blog/launch-week-4/logs-polish.mov differ
diff --git a/www/public/videos/blog/launch-week-4/spend-caps.mov b/www/public/videos/blog/launch-week-4/spend-caps.mov
new file mode 100644
index 00000000000..92360c7da48
Binary files /dev/null and b/www/public/videos/blog/launch-week-4/spend-caps.mov differ
diff --git a/www/public/videos/blog/launch-week-4/spend-caps.mp4 b/www/public/videos/blog/launch-week-4/spend-caps.mp4
new file mode 100644
index 00000000000..13909c72cf7
Binary files /dev/null and b/www/public/videos/blog/launch-week-4/spend-caps.mp4 differ
diff --git a/www/public/videos/blog/launch-week-storage-2/directory-uploads.mp4 b/www/public/videos/blog/launch-week-storage-2/directory-uploads.mp4
new file mode 100644
index 00000000000..c4be505b9b4
Binary files /dev/null and b/www/public/videos/blog/launch-week-storage-2/directory-uploads.mp4 differ
diff --git a/www/public/videos/blog/launch-week-storage-2/large-buckets.mp4 b/www/public/videos/blog/launch-week-storage-2/large-buckets.mp4
new file mode 100644
index 00000000000..4487f9d5394
Binary files /dev/null and b/www/public/videos/blog/launch-week-storage-2/large-buckets.mp4 differ
diff --git a/www/public/videos/blog/launch-week-storage-2/nyan-cat.mp4 b/www/public/videos/blog/launch-week-storage-2/nyan-cat.mp4
new file mode 100644
index 00000000000..a20b66b8b47
Binary files /dev/null and b/www/public/videos/blog/launch-week-storage-2/nyan-cat.mp4 differ
diff --git a/www/public/videos/statusPage.mp4 b/www/public/videos/statusPage.mp4
new file mode 100644
index 00000000000..5954f96982b
Binary files /dev/null and b/www/public/videos/statusPage.mp4 differ
diff --git a/www/public/videos/tabAuthRules.mp4 b/www/public/videos/tabAuthRules.mp4
new file mode 100644
index 00000000000..b41c5c8fdea
Binary files /dev/null and b/www/public/videos/tabAuthRules.mp4 differ
diff --git a/www/public/videos/tabSqlEditor.mp4 b/www/public/videos/tabSqlEditor.mp4
new file mode 100644
index 00000000000..de25152f31f
Binary files /dev/null and b/www/public/videos/tabSqlEditor.mp4 differ
diff --git a/www/public/videos/tabTableEditor.mp4 b/www/public/videos/tabTableEditor.mp4
new file mode 100644
index 00000000000..cad67d2f383
Binary files /dev/null and b/www/public/videos/tabTableEditor.mp4 differ
diff --git a/www/schema.sql b/www/schema.sql
new file mode 100644
index 00000000000..eb956aa59aa
--- /dev/null
+++ b/www/schema.sql
@@ -0,0 +1,66 @@
+create type partner_type as enum ('technology', 'expert');
+
+create table partner_contacts (
+ id bigint generated by default as identity primary key,
+ type partner_type not null,
+ company text not null,
+ country text not null,
+ details text,
+ email text not null unique,
+ first text not null,
+ last text not null,
+ phone text,
+ size int,
+ title text,
+ website text not null,
+ created_at timestamp with time zone default timezone('utc'::text, now()) not null
+);
+alter table partner_contacts enable row level security;
+
+create policy "Enable public insert" on partner_contacts for insert with check (true);
+
+
+create table partners (
+ id bigint generated by default as identity primary key,
+ slug text not null unique,
+ type partner_type not null,
+ category text not null,
+ developer text not null,
+ title text not null,
+ description text not null,
+ logo text not null,
+ images text[],
+ overview text not null,
+ website text not null,
+ docs text not null,
+ contact bigint references partner_contacts not null,
+ approved boolean default false,
+ created_at timestamp with time zone default timezone('utc'::text, now()) not null,
+ tsv tsvector generated always as (
+ setweight(to_tsvector('english', title), 'A')
+ || setweight(to_tsvector('english', description), 'B')
+ || setweight(to_tsvector('english', overview), 'C')
+ || setweight(to_tsvector('english', category), 'D')
+ || setweight(to_tsvector('english', slug), 'D')
+ ) stored;
+);
+alter table partners enable row level security;
+
+create policy "Enable public read access" on partners for select using (true);
+
+
+create table enterprise_contacts (
+ id bigint generated by default as identity primary key,
+ created_at timestamp with time zone default timezone('utc'::text, now()) not null,
+ company_name text not null,
+ contact_name text not null,
+ contact_email text not null,
+ contact_phone text,
+ company_size text,
+ details text,
+ country text
+);
+alter table enterprise_contacts enable row level security;
+
+create policy "Enable public insert" on enterprise_contacts for insert with check (true);
+
diff --git a/www/styles/index.css b/www/styles/index.css
new file mode 100644
index 00000000000..8947bb54816
--- /dev/null
+++ b/www/styles/index.css
@@ -0,0 +1,225 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@font-face {
+ font-family: 'custom-font';
+ src: url(/fonts/custom/CustomFont-Book.woff2) format('woff2'),
+ url(/fonts/custom/CustomFont-Book.woff) format('woff');
+ font-weight: 400;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'custom-font';
+ src: url(/fonts/custom/CustomFont-Medium.woff2) format('woff2'),
+ url(/fonts/custom/CustomFont-Medium.woff) format('woff');
+ font-weight: 500;
+ font-style: normal;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ @apply bg-scale-200;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+/* h1,
+h2,
+h3,
+h4,
+h5,
+h6 { */
+/*
+ Typography
+*/
+
+.h1:not(.prose *):not(.overwrite),
+.h2:not(.prose *):not(.overwrite),
+.h3:not(.prose *):not(.overwrite),
+.h4:not(.prose *):not(.overwrite),
+.h5:not(.prose *):not(.overwrite),
+.h6:not(.prose *):not(.overwrite) {
+ @apply text-scale-1200;
+ margin-bottom: 16px;
+}
+
+.h1:not(.prose *):not(.overwrite) {
+ @apply text-4xl;
+}
+
+.h2:not(.prose *):not(.overwrite) {
+ @apply text-3xl;
+}
+
+.h3:not(.prose *):not(.overwrite) {
+ @apply text-2xl;
+}
+
+.h4:not(.prose *):not(.overwrite) {
+ @apply text-xl;
+}
+
+.h5:not(.prose *):not(.overwrite) {
+ @apply text-xl;
+}
+
+.h1:not(.prose *):not(.overwrite),
+.h2:not(.prose *):not(.overwrite) {
+ line-height: 1.2 !important;
+}
+
+@media only screen and (max-width: 960px) {
+ .h1:not(.prose *):not(.overwrite) {
+ font-size: 2.2rem !important;
+ }
+ .h2:not(.prose *):not(.overwrite) {
+ font-size: 2rem !important;
+ }
+}
+
+@media only screen and (max-width: 720px) {
+ .h1:not(.prose *):not(.overwrite) {
+ font-size: 2rem !important;
+ }
+ .h2:not(.prose *):not(.overwrite) {
+ font-size: 1.8rem !important;
+ }
+}
+
+@media only screen and (max-width: 520px) {
+ .h1:not(.prose *):not(.overwrite) {
+ font-size: 1.8rem !important;
+ }
+ .h2:not(.prose *):not(.overwrite) {
+ font-size: 1.6rem !important;
+ }
+}
+
+.p:not(.prose *):not(.overwrite) {
+ @apply text-scale-1100;
+ margin-bottom: 16px;
+}
+
+.small:not(.prose *):not(.overwrite) {
+ @apply text-xs text-scale-900;
+}
+
+.sbui-border-fix select {
+ @apply border-solid;
+ border-width: 1px;
+}
+
+.section--masked {
+ /* overflow: hidden; */
+}
+
+::selection {
+ background-color: #6ee7b7;
+ color: #333 !important;
+}
+
+.section--bg-masked {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ /* overflow: visible; */
+}
+
+.section--bg {
+ @apply bg-scale-100 dark:bg-scale-200;
+ position: relative;
+ height: 100%;
+ width: 100%;
+ top: 0;
+ left: 0;
+ transform-origin: 100% 0;
+ transform: skewY(-2deg);
+ overflow: hidden;
+ /* transform-origin: var(--sectionTransformOrigin);
+ transform: skewY(var(--sectionAngle));
+ background: var(--backgroundColor);
+ overflow:
+ hidden; */
+}
+
+.section-container {
+ position: relative;
+ /* z-index: 1; */
+ /* display: flex;
+ justify-content: center; */
+}
+
+/* Database page */
+
+.dashboard-tabs div[role='seperator'] {
+ @apply border border-gray-50 dark:border-gray-700;
+}
+
+/* a {
+ @apply hover:text-black dark:hover:text-white;
+} */
+
+.sbui-tabs--alt div[role='tablist'] .sbui-btn-primary {
+ @apply text-white bg-gray-800 dark:bg-scale-300 dark:text-white;
+ text-shadow: none;
+ font-weight: 400;
+}
+.sbui-tabs--alt div[role='tablist'] .sbui-btn-text {
+ @apply dark:text-gray-400;
+ font-weight: 400;
+ shadow: none;
+}
+
+.sbui-tabs--underline-alt div[role='tablist'] .sbui-tab-button-underline--active {
+ @apply border-gray-900 dark:border-white;
+}
+/* override position of tabs */
+.dashboard-tabs > div > div {
+ justify-content: center;
+}
+
+/* Auth page */
+
+/* .auth-container > div:nth-child(2) {
+ width: 420px;
+} */
+
+.auth-container {
+ @apply rounded;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23edebf0' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
+}
+
+.dark .auth-container {
+ background-color: #181818;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23313131' fill-opacity='0.4'%3E%3Cpath opacity='.5' d='M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z'/%3E%3Cpath d='M6 5V0H5v5H0v1h5v94h1V6h94V5H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
+}
+
+.dark .header--light {
+ display: none;
+}
+
+.header--dark {
+ display: none;
+}
+
+.dark .header--dark {
+ display: block;
+}
+
+table {
+ margin-top: 1em;
+ border-collapse: collapse;
+}
+
+.sbui-typography-container thead {
+ @apply text-gray-500 dark:text-gray-200;
+}
+
+.sbui-typography a {
+ @apply break-words;
+}
diff --git a/www/supabase/config.toml b/www/supabase/config.toml
new file mode 100644
index 00000000000..cc86c099e31
--- /dev/null
+++ b/www/supabase/config.toml
@@ -0,0 +1,60 @@
+# A string used to distinguish different Supabase projects on the same host. Defaults to the working
+# directory name when running `supabase init`.
+project_id = "obuldanrptloktxcffvn"
+
+[api]
+# Port to use for the API URL.
+port = 54321
+# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API
+# endpoints. public and storage are always included.
+schemas = []
+# Extra schemas to add to the search_path of every request.
+extra_search_path = ["extensions"]
+# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size
+# for accidental or malicious requests.
+max_rows = 1000
+
+[db]
+# Port to use for the local database URL.
+port = 54322
+# The database major version to use. This has to be the same as your remote database's. Run `SHOW
+# server_version;` on the remote database to check.
+major_version = 14
+
+[studio]
+# Port to use for Supabase Studio.
+port = 54323
+
+# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they
+# are monitored, and you can view the emails that would have been sent from the web interface.
+[inbucket]
+# Port to use for the email testing server web interface.
+port = 54324
+
+[auth]
+# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used
+# in emails.
+site_url = "http://localhost:3000"
+# A list of *exact* URLs that auth providers are permitted to redirect to post authentication.
+additional_redirect_urls = ["https://localhost:3000"]
+# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 seconds (one
+# week).
+jwt_expiry = 3600
+# Allow/disallow new user signups to your project.
+enable_signup = true
+
+[auth.email]
+# Allow/disallow new user signups via email to your project.
+enable_signup = true
+# If enabled, a user will be required to confirm any email change on both the old, and new email
+# addresses. If disabled, only the new email is required to confirm.
+double_confirm_changes = true
+# If enabled, users need to confirm their email address before signing in.
+enable_confirmations = true
+
+# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`,
+# `discord`, `facebook`, `github`, `gitlab`, `google`, `twitch`, `twitter`, `slack`, `spotify`.
+[auth.external.apple]
+enabled = false
+client_id = ""
+secret = ""
diff --git a/www/supabase/functions/contact-notification/index.ts b/www/supabase/functions/contact-notification/index.ts
new file mode 100644
index 00000000000..4c2463496de
--- /dev/null
+++ b/www/supabase/functions/contact-notification/index.ts
@@ -0,0 +1,62 @@
+import { serve } from 'https://deno.land/std@0.131.0/http/server.ts'
+import { SmtpClient } from 'https://deno.land/x/denomailer@0.12.0/mod.ts'
+
+const smtp = new SmtpClient()
+
+serve(async (req) => {
+ await smtp.connect({
+ hostname: Deno.env.get('SMTP_HOSTNAME')!,
+ port: Number(Deno.env.get('SMTP_PORT')!),
+ username: Deno.env.get('SMTP_USERNAME')!,
+ password: Deno.env.get('SMTP_PASSWORD')!,
+ })
+
+ const body = await req.json()
+
+ const functionSecret = Deno.env.get('FUNCTION_SECRET')
+ const requestSecret = req.headers.get('x-function-secret')
+
+ if (functionSecret !== requestSecret) {
+ return new Response('Unauthorized', { status: 401 })
+ }
+
+ const { table, record } = body
+
+ const content = Object.entries(record).reduce(
+ (acc, [key, value]) => acc + `${key}: ${value || 'NOT_PROVIDED'}\n`,
+ ''
+ )
+
+ let to = Deno.env.get('SMTP_FALLBACK_TO')!
+ let form = 'Unknown'
+
+ if (table === 'enterprise_contacts') {
+ to = Deno.env.get('SMTP_ENTERPRISE_TO')!
+ form = 'Enterprise'
+ } else if (table === 'partner_contacts') {
+ to = Deno.env.get('SMTP_PARTNER_TO')!
+ form = 'Partner'
+ }
+
+ try {
+ await smtp.send({
+ from: Deno.env.get('SMTP_FROM')!,
+ to,
+ subject: `New Contact Form Submission (${form})`,
+ content,
+ })
+ } catch (error: any) {
+ return new Response(error.message, { status: 500 })
+ }
+
+ await smtp.close()
+
+ return new Response(
+ JSON.stringify({
+ done: true,
+ }),
+ {
+ headers: { 'Content-Type': 'application/json' },
+ }
+ )
+})
diff --git a/www/tailwind.config.js b/www/tailwind.config.js
new file mode 100644
index 00000000000..88890fa292e
--- /dev/null
+++ b/www/tailwind.config.js
@@ -0,0 +1,245 @@
+const ui = require('./ui.config.js')
+const svgToDataUri = require('mini-svg-data-uri')
+
+module.exports = ui({
+ mode: 'JIT',
+ content: [
+ './components/**/*.tsx',
+ './pages/**/*.tsx',
+ './_blog/*.mdx',
+ // purge styles from supabase ui theme
+ './node_modules/@supabase/ui/dist/config/default-theme.js',
+ ],
+ darkMode: 'class', // 'media' or 'class'
+ // mode: 'jit',
+ theme: {
+ borderColor: (theme) => ({
+ ...theme('colors'),
+ DEFAULT: theme('colors.scale.300', 'currentColor'),
+ dark: theme('colors.scale.1200', 'currentColor'),
+ }),
+ divideColor: (theme) => ({
+ ...theme('colors'),
+ DEFAULT: theme('colors.scale.300', 'currentColor'),
+ dark: theme('colors.scale.600', 'currentColor'),
+ }),
+ extend: {
+ typography: ({ theme }) => ({
+ // Removal of backticks in code blocks for tailwind v3.0
+ // https://github.com/tailwindlabs/tailwindcss-typography/issues/135
+ DEFAULT: {
+ css: {
+ 'code::before': {
+ content: '""',
+ },
+ 'code::after': {
+ content: '""',
+ },
+ '--tw-prose-body': theme('colors.scale[1100]'),
+ '--tw-prose-headings': theme('colors.scale[1200]'),
+ '--tw-prose-lead': theme('colors.scale[1100]'),
+ '--tw-prose-links': theme('colors.brand[900]'),
+ '--tw-prose-bold': theme('colors.scale[1100]'),
+ '--tw-prose-counters': theme('colors.scale[1100]'),
+ '--tw-prose-bullets': theme('colors.scale[900]'),
+ '--tw-prose-hr': theme('colors.scale[500]'),
+ '--tw-prose-quotes': theme('colors.scale[1100]'),
+ '--tw-prose-quote-borders': theme('colors.scale[500]'),
+ '--tw-prose-captions': theme('colors.scale[700]'),
+ '--tw-prose-code': theme('colors.scale[1200]'),
+ '--tw-prose-pre-code': theme('colors.scale[900]'),
+ '--tw-prose-pre-bg': theme('colors.scale[400]'),
+ '--tw-prose-th-borders': theme('colors.scale[500]'),
+ '--tw-prose-td-borders': theme('colors.scale[200]'),
+ '--tw-prose-invert-body': theme('colors.scale[200]'),
+ '--tw-prose-invert-headings': theme('colors.white'),
+ '--tw-prose-invert-lead': theme('colors.scale[500]'),
+ '--tw-prose-invert-links': theme('colors.white'),
+ '--tw-prose-invert-bold': theme('colors.white'),
+ '--tw-prose-invert-counters': theme('colors.scale[400]'),
+ '--tw-prose-invert-bullets': theme('colors.scale[600]'),
+ '--tw-prose-invert-hr': theme('colors.scale[700]'),
+ '--tw-prose-invert-quotes': theme('colors.scale[100]'),
+ '--tw-prose-invert-quote-borders': theme('colors.scale[700]'),
+ '--tw-prose-invert-captions': theme('colors.scale[400]'),
+ // the following are typography overrides
+ // examples can be seen here —> https://github.com/tailwindlabs/tailwindcss-typography/blob/master/src/styles.js
+ // reset all header font weights
+ 'h1, h2, h3, h4, h5': {
+ fontWeight: '400',
+ },
+ h2: {
+ fontWeight: '400',
+ },
+ p: {
+ fontWeight: '400',
+ },
+ a: {
+ fontWeight: '400',
+ },
+ pre: {
+ background: 'none',
+ padding: 0,
+ marginBottom: '32px',
+ },
+ 'p img': {
+ border: '1px solid var(--colors-scale4)',
+ borderRadius: '4px',
+ overflow: 'hidden',
+ },
+ },
+ },
+
+ toc: {
+ css: {
+ ul: {
+ 'list-style-type': 'none',
+ 'padding-left': 0,
+ margin: 0,
+ li: {
+ 'padding-left': 0,
+ },
+ a: {
+ display: 'block',
+ 'text-decoration': 'none',
+ fontSize: '0.8rem',
+ fontWeight: '200',
+ color: theme('colors.scale[1100]'),
+ '&:hover': {
+ color: theme('colors.scale[1200]'),
+ },
+ 'font-weight': '400',
+ },
+ // margin: 0,
+ ul: {
+ 'list-style-type': 'none',
+ li: {
+ marginTop: '0.2rem',
+ marginBottom: '0.2rem',
+ 'padding-left': '0 !important',
+ 'margin-left': '0.5rem',
+ },
+ a: {
+ fontWeight: '200',
+ color: theme('colors.scale[1000]'),
+ '&:hover': {
+ color: theme('colors.scale[1200]'),
+ },
+ },
+ },
+ },
+ },
+ },
+ }),
+ // screens: {
+ // sm: '640px',
+ // // => @media (min-width: 640px) { ... }
+ // md: '768px',
+ // // => @media (min-width: 768px) { ... }
+ // lg: '1024px',
+ // // => @media (min-width: 1024px) { ... }
+ // xl: '1280px',
+ // // => @media (min-width: 1280px) { ... }
+ // '2xl': '1536px',
+ // // => @media (min-width: 1536px) { ... }
+ // },
+ // colors: {
+ // 'gray-light': '#7B7F86',
+ // 'gray-dark': '#7B7F86',
+ // 'accent-1': '#FAFAFA',
+ // 'accent-2': '#EAEAEA',
+ // 'accent-7': '#333',
+ // success: '#0070f3',
+ // cyan: '#79FFE1',
+ // // brand: {
+ // // 100: '#82dab0',
+ // // 200: '#69d3a0',
+ // // 300: '#50cb90',
+ // // 400: '#C5F1DD',
+ // // 500: '#9FE7C7',
+ // // 600: '#65D9A5',
+ // // 700: '#3ECF8E',
+ // // 800: '#38BC81',
+ // // 900: '#10633E',
+ // // },
+ // // Joshen TODO: At the end just rearrange the values
+ // dark: {
+ // 100: '#eeeeee',
+ // 200: '#e0e0e0',
+ // 300: '#bbbbbb',
+ // 400: '#666666',
+ // 500: '#444444',
+ // 600: '#2a2a2a',
+ // 700: '#1f1f1f',
+ // 800: '#181818',
+ // 900: '#0f0f0f',
+ // },
+ // // gray: {
+ // // 100: '#eeeeee',
+ // // 200: '#e0e0e0',
+ // // 300: '#bbbbbb',
+ // // 400: '#666666',
+ // // 500: '#444444',
+ // // 600: '#2a2a2a',
+ // // 700: '#1f1f1f',
+ // // 800: '#181818',
+ // // 900: '#0f0f0f',
+ // // },
+ // },
+ // spacing: {
+ // 28: '7rem',
+ // },
+ // letterSpacing: {
+ // tighter: '-.04em',
+ // },
+ // lineHeight: {
+ // tight: 1.2,
+ // },
+ // fontSize: {
+ // '5xl': '2.5rem',
+ // '6xl': '2.75rem',
+ // '7xl': '4.5rem',
+ // '8xl': '6.25rem',
+ // },
+ // boxShadow: {
+ // 'light-small': '0px 4px 8px 2px rgba(107, 114, 128, 0.08)',
+ // small: '0 5px 10px rgba(0, 0, 0, 0.12)',
+ // medium: '0 8px 30px rgba(0, 0, 0, 0.12)',
+ // override: '0px 0px 0px rgba(0, 0, 0, 0)',
+ // },
+ fontFamily: {
+ sans: ['custom-font', 'Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif'],
+ mono: ['Source Code Pro', 'Menlo', 'monospace'],
+ },
+ // stroke: (theme) => ({
+ // white: theme('colors.white'),
+ // black: theme('colors.black'),
+ // }),
+ backgroundImage: (theme) => ({
+ squiggle: `url("${svgToDataUri(
+ ` `
+ )}")`,
+ }),
+ keyframes: {
+ 'flash-code': {
+ '0%': { backgroundColor: 'rgba(63, 207, 142, 0.1)' },
+ '100%': { backgroundColor: 'transparent' },
+ },
+ },
+ animation: {
+ 'flash-code': 'flash-code 1s forwards',
+ 'flash-code-slow': 'flash-code 2s forwards',
+ },
+ },
+ },
+ // variants: {
+ // extend: {
+ // inset: ['group-hover'],
+ // stroke: ['dark'],
+ // height: ['hover'],
+ // },
+ // },
+ plugins: [require('@tailwindcss/typography')],
+})
diff --git a/www/tsconfig.json b/www/tsconfig.json
new file mode 100644
index 00000000000..3c0beb80aa4
--- /dev/null
+++ b/www/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "~/*": ["./*"]
+ },
+ "target": "es5",
+ "module": "esnext",
+ "jsx": "preserve",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "noEmit": true,
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "incremental": true
+ },
+ "exclude": ["node_modules", "supabase"],
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"]
+}
diff --git a/www/types/author.ts b/www/types/author.ts
new file mode 100644
index 00000000000..1433a84b3f8
--- /dev/null
+++ b/www/types/author.ts
@@ -0,0 +1,9 @@
+type Author = {
+ author_id: string
+ author: string
+ position: string
+ author_url: string
+ author_image_url: string
+}
+
+export default Author
diff --git a/www/types/partners.ts b/www/types/partners.ts
new file mode 100644
index 00000000000..812f4439f66
--- /dev/null
+++ b/www/types/partners.ts
@@ -0,0 +1,29 @@
+export interface Partner {
+ id: number
+ slug: string
+ type: 'technology' | 'expert'
+ category: string
+ developer: string
+ title: string
+ description: string
+ logo: string
+ images: string[]
+ overview: string
+ website: string
+ docs: string
+ approved: boolean
+}
+
+export interface PartnerContact {
+ type: 'technology' | 'expert'
+ company: string
+ country: string
+ details?: string
+ email: string
+ first: string
+ last: string
+ phone?: string
+ size?: number
+ title?: string
+ website: string
+}
diff --git a/www/types/post.ts b/www/types/post.ts
new file mode 100644
index 00000000000..05630758e1e
--- /dev/null
+++ b/www/types/post.ts
@@ -0,0 +1,25 @@
+import Author from './author'
+
+type PostTypes = {
+ slug?: string
+ type: 'casestudy' | 'blog'
+ title: string
+ date?: string
+ coverImage?: string
+ author?: string
+ excerpt?: string
+ ogImage?: {
+ url: string
+ }
+ content?: string
+ thumb: string
+ image?: string
+ readingTime?: string
+ description: string
+ url: string
+ tags?: []
+ logo?: string
+ hideAuthor?: boolean
+}
+
+export default PostTypes
diff --git a/www/ui.config.js b/www/ui.config.js
new file mode 100644
index 00000000000..472587b392a
--- /dev/null
+++ b/www/ui.config.js
@@ -0,0 +1,375 @@
+const deepMerge = require('deepmerge')
+const forms = require('@tailwindcss/forms')
+const plugin = require('tailwindcss/plugin')
+const radixUiColors = require('@radix-ui/colors')
+const brandColors = require('./default-colors')
+
+const { default: flattenColorPalette } = require('tailwindcss/lib/util/flattenColorPalette')
+
+// console.log(Object.keys(radixUiColors))
+
+// generates fixed scales
+// based on the root/light mode version
+const fixedOptions = ['scale', 'scaleA', 'brand']
+
+function radixColorKeys() {
+ let keys = Object.keys(radixUiColors)
+
+ /**
+ * Filter array items based on search criteria (query)
+ */
+ function filterItems(arr, query) {
+ return arr.filter(function (el) {
+ return el.toLowerCase().indexOf(query.toLowerCase()) == -1
+ })
+ }
+
+ keys = filterItems(keys, 'Dark')
+
+ // console.log('radixColorKeys', keys)
+ return keys
+}
+
+function generateColorClasses() {
+ const brandColors = ['brand', 'scale', 'scaleA']
+ const colors = [...radixColorKeys(), ...brandColors]
+
+ let mappedColors = {}
+
+ // generate the shape of the colors object
+ colors.map((x) => {
+ // create empty obj for each color
+ mappedColors[x] = {}
+ // create empty obj for each fixed color
+ if (
+ fixedOptions.some(function (v) {
+ return x.indexOf(v) >= 0
+ })
+ ) {
+ mappedColors[`${x}-fixed`] = {}
+ }
+ })
+
+ colors.map((x) => {
+ for (let index = 0; index < 12; index++) {
+ const step = index + 1
+ mappedColors[x][step * 100] = `var(--colors-${x.toLowerCase()}${step})`
+
+ if (
+ fixedOptions.some(function (v) {
+ return x.indexOf(v) >= 0
+ })
+ ) {
+ // console.log(x)
+ mappedColors[`${x}-fixed`][step * 100] = `var(--colors-fixed-${x}${step})`
+ }
+ }
+ })
+
+ return mappedColors
+}
+
+const colorClasses = generateColorClasses()
+
+/*
+ * generateCssVariables()
+ *
+ * generate the CSS variables for tailwind to use
+ *
+ */
+
+function generateCssVariables() {
+ // potential options
+ // { fixedOptions, brandColors }
+
+ let rootColors = {}
+ let darkColors = {}
+
+ const radixArray = Object.values(radixUiColors)
+ const brandArray = Object.values(brandColors)
+
+ function generateColors(colors, index, colorSet) {
+ const key = Object.keys(colorSet)[index]
+
+ if (key.includes('Dark')) {
+ darkColors = { ...darkColors, ...colors }
+ } else {
+ rootColors = { ...rootColors, ...colors }
+
+ // generate an optional 'fixed' scale of colors
+ if (
+ fixedOptions.some(function (v) {
+ return key.indexOf(v) >= 0
+ })
+ ) {
+ rootColors.fixed = { ...rootColors?.fixed, ...colors }
+ }
+ }
+ }
+
+ radixArray.map((x, i) => {
+ generateColors(x, i, radixUiColors)
+ })
+
+ brandArray.map((x, i) => {
+ generateColors(x, i, brandColors)
+ })
+
+ return {
+ root: { ...rootColors },
+ dark: { ...darkColors },
+ }
+}
+
+const variables = generateCssVariables()
+
+// console.log(variables)
+
+const uiConfig = {
+ theme: {
+ variables: {
+ DEFAULT: {
+ width: {
+ listbox: '320px',
+ },
+ colors: { ...variables.root },
+ },
+ '.dark': {
+ colors: { ...variables.dark },
+ },
+ },
+ extend: {
+ // dropdown extensions
+ transformOrigin: {
+ // tailwind class for this is `origin-dropdown`
+ dropdown: 'var(--radix-dropdown-menu-content-transform-origin)',
+ popover: 'var(--radix-popover-menu-content-transform-origin);',
+ },
+ width: {
+ listbox: 'var(--width-listbox);',
+ },
+ keyframes: {
+ fadeIn: {
+ '0%': { transform: 'scale(0.95)', opacity: 0 },
+ '100%': { transform: 'scale(1)', opacity: 1 },
+ },
+ fadeOut: {
+ '0%': { transform: 'scale(1)', opacity: 1 },
+ '100%': { transform: 'scale(0.95)', opacity: 0 },
+ },
+ overlayContentShow: {
+ '0%': { opacity: 0, transform: 'translate(0%, -2%) scale(.96)' },
+ '100%': { opacity: 1, transform: 'translate(0%, 0%) scale(1)' },
+ },
+ overlayContentHide: {
+ '0%': { opacity: 1, transform: 'translate(0%, 0%) scale(1)' },
+ '100%': { opacity: 0, transform: 'translate(0%, -2%) scale(.96)' },
+ },
+ dropdownFadeIn: {
+ '0%': { transform: 'scale(0.95)', opacity: 0 },
+ '100%': { transform: 'scale(1)', opacity: 1 },
+ },
+ dropdownFadeOut: {
+ '0%': { transform: 'scale(1)', opacity: 1 },
+ '100%': { transform: 'scale(0.95)', opacity: 0 },
+ },
+ fadeInOverlayBg: {
+ '0%': { opacity: 0 },
+ '100%': { opacity: 0.75 },
+ },
+ fadeOutOverlayBg: {
+ '0%': { opacity: 0.75 },
+ '100%': { opacity: 0 },
+ },
+ slideDown: {
+ '0%': { height: 0, opacity: 0 },
+ '100%': {
+ height: 'var(--radix-accordion-content-height)',
+ opacity: 1,
+ },
+ },
+ slideUp: {
+ '0%': { height: 'var(--radix-accordion-content-height)', opacity: 1 },
+ '100%': { height: 0, opacity: 0 },
+ },
+
+ slideDownNormal: {
+ '0%': { height: 0, opacity: 0 },
+ '100%': {
+ height: 'inherit',
+ opacity: 1,
+ },
+ },
+ slideUpNormal: {
+ '0%': { height: 'inherit', opacity: 1 },
+ '100%': { height: 0, opacity: 0 },
+ },
+
+ panelSlideLeftOut: {
+ '0%': { transform: 'translateX(-100%)', opacity: 0 },
+ '100%': {
+ transform: 'translate-x-0',
+ opacity: 1,
+ },
+ },
+ panelSlideLeftIn: {
+ '0%': { transform: 'translate-x-0', opacity: 1 },
+ '100%': { transform: 'translateX(-100%)', opacity: 0 },
+ },
+ panelSlideRightOut: {
+ '0%': { transform: 'translateX(100%)', opacity: 0 },
+ '100%': {
+ transform: 'translate-x-0',
+ opacity: 1,
+ },
+ },
+ panelSlideRightIn: {
+ '0%': { transform: 'translate-x-0', opacity: 1 },
+ '100%': { transform: 'translateX(100%)', opacity: 0 },
+ },
+ },
+ animation: {
+ 'fade-in': 'fadeIn 300ms',
+ 'fade-out': 'fadeOut 300ms',
+
+ 'dropdown-content-show': 'overlayContentShow 100ms cubic-bezier(0.16, 1, 0.3, 1)',
+ 'dropdown-content-hide': 'overlayContentHide 100ms cubic-bezier(0.16, 1, 0.3, 1)',
+
+ 'overlay-show': 'overlayContentShow 300ms cubic-bezier(0.16, 1, 0.3, 1)',
+ 'overlay-hide': 'overlayContentHide 300ms cubic-bezier(0.16, 1, 0.3, 1)',
+
+ 'fade-in-overlay-bg': 'fadeInOverlayBg 300ms',
+ 'fade-out-overlay-bg': 'fadeOutOverlayBg 300ms',
+
+ 'slide-down': 'slideDown 300ms cubic-bezier(0.87, 0, 0.13, 1)',
+ 'slide-up': 'slideUp 300ms cubic-bezier(0.87, 0, 0.13, 1)',
+
+ 'slide-down-normal': 'slideDownNormal 300ms cubic-bezier(0.87, 0, 0.13, 1)',
+ 'slide-up-normal': 'slideUpNormal 300ms cubic-bezier(0.87, 0, 0.13, 1)',
+
+ 'panel-slide-left-out': 'panelSlideLeftOut 200ms cubic-bezier(0.87, 0, 0.13, 1)',
+ 'panel-slide-left-in': 'panelSlideLeftIn 250ms cubic-bezier(0.87, 0, 0.13, 1)',
+ 'panel-slide-right-out': 'panelSlideRightOut 200ms cubic-bezier(0.87, 0, 0.13, 1)',
+ 'panel-slide-right-in': 'panelSlideRightIn 250ms cubic-bezier(0.87, 0, 0.13, 1)',
+
+ // tailwind class for this is `animate-dropdownFadeIn`
+ dropdownFadeIn: 'dropdownFadeIn 0.1s ease-out',
+ // tailwind class for this is `animate-dropdownFadeOut`
+ dropdownFadeOut: 'dropdownFadeOut 0.1s ease-out',
+ },
+ colors: {
+ ...colorClasses,
+ 'hi-contrast': `var(--colors-fixed-scale12)`,
+ 'lo-contrast': `var(--colors-fixed-scale1)`,
+ },
+ },
+ },
+ plugins: [
+ require('@mertasan/tailwindcss-variables'),
+ function ({ addUtilities, addVariant }) {
+ // addVariant('data-open', '&:[data-state=open]')
+ addUtilities({
+ ".dropdown-content[data-state='open']": {
+ animation: 'fadeIn 50ms ease-out',
+ },
+ ".dropdown-content[data-state='closed']": {
+ animation: 'fadeOut 50ms ease-in',
+ },
+
+ "[data-state='open'] .accordion-content-animation": {
+ animation: 'slideDown 200ms ease-out',
+ },
+ "[data-state='closed'] .accordion-content-animation": {
+ animation: 'slideUp 200ms ease-in',
+ },
+ '.text-code': {
+ margin: '0 0.2em',
+ padding: '0.2em 0.4em 0.1em',
+ background: 'hsla(0, 0%, 58.8%, 0.1)',
+ border: '1px solid hsla(0, 0%, 39.2%, 0.2)',
+ borderRadius: '3px',
+ },
+ })
+ addVariant('data-open-parent', '[data-state="open"] &')
+ addVariant('data-closed-parent', '[data-state="closed"] &')
+ addVariant('data-open', '&[data-state="open"]')
+ addVariant('data-closed', '&[data-state="closed"]')
+ addVariant('data-show', '&[data-state="show"]')
+ addVariant('data-hide', '&[data-state="hide"]')
+ addVariant('data-checked', '&[data-state="checked"]')
+ addVariant('data-unchecked', '&[data-state="unchecked"]')
+ addVariant('aria-expanded', '&[aria-expanded="true"]')
+ // addVariant('parent-data-open', '[data-state="open"]&')
+ },
+ function ({ matchUtilities, theme }) {
+ matchUtilities(
+ {
+ highlight: (value) => ({ boxShadow: `inset 0 1px 0 0 ${value}` }),
+ },
+ { values: flattenColorPalette(theme('backgroundColor')), type: 'color' }
+ ),
+ matchUtilities(
+ {
+ subhighlight: (value) => ({
+ boxShadow: `inset 0 -1px 0 0 ${value}`,
+ }),
+ },
+ {
+ values: flattenColorPalette(theme('backgroundColor')),
+ type: 'color',
+ }
+ ),
+ matchUtilities(
+ {
+ bordershadow: (value) => {
+ return {
+ boxShadow: `
+ var(--colors-blacka1) 0px 0px 0px 0px,
+ var(--colors-blacka1) 0px 0px 0px 0px,
+ var(--colors-blacka8) 0px 1px 1px 0px,
+ ${value} 0px 0px 0px 1px,
+ var(--colors-blacka1) 0px 0px 0px 0px,
+ var(--colors-blacka1) 0px 0px 0px 0px,
+ rgb(64 68 82 / 8%) 0px 2px 5px 0px;
+ `,
+ }
+ },
+ },
+ {
+ values: flattenColorPalette(theme('backgroundColor')),
+ type: 'color',
+ }
+ )
+ },
+ require('tailwindcss-radix')(),
+ forms,
+ ],
+}
+
+function arrayMergeFn(destinationArray, sourceArray) {
+ return destinationArray.concat(sourceArray).reduce((acc, cur) => {
+ if (acc.includes(cur)) return acc
+ return [...acc, cur]
+ }, [])
+}
+
+/**
+ * Merge Supabase UI and Tailwind CSS configurations
+ * @param {object} tailwindConfig - Tailwind config object
+ * @return {object} new config object
+ */
+function wrapper(tailwindConfig) {
+ let purge
+ if (Array.isArray(tailwindConfig.purge)) {
+ purge = {
+ content: tailwindConfig.purge,
+ }
+ } else {
+ purge = tailwindConfig.purge
+ }
+ return deepMerge({ ...tailwindConfig, purge }, uiConfig, {
+ arrayMerge: arrayMergeFn,
+ })
+}
+
+module.exports = wrapper
diff --git a/www/webpack.config.js b/www/webpack.config.js
new file mode 100644
index 00000000000..a25fedf2d23
--- /dev/null
+++ b/www/webpack.config.js
@@ -0,0 +1,14 @@
+module.exports = {
+ module: {
+ rules: [
+ {
+ test: /\.(png|jpe?g|gif)$/i,
+ use: [
+ {
+ loader: 'file-loader',
+ },
+ ],
+ },
+ ],
+ },
+}