diff --git a/.github/workflows/hubs-docs.yaml b/.github/workflows/hubs-docs.yaml new file mode 100644 index 0000000..fe4636c --- /dev/null +++ b/.github/workflows/hubs-docs.yaml @@ -0,0 +1,14 @@ +name: hubs-docs +on: + push: + branches: + paths-ignore: ["README.md"] + workflow_dispatch: + +jobs: + turkeyGitops: + uses: mozilla/hubs-ops/.github/workflows/turkeyGitops.yml@master + with: + registry: mozillareality + secrets: + DOCKER_HUB_PWD: ${{ secrets.DOCKER_HUB_PWD }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e6e9ac4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c6c2c2 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/blog/2019-05-28-first-blog-post.md b/blog/2019-05-28-first-blog-post.md new file mode 100644 index 0000000..02f3f81 --- /dev/null +++ b/blog/2019-05-28-first-blog-post.md @@ -0,0 +1,12 @@ +--- +slug: first-blog-post +title: First Blog Post +authors: + name: Gao Wei + title: Docusaurus Core Team + url: https://github.com/wgao19 + image_url: https://github.com/wgao19.png +tags: [hola, docusaurus] +--- + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/blog/2019-05-29-long-blog-post.md b/blog/2019-05-29-long-blog-post.md new file mode 100644 index 0000000..26ffb1b --- /dev/null +++ b/blog/2019-05-29-long-blog-post.md @@ -0,0 +1,44 @@ +--- +slug: long-blog-post +title: Long Blog Post +authors: endi +tags: [hello, docusaurus] +--- + +This is the summary of a very long blog post, + +Use a `` comment to limit blog post size in the list view. + + + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet diff --git a/blog/2021-08-01-mdx-blog-post.mdx b/blog/2021-08-01-mdx-blog-post.mdx new file mode 100644 index 0000000..c04ebe3 --- /dev/null +++ b/blog/2021-08-01-mdx-blog-post.mdx @@ -0,0 +1,20 @@ +--- +slug: mdx-blog-post +title: MDX Blog Post +authors: [slorber] +tags: [docusaurus] +--- + +Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/). + +:::tip + +Use the power of React to create interactive blog posts. + +```js + +``` + + + +::: diff --git a/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg new file mode 100644 index 0000000..11bda09 Binary files /dev/null and b/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg differ diff --git a/blog/2021-08-26-welcome/index.md b/blog/2021-08-26-welcome/index.md new file mode 100644 index 0000000..9455168 --- /dev/null +++ b/blog/2021-08-26-welcome/index.md @@ -0,0 +1,25 @@ +--- +slug: welcome +title: Welcome +authors: [slorber, yangshun] +tags: [facebook, hello, docusaurus] +--- + +[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog). + +Simply add Markdown files (or folders) to the `blog` directory. + +Regular blog authors can be added to `authors.yml`. + +The blog post date can be extracted from filenames, such as: + +- `2019-05-30-welcome.md` +- `2019-05-30-welcome/index.md` + +A blog post folder can be convenient to co-locate blog post images: + +![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg) + +The blog supports tags as well! + +**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config. diff --git a/blog/authors.yml b/blog/authors.yml new file mode 100644 index 0000000..bcb2991 --- /dev/null +++ b/blog/authors.yml @@ -0,0 +1,17 @@ +endi: + name: Endilie Yacop Sucipto + title: Maintainer of Docusaurus + url: https://github.com/endiliey + image_url: https://github.com/endiliey.png + +yangshun: + name: Yangshun Tay + title: Front End Engineer @ Facebook + url: https://github.com/yangshun + image_url: https://github.com/yangshun.png + +slorber: + name: Sébastien Lorber + title: Docusaurus maintainer + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png diff --git a/docs/archive/_category_.json b/docs/archive/_category_.json new file mode 100644 index 0000000..ac384a8 --- /dev/null +++ b/docs/archive/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Archive", + "position": 6, + "link": { + "type": "generated-index" + } +} diff --git a/docs/archive/discord-bot.md b/docs/archive/discord-bot.md new file mode 100644 index 0000000..87fb296 --- /dev/null +++ b/docs/archive/discord-bot.md @@ -0,0 +1,74 @@ +--- +sidebar_position: 1 +--- + +# Discord Bot (Deprecated) + +## About + +The [Hubs Discord Bot](https://hubs.mozilla.com/discord) makes it easy to connect Hubs rooms to your Discord chat server. When a Hubs room is associated with a Discord channel, users will be assigned abilities in the Hubs room based on their Discord roles. For example, Discord owners and moderators will be able to change settings on a Hubs room and be able to moderate users in the room. + +![Hubs Discord bot](/img/discord-bot.jpeg) + +## Features + +- Allows you to authenticate users joining your Hubs room. +- Saves a record of text chat and photos created in the Hubs room. +- Posts in the Discord channel when someone joins or leaves the Hubs room. + + + +## Set Up + +If your room is hosted on hubs.mozilla.com: + +1. [Click here](https://discordapp.com/oauth2/authorize?client_id=509129921826914304&permissions=536890368&scope=bot) to invite the Hubs Discord bot to your Discord server. +2. Choose the channel(s) you want Hubs to run in or create new one(s). +3. Give the bot appropriate permissions (see below) on these channels. +4. Create a webhook named "Hubs" in the channels you want it to run in. (Go to the channel's Settings-->Integrations) It will use this + webhook to bridge chat and send Hubs status updates. +5. Try out the bot! Type !hubs in a channel the bot is in to see some things you can do. + +Using Hubs Cloud? You can [add the bot to your Hubs Cloud server](./hubs-cloud-discord-bot.md). + +### User Permissions + +Your room's user permissions will inherit the permissions that their Discord role has in the channel that the bot is bound to. Specifically + +- To enter the room they must have "View Channel" permission +- To be a moderator they must have "Kick Members" permission (and "View Channel"). + - Moderators can kick and mute members in the hubs room. + - Moderators can also create and manipulate objects, draw and share video even if these are turned off in the room settings. + - Note: only discord users with verified emails can become moderators +- To be a room owner they must have "Manage Channels" (and "Kick Members and "View Channel") + - Room owners are able to change the name and scene in the room, modify other room settings, and close the room. + - Note: only discord users with verified emails can become room owners +- The discord permissions can set either via their discord role globally, or permissions given on the specific channel to that user/role + +### Bot Permissions + +The bot requires several permissions in order to work. + +- "Send messages," "Read messages," and "Embed links" are necessary in order to bridge between the Hubs room that is linked to a channel and the messages that are sent within the channel on Discord. +- "Manage webhooks" is necessary in order for the bot to find and use a webhook for bridging chat. +- "Manage channels" is necessary in order for the bot to set the channel topic and bridge chat. Note: We do not ask for this permission globally when you add the bot to your server, instead we recommend you grant this permission to the bot in specific groups or channels. + +### Commands + +The following features outline the current bot commands and how they can be accessed by users in the Discord server: + +🦆`!hubs` - Lists information about the currently linked room. + +🦆`!hubs create` - Creates a default Hubs room and puts its URL into the channel topic. Rooms created with `!hubs create` will inherit moderation permissions from this Discord channel and only allow Discord users in this channel to join the room. + +🦆`!hubs create [environment URL] [name]` - Creates a new room with the given environment and name, and puts its URL into the channel topic. Valid environment URLs include glTFs, GLBs, and Spoke scene pages. + +🦆`!hubs help` - Get information about how to use the Hubs bot. + +🦆`!hubs stats` - Shows some summary statistics about room usage. + +🦆`!hubs remove` - Removes the room URL from the topic and stops bridging the Discord channel with Hubs. + +🦆`!hubs notify set [datetime]` - Sets a one-time notification to notify @​here to join the room at some future time. + +🦆`!hubs notify clear` - Removes all pending notifications. diff --git a/docs/archive/hubs-cloud/_category_.json b/docs/archive/hubs-cloud/_category_.json new file mode 100644 index 0000000..515910c --- /dev/null +++ b/docs/archive/hubs-cloud/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Hubs Cloud (Deprecated)", + "position": 2, + "link": { + "type": "generated-index" + } +} diff --git a/docs/archive/hubs-cloud/adding-admins.md b/docs/archive/hubs-cloud/adding-admins.md new file mode 100644 index 0000000..c9f7d33 --- /dev/null +++ b/docs/archive/hubs-cloud/adding-admins.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 9 +--- + +# Adding Administrators + +Administrators for your hub have full access rights. They can: + +- Have access to the [Admin Console](./hubs-cloud-getting-started.md) to update system settings and app configuration. +- [Manage the content library](./hubs-cloud-managing-content.md) and [import content](./hubs-cloud-importing-content.md). +- Have access to the [Scene Editor](./spoke-creating-projects.md) to create and publish new scenes, regardless of settings. + +To assign other accounts administrative access, you need to get their account id and then assign administrator rights in the Admin Console. + +### Account ID Lookup + +Hubs Cloud does not store any personally identifying information in the database. To get another user's account ID to make them an administrator, you will need to have them follow these steps: + +- Log in to their account via the "Sign In" link on the homepage. +- Navigate to a room page, or create a new room. +- Open the developer tools for their browser. How-to for [Chrome](https://developers.google.com/web/tools/chrome-devtools) or [Firefox](https://developer.mozilla.org/en-US/docs/Tools). +- In the Console log, near the beginning, they'll need to look for a line that looks like `Logged into account XXXXXXXXXXXXXXX` where `XXXXXXXXXXXXXXX` is a series of numbers. This their account ID. +- It is safe for them to share their account ID, others who have their account ID will not gain access or visibility into their activity if they share it. + +### Granting Admin Access + +Once you have an account ID you'd like to grant access to, navigate to the **Accounts** section in the Admin Console: + +![Hubs Cloud Accounts](/img/hubs-cloud-accounts.jpeg) + +From there, enter the Account ID you would like to change to administrator under **Search ID** and then click Edit: + +![Hubs Cloud Find Account](/img/hubs-cloud-find-account.jpeg) + +Then set the account to **Is admin** and click **Save**: + +![Hubs Cloud Select Admin](/img/hubs-cloud-select-admin.jpeg) diff --git a/docs/archive/hubs-cloud/asset-packs.md b/docs/archive/hubs-cloud/asset-packs.md new file mode 100644 index 0000000..530ecad --- /dev/null +++ b/docs/archive/hubs-cloud/asset-packs.md @@ -0,0 +1,139 @@ +--- +sidebar_position: 5 +--- + +# Asset Packs + +We've compiled some avatar and scene collections you can easily import into your hub. This content is [Creative Commons 3](https://creativecommons.org/licenses/by/3.0/us/) licensed. License compliance with attribution is handled automatically by Hubs Cloud when the content is surfaced to users. + +To import these packs, simply specify the URL for the pack specified below in the [Import Content](./hubs-cloud-importing-content.md) tool in the [Admin Console](./hubs-cloud-getting-started.md). Once you input the URL you will be able to preview the contents of the pack and choose which items to import. + +## Avatar Packs + +**Animals** - A collection of cute stylized animal avatars. + +![Animals](/img/avatars_animals_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-animals.pack + +**Foods** - A collection of cute stylized food avatars. + +![Foods](/img/avatars_food_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-food.pack + +**Retro Tech** - A collection of webcam-enabled retro tech avatars. + +![Retro Tech](/img/avatars_retroTech_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-retroTech.pack + +**Color Astronauts** - A collection of webcam-enabled astronaut avatars in basic colors (light and dark versions). + +![Color Astronauts Light](/img/assetPacks_avatars_astronauts-light_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-astronauts-light.pack + +![Color Astronauts Dark](/img/assetPacks_avatars_astronauts-dark_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-astronauts-dark.pack + +**Color Robots** - A collection of robot avatars in basic colors. + +![Color Robots](/img/assetPacks_avatars_colorRobots_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/color-robots.pack + +**Clothed Robots** - - A collection of robot avatars that are wearing clothing. + +![Clothed Robots](/img/assetPacks_avatars_clothedRobots_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/clothed-robots.pack + +**Stylized Robots** - A collection of robot avatars that are stylized in abstract skins. + +![Stylized Robots](/img/assetPacks_avatars_stylizedRobots_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/stylized-robots.pack + +**Graduation Robots** - A collection of robot avatars in various color graduation robes. + +![Graduation Robots](/img/assetPacks_avatars_graduationRobots_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/graduation-robots.pack + +**Stylized Human Graduates** - A collection of stylized human avatars in black and blue graduation robes. + +![Stylized Human Graduates](/img/assetPacks_avatars_stylizedHumanGraduates_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/graduation-humans.pack + +**Box Bots** - A random collection of stylized box bot avatars. + +![Boxbot Variants](/img/assetPacks_avatars_boxbots_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/boxbot-variants.pack + +**Bobbleheads** - A random collection of stylized human "bobblehead" avatars. + +![Bobblehead Variants](/img/assetPacks_avatars_bobbleheads_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/bobblehead-variants.pack + +**Diverse Humans** - A collection of diverse human avatars. + +![Diverse Humans](/img/assetPacks_avatars_hackweek_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/hackweek-variants.pack + +**Telepresence Robots 1** - A collection of webcam-enabled telepresence robot avatars in various colors. + +![Telepresence Robots 1](/img/avatars_telepresenceRobot1_colors_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-telepresenceRobot1-colors.pack + +**Telepresence Robots 2** - A collection of webcam-enabled telepresence robot avatars in various colors. + +![Telepresence Robots 2](/img/avatars_telepresenceRobot2_colors_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-telepresenceRobot2-colors.pack + +**Telepresence Robots 3** - A collection of webcam-enabled telepresence robot avatars in various colors. + +![Telepresence Robots 3](/img/avatars_telepresenceRobot3_colors_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-telepresenceRobot3-colors.pack + +## Scene Packs + +**Meeting Scenes** - A collection of scenes that can be used for simple meetings. + +![Meeting Scenes](/img/assetPacks_scenes_meetingScenes_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/meeting-scenes.pack + +**Event Scenes** - A collection of scenes for hosting events in Hubs. + +![Event Scenes](/img/assetPacks_scenes_eventScenes_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/event-scenes.pack + +**Social Hangout Scenes** - A collection of scenes for casual hangouts. + +![Social Hangout Scenes](/img/assetPacks_scenes_socialHangoutScenes_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/social-hangout-scenes.pack + +**Gallery Scenes** - A collection of example art gallery scenes. + +![Social Hangout Scenes](/img/assetPacks_scenes_galleryScenes_600x200.png) + +https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/gallery-scenes.pack + +## More packs + +The full set of packs managed by Mozilla can be found in our [Hubs Cloud Github Repo](https://github.com/mozilla/hubs-cloud/tree/master/asset-packs). + +## Making your own packs + +Making a pack is simple. A pack is just a simple text file with a `.pack` file extension that is a list of URLs, on per line, pointing to avatar or scene URLs on any existing hub on the web. (Including your own!) Feel free to share your own packs! If you have a pack you'd like Mozilla to consider sharing, please [contact us](mailto:hubs@mozilla.com) or open a PR on our [Hubs Cloud Github Repo](https://github.com/mozilla/hubs-cloud/tree/master/asset-packs). diff --git a/docs/archive/hubs-cloud/brand-guidelines.md b/docs/archive/hubs-cloud/brand-guidelines.md new file mode 100644 index 0000000..7cd2c3d --- /dev/null +++ b/docs/archive/hubs-cloud/brand-guidelines.md @@ -0,0 +1,45 @@ +--- +sidebar_position: 16 +--- + +# Advanced: Brand Guidelines + +**Important Stuff To Keep In Mind** + +**Mozilla Hubs** is the name of Mozilla’s public offering on https://hubs.mozilla.com + +**Hubs Cloud** is the name of Mozilla’s cloud-based Hubs offering (https://hubs.mozilla.com/cloud) which allows for enterprise and individuals to stand up their own private instance of Hubs. + +When using Mozilla trademarks (including the Mozilla or Firefox logo and brand) you must comply with these [Mozilla Trademark Guidelines](https://www.mozilla.org/en-US/foundation/trademarks/policy/). + +You are allowed to use the Hubs Cloud logo in connection with your product or initiatives built upon Hubs Cloud. The recommended language to use is “Powered by Hubs Cloud” with a link to https://hubs.mozilla.com/cloud + +You are allowed to use the Mozilla Hubs logo in connection with your event or space, but only if it is held on Mozilla’s public Hubs offering located at https://hubs.mozilla.com/demo + +Please do not use language that implies that your product or site is partnered, affiliated with, or endorsed by Mozilla. This includes terms such as “Partners”, “Partnered with”, "Trusted by" or “Sponsored by.” + +**Downloads** + +These are the official logos for Mozilla Hubs and Hubs Cloud. + +Mozilla Hubs + +light: +![Mozilla Hubs Light](/img/hubs-light-logo.png) + +dark: +![Mozilla Hubs Dark](/img/hubs-dark-logo.png) + +light-stacked: +![Mozilla Hubs Light Stacked](/img/hubs-light-stacked-logo.png) + +dark-stacked: +![Mozilla Hubs Dark Stacked](/img/hubs-dark-stacked-logo.png) + +Hubs Cloud - Opaque Background + +![Hubs Cloud Opaque Background](/img/hubs-cloud-opaque.png) + +Hubs Cloud - Transparent Background + +![Hubs Cloud Transparent Background](/img/hubs-cloud-transparent.png) diff --git a/docs/archive/hubs-cloud/custom-smtp.md b/docs/archive/hubs-cloud/custom-smtp.md new file mode 100644 index 0000000..7bf0ce3 --- /dev/null +++ b/docs/archive/hubs-cloud/custom-smtp.md @@ -0,0 +1,15 @@ +--- +sidebar_position: 13 +--- + +# Recipe: Custom SMTP + +When you set up your server on some cloud providers like AWS, SMTP is automatically set up for you on your cloud provider's email service. You can set your own custom SMTP settings if you are using a different mail provider. + +In the [Admin Console](./hubs-cloud-getting-started.md) choose **Server Settings**: + +![Hubs Cloud ](/img/hubs-cloud-server-settings.jpeg) + +Then, under **Email** you can find the various SMTP server settings: + +![Hubs Cloud SMTP Settings](/img/hubs-cloud-smtp-settings.jpeg) diff --git a/docs/archive/hubs-cloud/customizing-look.md b/docs/archive/hubs-cloud/customizing-look.md new file mode 100644 index 0000000..f46a604 --- /dev/null +++ b/docs/archive/hubs-cloud/customizing-look.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 6 +--- + +# Customizing Look & Feel + +## An announcement about the Hubs user interface + +On January 25, 2021, we released a significant update to the user interface for Hubs on hubs.mozilla.com. This change will not go live on new Hubs Cloud deployments until on or after March 25, 2021. Before the update is released to Hubs Cloud, we encourage administrators of Hubs Cloud deployments to consider their own releases and determine a plan of action for updating to the new UI. + +- If you have not made any changes to your Hubs Cloud client look and feel, your Hubs Cloud instance will be updated on or after March 25th to have the new UI. + +- If you added your own logos or chosen new colors within the Hubs Cloud admin console, these will be applied to the new UI. You may need to review and confirm your color choices when the update is live. + +- If you are using a custom CSS sheet for styles, you may need to modify this CSS file to account for the new user interface styles. Check this page in the coming weeks for additional information. + +- If you are running a custom Hubs Cloud client, you will not automatically receive the new update. You will need to pull in the client changes to your own fork of the client codebase or undeploy your Hubs Cloud custom client to get the new UI automatically. + +- If you do not want to be updated to the new UI, you can deploy a custom client to your Hubs Cloud instance. This will remove your Hubs Cloud instance from the automatic update path, and you will stop receiving updates to the client when we release new Hubs Cloud updates. + +Please note that we are working on tools and documentation to help streamline the transition to the new UI from older versions of the Hubs client. Check this page for updates and additional information, or check out the Hubs Cloud channels in Discord. + +## Deprecated: Updating the look and feel for the original Hubs Client UI + +You can completely completely customize the look and feel of your hub by adding custom colors and branding. + +First, open the [Admin Console](./hubs-cloud-getting-started.md) then choose **App Settings**: + +![Hubs Cloud App Settings](/img/hubs-cloud-app-settings.jpeg) + +From there, you can replace all of the various images your hub by choosing **Images**: + +![Hubs Cloud Image Settings](/img/hubs-cloud-image-settings.jpeg) + +The result? Branding on the landing page and loading page: + +![Hubs Cloud Custom Branding](/img/hubs-cloud-custom-branding.png) diff --git a/docs/archive/hubs-cloud/customizing-themes.md b/docs/archive/hubs-cloud/customizing-themes.md new file mode 100644 index 0000000..6672bb5 --- /dev/null +++ b/docs/archive/hubs-cloud/customizing-themes.md @@ -0,0 +1,233 @@ +--- +sidebar_position: 7 +--- + +# Customizing Themes + +_Theming refers to the colors used in your hub's interface. For each color in the UI, there is a variable that stores the color value and is applied to UI Elements such as buttons, input fields, menus, etc._ + +**Table of Contents**\ +      [Theme JSON](#theme-json)\ +      [Theme Variables Guide](#theme-variables-guide)\ +      [In-App Themes](#in-app-themes)\ +      [Learn about Themes](#learn-about-themes) + +--- + +# Theme JSON + +You can add completely customized color schemes from the [Admin Panel](./setup-configuring-content.md) by copying and pasting a theme JSON, like the example below: + +```json +[ + { + "id": "hubs-default", + "default": true, + "name": "Hubs Default", + "variables": { + "loading-screen-background": "radial-gradient(100% 160.26% at 100% 50%, #EBEBEB 0%, #FFFFFF 46.87%, #EBEBEB 100%)", + "primary-color": "#1700C7", + "primary-color-hover": "#170696", + "secondary-color": "#FFFFFF", + "secondary-color-hover": "#E7E7E7", + "secondary-color-pressed": "#E7E7E7", + "link-color": "#1700C7", + "accent1-color": "#F04F5F", + "accent1-color-hover": "#D43F57", + "accent1-color-pressed": "#D43F57", + "toolbar-label-accent1": "#FFFFFF", + "accent1-border-color": "#F04F5F", + "accent2-color": "#47D3CA", + "accent2-color-hover": "#42CAC1", + "accent2-color-pressed": "#42CAC1", + "toolbar-label-accent2": "#616161", + "accent2-border-color": "#47D3CA", + "accent3-color": "#92D147", + "accent3-color-hover": "#83C832", + "accent3-color-pressed": "#83C832", + "toolbar-label-accent3": "#FFFFFF", + "accent3-border-color": "#92D147", + "accent4-color": "#1700C7", + "accent4-color-hover": "#170696", + "accent4-color-pressed": "#170696", + "toolbar-label-accent4": "#FFFFFF", + "accent4-border-color": "#1700C7", + "accent5-color": "#FF806F", + "accent5-color-hover": "#F0705F", + "accent5-color-pressed": "#F0705F", + "toolbar-label-accent5": "#FFFFFF", + "accent5-border-color": "#FF806F", + "cancel": "#E1465F", + "accept-color": "#92D147", + "accept-color-hover": "#85C23C", + "accept-color-pressed": "#21242C", + "accept-border-color": "#7ED320", + "text1-color": "#000000", + "text1-color-hover": "#2C2C2C", + "text1-color-pressed": "#2C2C2C", + "text2-color": "#616161", + "text2-color-hover": "#616161", + "text2-color-pressed": "#616161", + "text3-color": "#BBBBBB", + "text3-color-hover": "#C7C7C7", + "text3-color-pressed": "#ADADAD", + "text4-color": "#868686", + "text5-color": "#FFFFFF", + "border1-color": "#E7E7E7", + "border2-color": "#5D646C", + "border3-color": "#5D646C", + "outline-color": "#3A4049", + "background1-color": "#FFFFFF", + "background2-color": "#F5F5F5", + "background3-color": "#E7E7E7", + "background4-color": "#5D646C", + "tip-text-color": "#FFFFFF", + "tip-bg-color": "#000000", + "tip-button-color-hover": "#E7E7E7", + "input-bg-color": "#FFFFFF", + "active-text-color": "#2B313B", + "active-color-hover": "#E8EFFD", + "active-color-pressed": "#D0DEFB", + "action-color": "#000000", + "action-color-highlight": "#149CE2", + "action-label-color": "#5634FF", + "notice-background-color": "#000000", + "admin-color": "#13A4ED", + "toolbar-basic-selected-icon-color": "#2B313B", + "toolbar-basic-icon-color": "#000000", + "toolbar-basic-color-hover": "#E7E7E7", + "toolbar-basic-border-color": "#E7E7E7", + "toolbar-icon-selected-bg": "#FFFFFF", + "basic-color": "#FFFFFF", + "basic-color-hover": "#E7E7E7", + "basic-color-pressed": "#E7E7E7", + "background-hover-color": "#E7E7E7", + "basic-border-color": "#E7E7E7", + "link-color-hover": "#1700C7", + "radio-bg-color": "#FFFFFF" + } + }, + { + "name": "Hubs Dark Mode", + "id": "hubs-dark-mode", + "darkModeDefault": true, + "variables": { + "loading-screen-background": " linear-gradient(110.71deg, #499CBE 0.79%, #1D11C6 32.83%, #6B30AF 67.96%, #E67577 100%);", + "primary-color": "#6E5BFF", + "primary-color-hover": "#7967FF", + "secondary-color": "#FFFFFF", + "secondary-color-hover": "#E7E7E7", + "secondary-color-pressed": "#E7E7E7", + "link-color": "#6E5BFF", + "link-color-hover": "#7967FF", + "link-color-pressed": "#7967FF", + "accent1-color": "#F04F5F", + "accent1-color-hover": "#D43F57", + "accent1-color-pressed": "#D43F57", + "toolbar-label-accent1": "#FFFFFF", + "accent1-border-color": "#F04F5F", + "accent2-color": "#47D3CA", + "accent2-color-hover": "#3CC6BD", + "accent2-color-pressed": "#42CAC1", + "toolbar-label-accent2": "#FFFFFF", + "accent2-border-color": "#47D3CA", + "accent3-color": "#92D147", + "accent3-color-hover": "#83C832", + "accent3-color-pressed": "#83C832", + "toolbar-label-accent3": "#FFFFFF", + "accent3-border-color": "#92D147", + "accent4-color": "#6E5BFF", + "accent4-color-hover": "#5C4ADF", + "accent4-color-pressed": "#5C4ADF", + "toolbar-label-accent4": "#FFFFFF", + "accent4-border-color": "#6E5BFF", + "accent5-color": "#FF806F", + "accent5-color-hover": "#F0705F", + "accent5-color-pressed": "#F0705F", + "toolbar-label-accent5": "#FFFFFF", + "accent5-border-color": "#FF806F", + "cancel": "#E1465F", + "accept-color": "#92D147", + "accept-color-hover": "#7FBF33", + "accept-color-pressed": "#7FBF33", + "accept-border-color": "#92D147", + "text1-color": "#EAEAEA", + "text1-color-hover": "#EAEAEA", + "text1-color-pressed": "#EAEAEA", + "text2-color": "#E7E7E7", + "text2-color-hover": "#E7E7E7", + "text2-color-pressed": "#E7E7E7", + "text3-color": "#BBBBBB", + "text3-color-hover": "#C7C7C7", + "text3-color-pressed": "#ADADAD", + "text4-color": "#FFFFFF", + "text5-color": "#FFFFFF", + "border1-color": "#463F78", + "border2-color": "#433C75", + "border3-color": "#3B346D", + "outline-color": "#3A4049", + "background1-color": "#28244B", + "background2-color": "#302B52", + "background3-color": "#352F5F", + "background4-color": "#383267", + "tip-text-color": "#FFFFFF", + "tip-bg-color": "#000000", + "tip-button-color-hover": "#E7E7E7", + "input-bg-color": "#5D646C", + "active-text-color": "#EAEAEA", + "active-color": "#7967FF", + "active-color-hover": "#6E5BFF", + "active-color-pressed": "#6E5BFF", + "action-color": "#000000", + "action-color-highlight": "#6E5BFF", + "action-label-color": "#5634FF", + "notice-background-color": "#000000", + "admin-color": "#70D9DE", + "toolbar-basic-selected-icon-color": "#2B313B", + "toolbar-basic-icon-color": "#EAEAEA", + "toolbar-basic-color-hover": "#FFFFFF", + "toolbar-basic-border-color": "#6E5BFF", + "toolbar-icon-selected-bg": "#FFFFFF", + "toggle-button-color": "#6E5BFF", + "basic-color": "#2B2560", + "basic-color-hover": "#362E79", + "basic-color-pressed": "#362E79", + "background-hover-color": "#E7E7E7", + "basic-border-color": "#E7E7E7", + "tile-bg-color": "#3B346D", + "tile-bg-color-hover": "#362E79", + "tile-bg-color-pressed": "#362E79" + } + } +] +``` + +Use the boolean attributes, `"default"` and `"darkModeDefault"` to set a default theme from your custom themes array. + +# Theme Variables Guide + +While not exhuastive, these diagrams will outline a few key variables that you can use in your themes. + +## Entry Screen + +Theme variable correlation on entry screen + +## Bottom Toolbar + +Theme variable correlation on bottom toolbar + +## Menus + +Theme variable correlation on menus + +# In-App Themes + +The in-world User Interface (e.g the menu you get when hovering your cursor over an object and pressing spacebar) is themed with the following variables: `"action-color", "action-label-color", "action-color-disabled", "action-color-highlight", "action-text-color", "action-subtitle-color", "notice-background-color", "notice-text-color", "favorited-color".` + +# Learn about Themes + +There are some great tools you can use to learn more about theme-ing your hub. + +You can [learn about working with JSON](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON#other_notes) from MDN Web Docs. + +[Storybook](https://storybook.js.org/), an open source tool for building UI components and pages in isolation, is very helpful in customizing themeing. To run storybook locally you can use the command `npm run storybook` to preview components and themes. diff --git a/docs/archive/hubs-cloud/discord-bot.md b/docs/archive/hubs-cloud/discord-bot.md new file mode 100644 index 0000000..8781203 --- /dev/null +++ b/docs/archive/hubs-cloud/discord-bot.md @@ -0,0 +1,9 @@ +--- +sidebar_position: 14 +--- + +# Recipe: Discord Bot + +> Discord bot for Hubs Cloud is under **construction**! +> +> Please follow [github.com/mozilla/hubs-cloud/issues/128](https://github.com/mozilla/hubs-cloud/issues/128) for updates. diff --git a/docs/archive/hubs-cloud/faq.md b/docs/archive/hubs-cloud/faq.md new file mode 100644 index 0000000..9790b39 --- /dev/null +++ b/docs/archive/hubs-cloud/faq.md @@ -0,0 +1,72 @@ +--- +sidebar_position: 3 +--- + +# FAQ + +## Why use Hubs Cloud vs. hubs.mozilla.com? + +**Hubs Cloud allows you all the functionality of hubs.mozilla.com and also comes with additional features to customize branding, the url, user accounts, the interface and code inside the hubs client.** You're in control of your Hubs Cloud instance and its data via AWS or DigitalOcean infrastructure, Mozilla simply provides the template and automatic updates. This makes it perfect for creating a totally bespoke Hubs experience. + +The max room size is the same as hubs.mozilla.com: 25 avatars per room + 75 to the lobby ([More on room capacity here](./hubs-faq.md#what-is-the-capacity-of-a-hubs-room)). + +Try out Hubs via hubs.mozilla.com and when you're familiar and interested in using it for big events, exclusive personal meetups, or for a business, check out [Hubs Cloud](./hubs-cloud-intro.md). + +Documentation for customizing your Hubs Cloud instance: + +- [Branding + look and feel](./hubs-cloud-customizing-look-and-feel.md) +- [Customizing hub url](./hubs-cloud-aws-domain-recipes.md) +- Managing accounts via the Admin Panel - _documentation coming soon_ +- [Customizing the user interface and client code](./hubs-cloud-custom-clients.md) + +## Personal vs. Enterprise? + +- Personal defaults are lower cost. Enterprise defaults are higher cost but improve site functionality like no database pausing. +- The main difference: Enterprise allows multiple servers. If one goes down unexpectantly, the others will take over. Personal allows only one server. +- Beyond that, they are the same in the options they offer and cost per server is the same. Personal can be configured to be an expensive, highly scalable single server, and vice versa. + +## How to change my server size up from a t3.micro to c4.large? + +Check out [Updating the Stack](./hubs-cloud-aws-updating-the-stack.md) documentation. + +## Can I change the # of servers I am running? + +Yes, for Enterprise. [Update the Stack](./hubs-cloud-aws-updating-the-stack.md). + +No, for Personal. + +## Can I change my domains or mail settings (like change from myhubssite.com to hubs.myhubssite.com)? + +No, you'll need to delete the current stack and remake it with those settings. + +## Can I update my "Restore from Backup" or "Advanced" settings in Hubs? + +No, you'll need to delete the current stack and remake it with those settings. + +## How much will Hubs Cloud cost for AWS? + +Check out our **rough** estimate guide here: [Estimated Cost Charts (alpha)](./hubs-cloud-aws-estimated-cost-charts.md) + +## How many users can Hubs Cloud support? + +Please see: [AWS Estimated CCU Limits](./hubs-cloud-aws-estimated-ccu-limits.md) + +## Can I use the Mozilla / Hubs logo on my Hubs Cloud site? + +Please review our [branding guidelines](./hubs-cloud-branding.md) for information about how the Hubs logos can be used. + +## What is my hub stack's admin email address? + +See ["Check "What is my hubs stack's admin email address?" docs](./hubs-cloud-aws-troubleshooting.md#then-what-is-my-hub-stacks-admin-email-address) + +## How do I lockdown my rooms to specific people? + +[See Limiting User Access docs](./hubs-cloud-limiting-user-access.md) + +## Don't see your question? + +If your question is about Hubs, check out the [Hubs FAQ](./hubs-faq.md). + +If your question is about deploying Hubs Cloud to AWS, check out the [AWS Troubleshooting Guide](./hubs-cloud-aws-troubleshooting.md). + +If you can't find what you need in the rest of the documentation, see the [help page](./help.html) for ways to get in touch. diff --git a/docs/archive/hubs-cloud/getting-started.md b/docs/archive/hubs-cloud/getting-started.md new file mode 100644 index 0000000..1cb5c68 --- /dev/null +++ b/docs/archive/hubs-cloud/getting-started.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 2.2 +--- + +# Getting Started + +After successful Hubs Cloud deployment on AWS or DigitalOcean, navigate to your hub's hosted domain name (eg. myhub.com or hub.mydomain.com). + +In the upper right corner, click "Sign In" and enter your admin email address you specified during CloudFormation. In your email inbox, click the received "magic link" to login (Issues with login? Check out the [AWS Troubleshooting Guide](./hubs-cloud-aws-troubleshooting.md)). + +Once you've logged into Hubs Cloud for the first time, you should see the Hubs Cloud Admin Console. It should look like this: + +![Hubs Cloud Admin Landing](/img/hubs-cloud-admin-landing.jpeg) + +If so, congratulations! You've successfully deployed your own personal Social VR hub, powered by Hubs by Mozilla. + +You can always get back to the Admin Console by navigating to your site and looking for the "Admin" link in the top navigation bar: + +![Hubs Cloud Admin Bar](/img/hubs-cloud-admin-bar.jpeg) + +Now that your site is up and running, you can create a room by clicking on the "Create a Room" link from the homepage: + +![Hubs Cloud Create Room](/img/hubs-cloud-create-room.jpeg) + +The first thing you'll notice... is your room is totally empty! Hubs Cloud isn't very useful until you [import some scenes and avatars](./hubs-cloud-importing-content.md). + +## Setting up your hub + +Here's some things you can do to continue setting up your hub: + +- [Import content](./hubs-cloud-importing-content.md) so your visitors will have access to a library of scenes and avatars. +- [Customize the Look and Feel](./hubs-cloud-customizing-look-and-feel.md) to make your hub fit your brand or style. +- [Enable the Scene Editor](./hubs-cloud-enable-scene-editor.md) to let visitors create their own scenes. +- [Enable permissive rooms](./hubs-cloud-permissive-rooms.md) to let visitors add media to their rooms. +- [Set up the media browser](./hubs-cloud-enable-media-browser.md) so visitors can add content from sites like Sketchfab. +- [Learn how to manage content](./hubs-cloud-managing-content.md) so visitors can contribute content to your hub. +- [Add Administrators](./hubs-cloud-adding-administrators.md) if you'd like others to help you set up your hub. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/_category_.json b/docs/archive/hubs-cloud/hubs-cloud-aws/_category_.json new file mode 100644 index 0000000..e6f68c0 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Hubs Cloud AWS", + "position": 1, + "link": { + "type": "generated-index" + } +} diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/aws-troubleshooting.md b/docs/archive/hubs-cloud/hubs-cloud-aws/aws-troubleshooting.md new file mode 100644 index 0000000..b9f1914 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/aws-troubleshooting.md @@ -0,0 +1,153 @@ +--- +sidebar_position: 7 +--- + +# AWS Troubleshooting + +## Deployment + +### My AWS stack says "rollback complete" after deploying, what went wrong? + +You encountered an issue during Hubs Cloud stack deployment. By default, AWS rolls back the changes and deletes the stack. + +#### To see the first error event + +1. Navigate to AWS Cloudformation > Select your stack name in Stacks > Select "Events" Tab on right sidebar +2. Scroll All the way down the event list to where the **FIRST** red error appears in the "Status" column. This should be a specific error of what went wrong. +3. Log, note, or screenshot those errors for troubleshooting +4. Redeploy the stack again with the same parameters (sometimes it takes 2 times to go through), then if you get the same error... +5. Search specific error _on this page (AWS Troubleshooting)_ +6. Search specific error on [Hubs Github Discussions](https://github.com/mozilla/hubs/discussions) +7. Make a thread on [Hubs Github Discussions](https://github.com/mozilla/hubs/discussions), if none of the searches found a solution for you. + +#### To turn rollback completely off + +1. Start the [AWS Hubs deployment process](https://hubs.mozilla.com/cloud) > Finish steps 1 and 2 > "Step 3 Configure stack options" > "Advanced options" > Expand "Stack creation options" > Select "Disabled" for "Rollback on failure" +2. Continue with the stack creation and discover which error the stack failed on +3. Delete the stack in AWS CloudFormation manually to restart the deployment process + +### ExternalZoneSSLCertLocalIfEast error or InternalZoneSSLCert error or timeout + +You have an issue with SSL certificate verification. + +#### Potential solutions: + +1. **Check your domains** + - Are your domain names typed correctly? + - Check that you registered the domains on AWS Route 53 +2. **Is Transfer Lock on your domains?** + - Check your aws Management console > Route 53 > "Registered Domains" > Are _ALL_ "Transfer Locks" "X"s (aka disabled) ? + - To disable: Click on domain > Select "disable" for Transfer Lock option + - Try deploy again +3. **Certificate limit reached, must ask AWS for increase.** + - Have you deployed this stack multiple times? If so, AWS defaults that you can create only 25 certificates per month. Create a AWS help desk ticket to request for a certificate increase. In a few days, you'll be able to deploy Hubs Cloud again. +4. **DNS CNAME issues.** + - Before deploying Hubs Cloud stack again, go to AWS Route 53 + - Select the domains you're using for Hubs Cloud + - Delete the CNAMEs from left from the last Hubs stack deployment -- Careful not to delete any CNAMEs that your domains use for another service + - Deploy the Hubs Cloud stack again +5. **Are your Name Servers the default AWS ones?** + - You may have changed your Name Servers to point to another service. Delete the current ones to revert back to the defaults. + +### Using a Second Level domain like (.co.uk or .com.fr) + +Use Recipe 3 for deployment, this is a known bug. + +## After Successful Deployment + +### You're in the "AWS Sandbox" and people don't receive "magic link" emails + +You finished deployment and can access the Hubs Admin console. The Hubs Admin console will also say you're in the "AWS Sandbox." Your stack AWS email service is limited. + +#### Solution options: + +1. **Verify individual email addresses for administrators** + + - If you only have a few people who will be administrating using your site, you can have them verify their email addresses with SES. + - Go to Simple Email Service on the AWS Console and then under "Email Addresses" add the email addresses who will be using the site. + - Each person will receive a verification email they will need to click on. + - Once they have verified their email address, they will be able to receive the "magic link" emails. + +2. **Send request to AWS for a limit increase** + + - Use this process if you have 24 hours to wait for AWS technical support to grant your email service limit increase + - Go to [AWS create case](https://console.aws.amazon.com/support/home?#/case/create?issueType=technical) + - Select the "Service limit increase" radio button + - **Limit type:** "SES Sending Limits" + - **Mail Type:** "System Notifications" + - **Website URL - optional** + - **Describe ... who have requested your mail:** "We authenticate users using email links only. Users who want to join and connect to the hosted Mozilla Hubs Room, will enter their email address to get this 'magic hub' link to authenticate. Anyone can choose to not enter their email and not join." + - **Describe ... and complaint notifications:** "We've set up bounce and complaints to forward to an administrative email address. And we do not send any emails other than this 'magic' authentication email link to join a Hubs room. We don't store emails on our server." + - **Will you comply with AWS Service Terms?:** "Yes" + - Request 1 + - Region: Select `US East (Northern Virginia)` + - Limit: Desired Daily Sending Quota + - New Limit Value: 50,000 + - Case description: Answer the questions below in the message field: + - What does your Hubs Cloud instance do? Add anything relevant to your use case in the request + - Add this to your message: "The product does not support passwords, only email links to log in. As such, would like to use SES to send these emails. There are no other emails sent by the product other than these automated sign-in emails, sent at the time a user requests to log in. We do not send any unsolicited emails or other content-oriented emails, only sign in link emails. We do not store the email addresses of visitors. The emails are securely transmitted to our server at log-in time to send the email link." + - Submit form + - Email will arrive granting your service limit increase request + +3. **Setup SMTP via SendGrid** + - Use this process if you need an immediate fix + - Sign up on [SendGrid](https://sendgrid.com/) + - Create a new API Key + - Grant the API key email send ability + - Update settings in Hubs Cloud Admin console + 1. Server settings > SMTP + 2. Enter "apikey" as "Username" + 3. Enter the API key itself as "Password" + 4. Enter "smtp.sendgrid.net" as "Host" + 5. Enter "2525" as "Port" + +### The specified key does not exist. Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey + +This is a bug in AWS Cloudformation that Amazon is working to address. Unfortunately, you'll have to delete and re-create the stack. + +### My servers are Offline or "NoSuchKey" Error on my Hubs Cloud domain after successful deploy Hubs Cloud + +Did you choose "Offline mode" when creating the stack? If so, you deployed correctly but your servers aren't running! + +To get them running and take them "Online" follow the [Update the Stack Guide](./hubs-cloud-aws-updating-the-stack.md). When you want to take them "Offline" again, follow the same process and select "Offline". + +You can also specify a url to redirect traffic to when your servers are offline to avoid this error page. + +### Our users are experiencing "Unable to connect to this room, please try again later." + +We fixed this error with Hubs Cloud version 1.1.0 with an added TURN server. You need to upgrade from 1.0.0 to 1.1.0. Follow the process outlined in [Upgrade to a new stack release](./hubs-cloud-aws-updating-the-stack.html#upgrade-to-a-new-stack-release) + +And verify you're on 1.1.0 by following the steps in [Check if you're on version 1.1.0](./hubs-cloud-aws-updating-the-stack.html#check-if-youre-on-version-110) + +### In my hubs admin panel, I see NetworkError or Not Found page or no data populates in any of the admin menus. + +Your account is likely **NOT** an admin! Switch account or check your hub stack parameters for the email address below. + +#### Then, what is my hub stack's admin email address? + +**Check Email via Cloudformation Stack** + +1. Go to aws Management Console (check your **region**!) +2. Search and go to Cloudformation +3. Select Stacks +4. Select your hub stack - _No stacks? Did you delete it or are you in the wrong region?_ +5. "Parameters" tab +6. Check "AdminEmailAddress" parameter. Make sure there are no capital letters! + +**Check Email in aws Simple Email Service menu (SES)** + +1. Go to aws Management Console (check your **region**!) +2. Select region **N. Virginia (us-east-1)** for _ALL_ region deploys! in upper right hand corner +3. Search and go to Simple Email Service +4. Select "Email Addresses" +5. One of these listed is your stack's admin email address. + - Make sure there's no capital letters! + - If your email is not "verified" yet, you need to click on confirmation link amazon sends you during cloud formation. + +### How can I tell I'm on version 1.1.0? + +Follow steps in [Check if you're on version 1.1.0](./hubs-cloud-aws-updating-the-stack.html#check-if-youre-on-version-110) + +## Missing a solution? + +If you can't find what you need in the rest of the documentation, see the [help page](./help.html) for ways to get in touch. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/backup-and-restore.md b/docs/archive/hubs-cloud/hubs-cloud-aws/backup-and-restore.md new file mode 100644 index 0000000..0501175 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/backup-and-restore.md @@ -0,0 +1,49 @@ +--- +sidebar_position: 6 +--- + +# Backup and Restore + +If something goes wrong and you need to restore from a backup, or you'd like to just make a second hub using the same data from an existing hub, the stack creation form makes it fairly simple to do so. + +Your hub's data is made up of two things: an AWS Aurora Serverless database, and an AWS Elastic File Store volume (used for scenes, avatars, etc.) Both of these are backed up for you automatically on a nightly basis. The database is backed up via database snapshots (which can be seen in the RDS console) and the EFS volume is backed up into a Vault in AWS Backup (which can be found in the AWS Backup console.) + +**Do you need to update your Hubs Cloud stack from 1.0.0 to 1.1.0?** Follow the guide: [update from Hubs Cloud version 1.0.0 to 1.1.0](./hubs-cloud-aws-updating-the-stack.html#upgrade-to-a-new-stack-release) + +### Creating a backup manually + +Your hub is backed up automatically every night. If you want to make an up-to-the-minute backup of a hub you can manually create a RDS snapshot and new AWS Backup recovery point via the console. + +- It's highly suggested you put your hub into "Offline" mode by performing a [stack update](./hubs-cloud-aws-updating-the-stack.md) before doing so to limit the risk of data being missed. +- To create a database snapshot: + - Select your database cluster in RDS and under "Actions" click "Take Snapshot". + - If you're unsure which cluster is your hub's database, it can be found in the stack "Outputs" section under `AppDb`. +- To create a new recovery point: + - Get the filesystem id from `StorageEFS`, the vault name from `DailyBackupVault`, and the IAM role under `DailyBackupRole` from the "Resources" section of your stack in CloudFormation. + - In the AWS Backup console, go to "Protected Resources" and select the filesystem id you saw for `StorageEFS`. + - Click "Create On-Demand backup." + - Under the "Vault" section select the vault from `DailyBackupVault`, and under the IAM section select "Choose an IAM Role" and select the IAM role from `DailyBackupRole`. + +If you are planning on restoring from this backup, before proceeding make sure both the database snapshot and storage backup job have completed. You can check the status of the snapshot via the "Snapshots" section in RDS, and the status of the backup in the "Jobs" section of AWS Backup. + +### Restoring from a backup + +To restore from a backup, you will [create a new stack](https://hubs.mozilla.com/cloud), and you need to provide the necessary information in the stack creation form in the "Restore from Backup" section. Note that you can only restore backups to stacks in the same region as the original stack, since AWS Backup does not currently support cross-region restores. **Do _not_ perform a stack update to an existing stack to try to restore from a backup** -- this will not work and will likely break things. You **must** create a new stack to restore from a backup. + +If you want to revert an existing stack to data in a backup, you will first need to delete the stack and then create a new one restored from the backup. Deleting the stack is safe once you have confirmed you have a completed database snapshot and a restore point taken at the time you would like to restore to. However, it is suggested you first create a new, separate stack on a different domain from the backup before deleting the old stack, to confirm the backup contains the data you expect it to. + +The info you need to provide can be found in the RDS and AWS Backup consoles: + +- The RDS snapshot ID to restore from +- The AWS Backup vault name to restore from +- The recovery point ARN to restore from, from the vault + +#### Restoring Secrets + +There are some secrets like encryption keys that are needed to restore from a backup. The secrets you need are **not** automatically deleted when you delete a stack, so even if you deleted the stack whose backups you are restoring, the necessary secrets should still be in your AWS account unless you manually removed them. If you **have** gone and deleted these secrets manually, unfortunately you will not be able to restore your backup since these secrets are related to encryption -- you have our sympathies. + +- The first secret you'll need is the database secret for the stack whose backups you are restoring. To find this, go to AWS Secrets Manager and look for the secret "_Stack Name_ Database Secret." You'll need to provide the ARN to this secret in the stack create form for the new stack. + +- Additionally, there are some secrets stored in AWS Parameter Store. You will **not** need to dig these up. As long as you haven't gone in and deleted them manually, these secrets can be looked up automatically by providing the stack name for the stack whose backup you are restoring from. You'll need to specify these values in the "Backup and Restore" section of the creation form. (Even if you've deleted the stack you are restoring the backups from.) + +Once you've filled these values out and create the stack it should be restored from the backup. It should behave identically to the original stack, except you will need to configure the "Server Settings" in the Admin console, which are not backed up. **Note**: if you perform a stack update on a stack that was restored from backup, it is critical you do **not** change the parameters under the "Restore from Backup" section -- leave them filled in and don't touch them! diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/cost-saving.md b/docs/archive/hubs-cloud/hubs-cloud-aws/cost-saving.md new file mode 100644 index 0000000..8ee00a5 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/cost-saving.md @@ -0,0 +1,130 @@ +--- +sidebar_position: 10 +--- + +# Cost and Minimizing Costs Information + +This document explains how Hubs Cloud costs work. Although your hub is designed to minimize AWS costs as much as possible, we go into detail on how to minimize them even further for your stack. + +If you'd like to estimate the costs for your event: + +- Best Accuracy Cost Estimate - use AWS Cost Explorer +- Calculate and estimate the cost of your event +- Recommended Server Types + +See our [Estimating Costs and Charts (Alpha)](./hubs-cloud-aws-estimated-cost-charts.md) page. + +**Minimizing Costs Primer** + +- [How do costs work for Hubs Cloud?](./hubs-cloud-aws-costs.md#how-do-costs-work-for-hubs-cloud) +- [Minimizing costs - Recommended user story](./hubs-cloud-aws-costs.md#minimize-your-costs---a-user-story) +- [Minimizing costs - Settings in stack template](./hubs-cloud-aws-costs.md#stack-cost-management-options) + +## How do costs work for Hubs Cloud? + +We've done our best to minimize costs in the template as much as possible. Your primary costs will be the EC2 AWS Server types you use hourly, the serverless hourly database costs, EFS storage, and, if you do not switch to Cloudflare, data transfer costs. + +EC2 instances, while "Online", will cost the [minimum cost](./hubs-cloud-aws-estimated-cost-charts.md#estimated-cost-charts) per hour per server for your instance AWS server type [(?)](./hubs-cloud-aws-estimated-cost-charts.md#aws-server-type-recommendations). This minimum cost is hourly regardless of how many people connect at a time. You can manually turn off your EC2 instance + database via turning on [**Offline mode**](./hubs-cloud-aws-costs.md#offline-mode---manual) where no one can connect to your server at the time. + +Database costs is the largest factor next to EC2 instance, you can set [**database pausing**](./hubs-cloud-aws-costs.md#database-pausing---automatic) on to stop costs incurring when no one is connected. + +[See our (Alpha) Cost Charts for more information on AWS Server Types and Minimum EC2 Costs.](./hubs-cloud-aws-estimated-cost-charts.md#estimated-cost-charts) + +[For minimizing your costs, see our Minimize your Hubs Cloud Costs - A User Story](./hubs-cloud-aws-costs.md#minimize-your-hubs-cloud-costs---a-user-story) + +## Factors creating AWS cost estimates + +Your hub is designed to minimize AWS costs. Your primary costs will be: + +- AWS Server Type on AWS EC2 instances +- Number of servers +- Database usage +- Storage for 3D assets for scenes and avatars +- Data transfer costs +- Domain costs ($1 per domain/mo.) + $0.40/mo for the database secrets + +## Detailed Breakdown + +As you use your hub, you will see AWS costs: + +- EC2 instances: the stack configuration lets you choose how many instances to use, a single t3.micro is needed by default. At time of this writing that costs approx \$8/mo. +- An [Aurora serverless](https://aws.amazon.com/rds/aurora/pricing/) database: you will be charged for database usage. At the time of this writing \$0.12 per hour used, rounded to the nearest 10 minutes. If you've enabled database auto-pausing in your stack configuration (the default) then you will only pay for the database when visitors are accessing your site. If you are concerned about excessive database costs, you can set a budget in the stack settings that will cause your stack to be put into Offline mode automatically if your budget is exceeded. (which will shut down all the servers, including the database) +- [EFS](https://aws.amazon.com/efs/pricing/) storage: you will be charged for storage of uploaded scenes and avatars. At the time of this writing approx $0.30/gb month and $0.10/gb month for data that hasn't been accessed in 30 days. +- [Cloudfront](https://aws.amazon.com/cloudfront/pricing/) data transfer costs. +- There are a variety of lambdas used for doing image resizing, video transcoding, etc subject to [AWS Lambda Pricing](https://aws.amazon.com/lambda/pricing) but unlikely to exceed free tier levels. +- You will also be paying $1/mo for each of your Route 53 domains and also $0.40/mo for the database secret. + +Note that you can significantly save data transfer charges by switching your CDN to Cloudflare. In your hub's admin console, go to the "Data Transfer" page to see how. + +If you'd like to maximize your cost savings, you can perform a stack update to switch the stack into "Offline" mode when you are not using it, though this likely unnecessary except for cases where you are running at a higher capacity settings than the defaults. + +To roughly estimate your costs, check out our [Estimated Cost Charts (alpha)](./hubs-cloud-aws-estimated-cost-charts.md). + +To more accurately predict future costs use [AWS Cost Explorer for your instance](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/ce-what-is.html). + +## Minimize your Costs - A User Story + +Our recommendation to minimize costs for automatic settings is to turn [**database pausing**](./hubs-cloud-aws-costs.md#database-pausing---automatic) on by default. When no one is using your hub, turn your hub to [**Offline mode**](./hubs-cloud-aws-costs.md#offline-mode---manual) or a small instance type like **t3.medium**. Also use a Cloudflare worker as your content CDN. + +### Before your event: Development + +For development with only a few users connecting + setting rooms + scenes, we recommend at least a **t3.medium** instance [(?)](./hubs-cloud-aws-estimated-cost-charts.md#aws-server-type-recommendations). When not in use, set your instance to [**Offline mode**](./hubs-cloud-aws-costs.md#offline-mode---manual). Then switch back to Online when beginning development again. + +### Before your event: 1.5 hours + +If your instance is in [**Offline mode**](./hubs-cloud-aws-costs.md#offline-mode---manual), manually update the stack to **Online** and wait 10 minutes. + +After, at least 1 hour before event, manually update the stack to scale up your AWS Server Type. For example 1 hour before your event, [update the stack](./hubs-cloud-aws-updating-the-stack.md) from a **t3.medium** to **c4.large** [(?)](./hubs-cloud-aws-estimated-cost-charts.md#aws-server-type-recommendations). + +### During your event + +If you notice performance issues, you can ad hoc [update the stack](./hubs-cloud-aws-updating-the-stack.md) up more from a **c4.large** to **c5.2xlarge** [(?)](./hubs-cloud-aws-estimated-cost-charts.md#aws-server-type-recommendations). Your users in the rooms will have a brief freeze/voice drop while the users roll to the new servers. + +### After your event + +Scale down your AWS Server Type by [updating the stack](./hubs-cloud-aws-updating-the-stack.md) from the **c5.2xlarge** to **t3.medium** [(?)](./hubs-cloud-aws-estimated-cost-charts.md#aws-server-type-recommendations) when finished or there are less users connected. + +### When no one is connecting to your instance for a long time + +You can turn your hub to [**Offline mode**](./hubs-cloud-aws-costs.md#offline-mode---manual) where no one can connect to your hub or a redirect URL, if specified. Via **Offline mode** all costs except for asset storage like backups, scenes, and avatars are \$0. + +## Stack Cost Management Options + +To enable these options, follow [Update the Stack instructions](./hubs-cloud-aws-updating-the-stack.html). + +- Enable **Auto-Pause Database**. On by default for Personal and settable by Enterprise. +- Toggle **Offline mode** to "Online" to "Offline" manually. Your EC2 and database costs will be \$0/hour when you've turned your servers off. +- Set **Account Monthly Database Budget** +- Enable Content CDN to Cloudflare workers + +### Database Pausing - automatic + +If **Auto-Pause Database** or **database pausing** is "Yes - Pause database when not in use", after no one has connected to your instance for a while, your database and the costs incurred by your database will stop until a user connects again. It takes 1-3 minutes for the database to turn back on and allow the first user to connect. Subsequent connections will occur quickly afterward. + +To enable database pausing, follow [Update the Stack instructions](./hubs-cloud-aws-updating-the-stack.html). + +### Offline Mode - manual + +When you set **Offline mode** to "Offline", you've completely turned off your servers and stopped all EC2 costs + database costs. You're still paying for storage for your backups and data. No one can connect to your hub while your servers are "Offline". While "Offline," your hubs instance will redirect you to the specified offline url. + +Turning **Offline mode** to "Offline" to "Online" and vice versa is a manual process. Wait 10 minutes afterward to connect. + +To toggle Offline/Online, follow [Update the Stack instructions](./hubs-cloud-aws-updating-the-stack.html). + +### Monthly Database Budget - automatic + +Careful with the **Monthly Database Budget** setting, we recommend $0 (unlimited) or at least $20 or more. If costs hit your set database budget (set other than \$0), your database will forcibly shut off for the month. This allows no surprise costs for the cost sensitive. + +Personal and Enterprise defaults to \$0 (unlimited). + +To set budget, follow [Update the Stack instructions](./hubs-cloud-aws-updating-the-stack.html). + +### Change content CDN to Cloudflare Workers - 1 time update + +With a fresh stack, you're using AWS's Content CDN, which is relatively expensive. You can change to use Cloudflare workers for Content CDN. + +To enable Cloudflare workers, in your hub Admin Panel > "Content CDN" menu > Follow instructions to enable Cloudflare workers. (WARNING - DO NOT CHANGE NAMESERVERS FOR YOUR HUB AND DO NOT ADD YOUR SITE TO CLOUDFLARE) + +## Estimating your costs + +See our [Estimating Costs and Charts (Alpha)](./hubs-cloud-aws-estimated-cost-charts.md) page. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/domain-recipes.md b/docs/archive/hubs-cloud/hubs-cloud-aws/domain-recipes.md new file mode 100644 index 0000000..283be55 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/domain-recipes.md @@ -0,0 +1,145 @@ +--- +sidebar_position: 2 +--- + +# Domain Recipes + +This guide provides a few recipes for registering and purchasing necessary domains before creating your Hub Cloud stack. + +Site domains: **Site Domain Name**, **Internal Domain**, and **Short Link Domain** + +Email domains: **Outgoing Email Domain** and **Outgoing Email Subdomain Prefix** + +To simplify setup, it's highly recommended you setup external domains to use Route 53 Hosted Zones as the DNS provider, since Hubs Cloud will then be able to manage DNS and SSL certificate renewals for you. + +## Setup external domains to use Route 53 as the hosting/DNS provider + +**NOT USING the domains** registered on Namecheap/GoDaddy/HostGator/etc or another external domain registrar? To make HC set up easier, we recommend setting up your domain's nameservers to point to AWS Route 53 as the hosting/DNS provider (AWS Route 53 Hosted Zones). Follow **How to setup on Route 53** in next section. + +**USING the domains already?** Already hosting something and can't change nameservers? Then use Recipe 3 for deployment. + +### How to setup on Route 53 + +You'll need to follow instructions in [Route 53 Hosted Zones](https://console.aws.amazon.com/route53/home#hosted-zones:) to "Create Hosted Zone" then update the domain nameservers in your domain registrar to point to AWS ones. + +For specific instructions for YOUR DOMAIN REGISTRAR and changing your domain registrar's domain nameservers to Route 53, web search: + +- Keywords: **YOUR DOMAIN REGISTRAR, DNS hosting, setup Route 53 Hosted Zones, change YOUR DOMAIN REGISTRAR nameservers** +- `How to change my nameservers on website` +- `Change DNS for a domain` +- `Point my domain to Route 53 Hosted Zones` + +### Your domain is set up on Route 53, if/when it meets one of two criteria: + +- It was purchased on AWS. It's nameservers point to AWS, it shows up on Route 53 Hosted Zones and Registered Domains. +- Your domains are set up to use AWS Route 53 DNS Hosting via Hosted Zones and the nameservers have been changed to point to AWS Route 53. These domains were purchased in a domain registrar like Namecheap or GoDaddy. + +### When should I use Recipe 3? + +Use Recipe 3 when your website is already hosting something or used elsewhere for other purposes already and you can NOT change the nameservers. + +**OR you have a SECOND LEVEL domain that is ".co.uk" or ".com.fr"**, there's a known bug that you need to follow the Recipe 3 for these domains. + +You do NOT need to (but you CAN), if your domains are not being used by anything, in that case follow **How to setup on Route 53** above section. + +For example, for us to use mozilla.com (and not break the pre-existing site), we had to follow [Recipe 3](./hubs-cloud-aws-domain-recipes.md#recipe-3-domain-can-not-be-on-route-53) and _NOT_ change nameservers to point to AWS for hubs.mozilla.com to work as a subdomain. + +### Using a second level domain (.co.uk, .com.fr, etc)? + +Use domain Recipe 3 regardless of whether you bought the domains on Route 53 (we have a known bug). + +## Recipe 1: Dedicated domain on Route 53 + +- `myhub.com` **OR subdomain** `hub.myhub.com` connects to your hub - _Warning! Do not create a new Hosted Zone for `hub.myhub.com` on Route 53! The Cloudformation template will manage the connections on your root domain, `myhub.com`, hosted zone._ +- `myhub.com` is **_NOT_** used for any other purpose or sites +- `mysite.com` set up on on Route 53 [(?)](./hubs-cloud-aws-domain-recipes.md#setup-external-domains-to-use-route-53-as-the-hostingdns-provider) +- `anothersubdomain.myhub.com` **_could be_** used for any other purposes or sites + +### Instructions: + +**[Set up or purchase 2 domains on Route 53](./hubs-cloud-aws-domain-recipes.md#setup-external-domains-to-use-route-53-as-the-hostingdns-provider)** + +1. `myhub.com` - Houses Hub site domain name + internal server domain +2. `myhub.link` - Short link domain name + +[Known bug + fix: Using a second level domain (.co.uk, .com.fr, etc)?](./hubs-cloud-aws-domain-recipes.md#using-a-second-level-domain-couk-comfr-etc) Use Recipe 3. + +**Next, specify the following when creating the stack:** + +| STACK OPTIONS | RECIPE 1 | +| ----------------------------------- | ---------------------------------- | +| **Site Domain Name** | `myhub.com` **OR** `hub.myhub.com` | +| **Site is Set Up On Route 53** | `Yes` | +| **Internal Domain** | `myhub.com` | +| **Short Link Domain** | `myhub.link` | +| **Outgoing Email Domain** | `myhub.com` | +| **Outgoing Email Subdomain Prefix** | `mail` | + +## Recipe 2: Domain is in-use, configure subdomain for hub on Route 53 + +- `hub.mysite.com` connects to your hub. - _Warning! Do not create a new Hosted Zone for `hub.mysite.com` on Route 53! The Cloudformation template will manage the connections on your root domain, `mysite.com`, hosted zone._ +- `mysite.com` **_IS_** used for other sites or purposes +- `mysite.com` set up on on Route 53 [(?)](./hubs-cloud-aws-domain-recipes.md#setup-external-domains-to-use-route-53-as-the-hostingdns-provider) +- `anothersubdomain.myhub.com` **_could be_** used for any other purposes or sites + +[Known bug + fix: Using a second level domain (.co.uk, .com.fr, etc)?](./hubs-cloud-aws-domain-recipes.md#using-a-second-level-domain-couk-comfr-etc) Use Recipe 3. + +### Instructions: + +**[Set up or purchase 3 domains on Route 53](./hubs-cloud-aws-domain-recipes.md#setup-external-domains-to-use-route-53-as-the-hostingdns-provider)** + +1. `mysite.com` - Houses subdomain as Hub site domain name + the other sites or purposes at the root +2. `myhub.link` - Short link domain name +3. `mysite-internal.com` - Internal server domain. This can be any name you want, and will not be seen by users. + +**Warning!** Do not create a _new_ Hosted Zone for the subdomain `hub.mysite.com` on Route 53. The Cloudformation template will create CNAME records on the Hosted Zone for your root domain, `mysite.com`, to manage the subdomain connections for you. + +**Next, specify the following when creating the stack:** + +| STACK OPTIONS | RECIPE 2 | +| ----------------------------------- | --------------------- | +| **Site Domain Name** | `hub.mysite.com` | +| **Site is Set Up On Route 53** | `Yes` | +| **Internal Domain** | `mysite-internal.com` | +| **Short Link Domain** | `myhub.link` | +| **Outgoing Email Domain** | `mysite.com` | +| **Outgoing Email Subdomain Prefix** | `mail` | + +## Recipe 3: Domain CAN NOT be on Route 53 + +- [When should I use Recipe 3?](./hubs-cloud-aws-domain-recipes.md#when-should-i-use-recipe-3) +- `mysite.com` **_CAN NOT_** be set up on Route 53 [(?)](./hubs-cloud-aws-domain-recipes.md#setup-external-domains-to-use-route-53-as-the-hostingdns-provider) +- `mysite.com` connects to your hub **OR** `hub.mysite.com` connects to your hub + +### Instructions: + +**[Set up or purchase 2 domains on Route 53 (optional 3 domains)](./hubs-cloud-aws-domain-recipes.md#setup-external-domains-to-use-route-53-as-the-hostingdns-provider)** + +1. `myhub.link` - Short link domain name +2. `mysite-internal.com` - Internal server domain + email domain. This can be any name you want, and will not be seen by users. +3. _(optional)_ `mysite-mail.com` - Email domain, if using `mysite-internal.com` for emails is not what you want. + +To use an existing email provider, read through our [Using an Existing Email Provider Guide](./hubs-cloud-aws-existing-email-provider.md) + +**First, follow [Using an Existing Domain: SSL Certificates instructions](./hubs-cloud-aws-existing-domain.md)** + +**Next, specify the following when creating the stack:** + +| STACK OPTIONS | RECIPE 3 | +| ----------------------------------- | ---------------------------------------------------------------------------------------------- | +| **Site Domain Name** | `mysite.com` **OR** `hub.mysite.com` + [SSL certificates](./hubs-cloud-aws-existing-domain.md) | +| **Site is Set Up On Route 53** | `No` | +| **Internal Domain** | `mysite-internal.com` | +| **Short Link Domain** | `myhub.link` | +| **Outgoing Email Domain** | `mysite-internal.com` **OR** `mysite-mail.com` | +| **Outgoing Email Subdomain Prefix** | `mail` | + +**Lastly, after the stack is successfully deployed, follow [Using an Existing Domain: DNS Setup instructions](./hubs-cloud-aws-existing-domain.md)** + +### If you run into any issues: + +1. Check **Site Domain Name** is typed correctly with no typos. +2. Check AWS Console > Route 53 > [Hosted Zones](https://console.aws.amazon.com/route53/home#hosted-zones:) and all of the domains you listed above are [registered](https://console.aws.amazon.com/route53/home#DomainListing:) on Route 53 or you've updated the nameservers for your domains to point to AWS Route 53 as the DNS host +3. Find the rollback error in the stack output for your region [AWS Troubleshooting: see first stack error event](./hubs-cloud-aws-troubleshooting.md#my-aws-stack-says-rollback-complete-after-deploying-what-went-wrong) +4. Troubleshoot any common errors via [AWS Troubleshooting documentation](./hubs-cloud-aws-troubleshooting.md) +5. If you can't find what you need in the rest of our documentation, see the [help page](./help.html) for ways to get in touch. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/estimating-ccu.md b/docs/archive/hubs-cloud/hubs-cloud-aws/estimating-ccu.md new file mode 100644 index 0000000..217aaab --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/estimating-ccu.md @@ -0,0 +1,92 @@ +--- +sidebar_position: 12 +--- + +# Estimating CCU Limits + +This document explains how to estimate what your Hubs Cloud server's CCU (concurrent users) limit is based on the instance type used, for both the entire server and individual rooms. + +## Disclaimer for Estimating CCU Limits + +There are several factors that currently limit how many users can be on a server or in a room in a Hubs Cloud server: + +- Generally speaking, the more **vCPU**'s your instance type has (Please consult [Amazon EC2 Instance Types](https://aws.amazon.com/ec2/instance-types/)), the more overall CCU it can support. + +- The device used by a user may affect their ability to successfully connect to a room. Webkit based browsers (anything on iOS), for example, will hit their own limits past 24 CCU in a room. A lower-end computer may struggle loading/rendering a large number of avatars + additional media in a room in general. This document does not factor in client-side factors, and only concerns itself with server-side limitations. + +- The **more users actively moving around**, and **the more users using devices with head/hand tracking**, the **fewer total users a room can support**. +- Inactive users (in-room but otherwise not speaking/moving) can be considered similar to users in-lobby for the purposes of determining ccu. + +- Various features such as (but not limited to) media uploading, photo/video capture (via the camera tool), and link thumbnail generation, use varying degrees of server resources that may effect CCU limits. + +Please see [AWS Estimating Costs and Cost Charts (Alpha)](./hubs-cloud-aws-estimated-cost-charts.md) for cost estimations. + +## Estimated CCU Table (1 App / 1 Stream server) + +The following table lists measured and estimated CCU for different instance types: + +- **Active** indicates "worst case scenario" where use is in-room and talking and moving with tracked head and hands. + +- **Inactive** indicates user who is either in-lobby or is otherwise not speaking or moving at all while in-room. +- Inactive in-room users are slightly more expensive than in-lobby users both due to WebRTC handshaking required to establish 2-way communication and "heartbeat" messages that are infrequently sent by the client. + +| AWS Instance Type | vCPUs | Max **Active** CCU, single-room | Max **Inactive** CCU (w/ 25 active CCU), single-room | Max **Inactive** CCU (w/ 10 active CCU), single-room | Max **Rooms** w/25 active CCU | +| ----------------- | ----: | ------------------------------: | ---------------------------------------------------: | ---------------------------------------------------: | ----------------------------: | +| t3.medium | 2 | 45 | 45 | 140 | 5 | +| t3.large | 2 | ~45 | ~45 | ~140 | ~5 | +| t3.xlarge | 4 | ~65 | ~90 | ~290 | ~8 | +| t3.2xlarge | 8 | 80 | 200 | 600 | 12 | +| c4.large | 2 | 40 | 45 | 125 | 3 | +| c5.large | 2 | 50 | 70 | 180 | 4 | +| c5.xlarge | 4 | 65 | 90 | 290 | 8 | +| c5.2xlarge | 8 | ~80 | ~200 | ~600 | ~12 | +| c5.24xlarge | 96 | ~100 | ~3200 | ~9600 | ~184 | + +- **~** indicates that the number is calculated and not measured from benchmarking. +- c5.24xlarge numbers are **very** theoretical, actual results may vary. + +## Formulas to calculate CCU: + +**Warning: Napkin Math Ahead** + +### Max Active CCU, single room + +where C = # of vCPU's + +**Max Active CCU** = √(~1000 \* C) + +### Max Inactive CCU w/ X active CCU, single room: + +**Max Inactive CCU** = (**Max Active CCU**² - X²) / X + +### Max rooms w/ 25 active CCU: + +where C = # of vCPU's + +**Max Rooms** = ~2 \* C + +## FAQ + +### Can I use a t3.micro or a t3.small? + +t3.micro only has 1GB of memory, and is not recommended. t3.small has 2GB of memory, and may be sufficient for small gatherings or casual testing. + +### What's the difference between a t3.medium and a t3.large? + +t3.medium and t3.large only differ in memory, which will benefit the server during high-memory usage situations. + +### What's the difference between a c4.large and c5.large? + +While the c4.large and c5.large have similar vCPU and memory, the c4.large has only a fraction of the networking performance/bandwidth of the c5.large. + +### What if I use more than 1 app/stream server? + +Using more servers, or "scaling horizontally", will increase overall server CCU but not per-room CCU. + +### Can I use different instance types for app/stream servers? + +At the time of writing this document, app servers are more resource demanding than stream servers (except possibly in cases of high video/screen sharing usage). You may be able to use a smaller instance type for stream servers and maintain relative similar CCU numbers. + +### How do I increase the max user cap in a room? + +From the admin panel, server admins can adjust **Default room size** and **Maximum room size** under "Setup-> App Settings-> Rooms". Room admins may adjust **Room Size** under "Room Settings" to within that range. This only affects the maximum number of users allowed "in-room" and does not currently limit "in-lobby" users. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/estimating-cost.md b/docs/archive/hubs-cloud/hubs-cloud-aws/estimating-cost.md new file mode 100644 index 0000000..c840ae4 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/estimating-cost.md @@ -0,0 +1,184 @@ +--- +sidebar_position: 11 +--- + +# Estimating Cost Charts (Alpha) + +This document explains how to estimate your costs. For a full description on: + +- How do costs work for Hubs Cloud? +- Minimizing costs - Recommended user story +- Minimizing costs - Settings in stack template + +See our [Costs and Minimizing Costs Information](./hubs-cloud-aws-costs.md) page. + +## Disclaimer for Estimating Costs + +Estimating costs is difficult because AWS bills by resource usage and everyone uses Hubs differently. Below are **estimates** from our tests and should not be used as a source of truth for your AWS Hubs Cloud costs. + +**Are these estimates within range for you?** [Accuracy Assessment Hubs Cloud AWS Cost Charts](https://forms.gle/WD5dQ6k2zEjTkYQR6) + +### Accurately Predict Future Costs - AWS Cost Explorer + +For the **most accurate** way to see previous costs to predict your future costs enable: + +- [AWS Cost Explorer](https://console.aws.amazon.com/billing/home) +- [AWS Cost Explorer Documentation](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/ce-what-is.html) + +## Estimate your Event Cost + +Read the [Recommended User Story in Minimizing Costs Page](./hubs-cloud-aws-costs.md#minimize-your-costs---a-user-story) first, to understand this calculation better. + +## Rough Calculation for Estimating Costs + +**Are these estimates within range for you?** [Accuracy Assessment Hubs Cloud AWS Cost Charts](https://forms.gle/WD5dQ6k2zEjTkYQR6) + +- **\# of servers** = Personal (1 server), Enterprise multi-server (varies, 2 app x 2 stream = 4 servers) +- **# Hours in state** expected to be in estimated Scalar state +- **Cost for EC2 (US\$/hr)** see below [estimate cost charts (alpha)](./hubs-cloud-aws-estimated-cost-charts.md#estimate-costs-charts-alpha) +- **SCALAR** _Roughly_ estimate costs of running other services like RDS, EFS, and Data transfer costs. + - **5x** - **roughly** TOP ACTIVE CAPACITY, estimate a hard upper bound and heavy other service use: top CCU capacity, streaming videos, large scenes, avatars moving and talking. + - **4x** - AVERAGE USE for other service: no videos, some people connected + - **2x, 3x** - ACTIVE, a few people are connected, setting up development environment or creating scenes + - **2x** - ONLINE, NOT ACTIVE, database pausing is off + - **1.2x** - ONLINE, NOT ACTIVE, not connected and database pausing is on + - **~ 0x** - Offline mode, paying only for scene, avatar assets and backups + - [To understand these states, read Recommended User Story in Minimizing Costs Page](./hubs-cloud-aws-costs.md#minimize-your-costs---a-user-story) +- Use AWS's cost explorer to estimate previous costs for future ones. + +### THE FORMULA + +> **Estimate for stack state (\$)** = **# Hours in state** x **Cost for EC2 (US\$/hr)** x **# of servers** x **SCALAR (#)** + +#### Hubs Cloud Cost Rough Estimate + +1. **Base cost (easier to estimate)** = Setup Cost + Off-time (Scaled down "Online Not Active" or "Offline") +2. **Min Total Event Cost** = Min Top Capacity Est. + Base cost +3. **Max Total Event Cost** = Max Top Capacity Estimated + Base cost + +### EXAMPLE COST ESTIMATE + +Event with expected 500 CCU for 4 hours for 2 days. Cost charts estimate an Enterprise 2x2 **c5.xlarge** instance is sufficient. + +1. Calculate Top Capacity Min to Max Range + + - **Minimum Top Capacity Est. (~ \$103.68)** = (4hrs x 2days) x (\$1.08 - _c5.xlarge_) x (4 - _Enterprise 2x2_) x 3 SCALAR + - 3x SCALAR reasoning - people will be connected, with a few streaming videos in rooms + - **Max Top Capacity Est. (~ \$172.80)** = (4hrs x 2days) x (\$1.08 - _c5.xlarge_) x (4 - _Enterprise 2x2_) x 5 SCALAR + - 5x SCALAR reasoning - upper bound for costs just in case + +2. Off-time, I'm putting the instance in **offline** mode. + + - ~$0 - ~$10 for storing backups + - If you want the instance to be online, do [THE FORMULA](./hubs-cloud-aws-estimated-cost-charts.md#the-formula) calculation for a different instance size. Use x1.2 SCALAR for database pausing and x2 SCALAR for database pausing off. + +3. During setup/development, I use the **t3.medium**. I need to create scenes + deploy a custom client. I estimate that will take me an active 16 hours. + + - Development cost (~ $43) = (16 hrs) x ($0.224 - _t3.medium_) x (4 - _Enterprise 2x2_) x 3 (reasoning, upper bound for costs just in case) + +#### EXAMPLE TOTAL COST ESTIMATE + +1. **Base cost** = (Setup = \$43) + (Off-time = ~ \$0) = **~ \$43** +1. **Min Total Event Cost** = (Min Top Capacity Est. = ~ \$103.68) + (Base cost = ~ \$43) = **~ \$146.68** +1. **Max Total Event Cost** = (Max Top Capacity Est. = ~ \$172.80) + (Base cost = ~ \$43) = **~ \$216.80** + +Rough HC Cost Range for Example Event = **~ \$146.68** - **~ \$216.80** + +### Minimize # Hours at top Capacity to Minimize Cost + +**If you are diligent with decreasing the # of hours at top capacity**, outlined in the [minimizing costs user story](./hubs-cloud-aws-costs.md#minimize-your-costs---a-user-story), your event costs can be extremely low especially when comparing an in-person event: + +- Scale the EC2 instance down during lower traffic +- Turn on offline mode (costs are extremely minimal because the EC2 costs + RDS costs + EFS costs are down and you're only storing backups) +- Enable database pausing +- Use Cloudflare for content CDN - not recommended if you're streaming videos +- Read more about these settings in [minimizing costs user story](./hubs-cloud-aws-costs.md#minimize-your-costs---a-user-story) + +## EC2 Server Type Recommendations + +**See Cost Charts BELOW to factor costs with the recommendations.** + +**t3.medium** is recommended for development/setup with only a few users connecting + setting rooms + scenes. + +**Note:** This does **not** exclude the **t3.small**, see what works for you. Scale the server type up or down ad hoc via [updating the stack](./hubs-cloud-aws-updating-the-stack.md). + +**c4.large** is recommended for during an event. + +**Note:** This does **not** exclude any other instances types, see what works for you. Scale the server type up or down ad hoc based on performance via [updating the stack](./hubs-cloud-aws-updating-the-stack.md). + +**We do not recommend using a t3.micro because of low memory.** + +### Why Enterprise 2 app x 2 stream? + +**We recommend using an Enterprise 2x2 multi-server setup to optimize for resiliency.** If one server goes down suddenly, the other will take its place without your users noticing. + +**Scale vertically before scaling horizontally.** Horizontal scaling can result in running out of Let's Encrypt Certificates between servers (we've seen this for 12x12 builds). + +For very large events 4x4 and 8x8 Enterprise multiserver stacks are recommended. + +## Estimate Costs Charts (Alpha) + +### How to read and use Cost Charts (Alpha) + +- **CCU** is the concurrent users connected on an instance. +- **vCPU (#)** is defined by the EC2 Server Type see [Amazon EC2 Instance Types Documentation](https://aws.amazon.com/ec2/instance-types/). +- **CCU Min** - Max CCU for active avatars (lot of avatar movement, talking, at a meetup, etc.) +- **CCU Max** - Max CCU for mostly inactive avatars (only watching a video, 1 avatar speaking) +- **Cost for EC2 (US\$/hr)** - Cost per hour for running the EC2 instance type in us-east-1 (N. Virginia). +- Note: t3.micro, t3.small, t3.medium have smaller CCU/vCPU because of past performance experience and lower memory. + +Below are our CCU estimates for best performance. Performance may vary depending on client power: high power devices (Desktop/VR) vs. low power devices (Mobile). + +Use the [Rough calculation section](./hubs-cloud-aws-estimated-cost-charts.md#rough-calculation-for-estimating-costs) to get estimates. + +To see how vCPU to CCU Min/Max was estimated see [AWS Estimated CCU Limits](./hubs-cloud-aws-estimated-ccu-limits.md). + +### Estimating Personal / Enterprise Costs with 1 server + +[How to read and use Alpha Cost Charts](./hubs-cloud-aws-estimated-cost-charts.md#how-to-read-and-use-alpha-cost-charts) + +| EC2 Server Type | vCPU (#) | CCU Min | CCU Max | Cost for EC2 (US\$/hr) | +| ------------------------------ | -------- | ------- | ------- | ---------------------- | +| t3.micro _**NOT recommended**_ | 2 | N/A | N/A | \$0.024 | +| t3.small | 2 | 10 | 20 | \$0.035 | +| t3.medium | 2 | 20 | 40 | \$0.056 | +| t3.large | 2 | 40 | 80 | \$0.183 | +| t3.xlarge | 4 | 80 | 160 | \$0.266 | +| t3.2xlarge | 8 | 160 | 320 | \$0.433 | +| c4.large | 2 | 40 | 80 | \$0.200 | +| c5.large | 2 | 40 | 80 | \$0.185 | +| c5.xlarge | 4 | 80 | 160 | \$0.270 | +| c5.2xlarge | 8 | 160 | 320 | \$0.440 | +| c5.4xlarge | 16 | 320 | 640 | \$0.780 | +| c5.9xlarge | 36 | 720 | 1,440 | \$1.630 | +| c5.12xlarge | 48 | 960 | 1,920 | \$2.140 | +| c5.18xlarge | 72 | 1,440 | 2,880 | \$3.160 | +| c5.24xlarge | 96 | 1,920 | 3,840 | \$4.180 | + +### Estimating Enterprise Costs for 4 servers + +2 app x 2 streaming servers recommended for best performance. [Why?](./hubs-cloud-aws-estimated-cost-charts.md#why-enterprise-2-app-x-2-stream) + +[How to read and use Alpha Cost Charts](./hubs-cloud-aws-estimated-cost-charts.md#how-to-read-and-use-alpha-cost-charts) + +| EC2 Server Type | Total vCPU (#) | Min CCU | Max CCU | Cost for EC2 (US\$/hr) | +| ------------------------------ | -------------- | ------- | ------- | ---------------------- | +| t3.micro _**NOT recommended**_ | 8 | N/A | N/A | \$0.096 | +| t3.small | 8 | 80 | 160 | \$0.140 | +| t3.medium | 8 | 80 | 160 | \$0.224 | +| t3.large | 8 | 240 | 400 | \$0.732 | +| t3.xlarge | 16 | 480 | 800 | \$1.064 | +| t3.2xlarge | 32 | 960 | 1,600 | \$1.732 | +| c4.large | 8 | 240 | 400 | \$0.800 | +| c5.large | 8 | 240 | 400 | \$0.740 | +| c5.xlarge | 16 | 480 | 800 | \$1.080 | +| c5.2xlarge | 32 | 960 | 1,600 | \$1.760 | +| c5.4xlarge | 64 | 1,920 | 3,200 | \$3.120 | +| c5.9xlarge | 144 | 4,320 | 7,200 | \$6.520 | +| c5.12xlarge | 192 | 5,760 | 9,600 | \$8.560 | +| c5.18xlarge | 288 | 8,640 | 14,400 | \$12.640 | +| c5.24xlarge | 384 | 11,520 | 19,200 | \$16.720 | + +## Are these estimates within range for you? + +Tell us here: [Accuracy Assessment Hubs Cloud AWS Cost Charts](https://forms.gle/WD5dQ6k2zEjTkYQR6) diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/existing-domain.md b/docs/archive/hubs-cloud/hubs-cloud-aws/existing-domain.md new file mode 100644 index 0000000..aa71e0c --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/existing-domain.md @@ -0,0 +1,24 @@ +--- +sidebar_position: 3 +--- + +# Using an Existing Domain + +**Interested in using an existing domain or subdomain for your hub?** + +Follow below instructions if you're following Recipe 3. [When should I use Recipe 3?](./hubs-cloud-aws-domain-recipes.md#when-should-i-use-recipe-3) + +If your domains are NOT being used for anything else, we highly recommend setting up your domain to point to AWS Route 53 Hosted Zone. [Instructions here](./hubs-cloud-aws-domain-recipes.md#setup-external-domains-to-use-route-53-as-the-hostingdns-provider) +[] + +**If you want to use your existing email, see our [Using an Existing Email Provider guide](./hubs-cloud-aws-existing-email-provider.md)**. Otherwise, walk through the Domain Recipes #3 guide for configuring AWS SES email via stack creation. + +### Before creating the stack: SSL Certificates + +If you choose not to transfer, you'll need to create two SSL certificates for your existing domain using the AWS Certificate Manager, one in the same region for your stack, and another in us-east-1 (if that's not the region your stack is in.) See the CloudFormation stack creation form in the **'Domain Configuration'** section for full instructions. + +Also, if you do not transfer your domain to Route 53, you will need to manually renew SSL certificates you've created in Amazon Certificate Manager each year, and perform a stack update providing the new certificate ARNs. (See below for how to perform stack updates.) + +### After creating the stack: DNS Setup + +Finally after the stack is created, if you are using an external DNS provider like GoDaddy or Namecheap, look in the stack "Outputs" for the "AddressForRootDomain" field -- you will need to create a new CNAME in your domain's DNS to point there to get your domain pointing to your hub. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/existing-email.md b/docs/archive/hubs-cloud/hubs-cloud-aws/existing-email.md new file mode 100644 index 0000000..455a006 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/existing-email.md @@ -0,0 +1,9 @@ +--- +sidebar_position: 4 +--- + +# Using an Existing Email Provider + +By default your hub will be set up with Amazon Simple Email Service for email on a Route 53 domain you specify. You can also use your own SMTP settings for sending email. If you have your own SMTP settings you'd like to use, choose the same domain as your "Internal Domain Name" for the "Outgoing Email Domain" when creating the stack. You'll still need to click through the verification email you will receive during stack creation in order to log into your administrator account during the setup process. + +Once your hub is up and running you can set your email provider's custom SMTP information in your hub's admin console in the Server Settings section. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/known-issues.md b/docs/archive/hubs-cloud/hubs-cloud-aws/known-issues.md new file mode 100644 index 0000000..42d196e --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/known-issues.md @@ -0,0 +1,9 @@ +--- +sidebar_position: 8 +--- + +# Known Issues + +#### I get the error "Value for parameter availabilityZone is invalid. Subnets can currently only be created in the following availability zones: X, Y + +This is a known issue with AWS. See: https://github.com/widdix/aws-cf-templates/issues/36. To fix it, you will need to adjust the "Subnet Availability Zones" values in the 'Advanced' section to select an alternative Subnet configuration that matches X, Y and try again. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/quick-start.md b/docs/archive/hubs-cloud/hubs-cloud-aws/quick-start.md new file mode 100644 index 0000000..89daec7 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/quick-start.md @@ -0,0 +1,69 @@ +--- +sidebar_position: 1 +--- + +# AWS Quick Start + +## Before creating the Hubs Cloud Stack + +**Follow along:** [Video Tutorial: How to Deploy Hubs Cloud Part 1](https://www.youtube.com/watch?v=2K7P8jFyHNc) + +1. Create an account on AWS and log into the console. +2. Register or setup any domains in AWS Route 53, you'll need at least 2 domains. For example: `myhub.com` and `myhub.link`. See [Domain Recipes](./hubs-cloud-aws-domain-recipes.md) for more info. +3. Review relevant docs: + - [Why use Hubs Cloud vs. hubs.mozilla.com?](./hubs-cloud-faq.md#why-use-hubs-cloud-vs-hubsmozillacom) + - [Personal vs. Enterprise](./hubs-cloud-faq.md#personal-vs-enterprise) + - [Cost Information](./hubs-cloud-aws-costs.md) +4. Create an SSH keypair to access your servers + - [Follow AWS guide to create the SSH keypair in your deployment region](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#having-ec2-create-your-key-pair) + - Deployment region is in the upper right corner with your username and support + - Save the private key using preferred format + +## Deploy your Hubs Cloud Stack + +**Follow along:** [Video Tutorial: How to Deploy Hubs Cloud Part 2](https://www.youtube.com/watch?v=W0erzlDpo0U) + +1. Go to https://hubs.mozilla.com/cloud and choose which Hubs Cloud product to deploy +2. Click **"Continue to Subscribe"** on Hubs Cloud Personal AWS Marketplace page +3. Click **"Continue to Configuration"** +4. Select your desired **"Region"** + - For Enterprise select your desired **"Delivery Method"**: + - **"Multi-server"** + - **"Single Server"** + - Then your desired **"Region"** +5. Click **"Continue to Launch"** +6. Change **"Select a launch action"** dropdown to **"Launch CloudFormation"** then click **"Launch"** +7. Select **"Next"** in bottom right corner of the **"Create stack"** or **"Specify template"** page +8. In specify stack details: + - Name your stack, something like: **"your-hub-name-1"** + - Account Configuration Administrator Email Address + - NO CAPITALIZED LETTERS + - The admin for your hub + - For these parameters use [Domain Recipes](./hubs-cloud-aws-domain-recipes.md) for guidance: `Site Domain Name`, `Site is Set Up On Route 53`, `Internal Domain`, `Short Link Domain`, `Outgoing Email Domain`, and `Outgoing Email Subdomain Prefix` + - Double check for no typos! + - Choose your `KeyPair` from Before Creating the Stack: Step 4 + - If you are using an existing domain not on AWS Route 53, you'll need to perform a few extra steps - See [Using an existing domain](./hubs-cloud-aws-existing-domain.md) + - Choose a setting for `Restrict SSH Access` + - Review the other options, or keep the defaults. You can update most of these later via a [Stack Update](./hubs-cloud-aws-updating-the-stack.md) +9. Select **"Next"** +10. Agree to Terms of Service checkboxes +11. Wait 20-30 minutes for the stack to complete deploying + - Any issues? Check out [AWS Troubleshooting](./hubs-cloud-aws-troubleshooting.md) for solutions to common problems. +12. Confirm your `Administrator Email Address` in your inbox, it will be confirming your email in **N. Virginia** +13. After stack is created, hit your site at your primary domain, wait 20 to 30 seconds +14. Login with your `Administrator Email Address` + +## After Deployment Admin Setup + +**Follow along:** [Video Tutorial: How to Deploy Hubs Cloud Part 3](https://www.youtube.com/watch?v=nQ85L_EeJOk) + +1. Set up AWS Simple Email Service (SES) in **N. Virginia (us-east-1)** for **_all_** deploy regions to get out of the SES Sandbox [Follow #2 Send request to AWS for limit increase](./hubs-cloud-aws-troubleshooting.md#youre-in-the-aws-sandbox-and-people-dont-receive-magic-link-emails) + - For immediate entry to your HC instance, verify individual email addresses [Follow #1 Verify individual email addresses for administrators](./hubs-cloud-aws-troubleshooting.md#youre-in-the-aws-sandbox-and-people-dont-receive-magic-link-emails) +2. Follow guide in **Admin Panel** > **Content CDN** menu to setup Cloudflare workers to decrease costs +3. Proceed with process to add scenes and avatars in the [Getting Started with Hubs Cloud](./hubs-cloud-getting-started.md) guide! + +**Congrats you've successfully set everything up!** + +#### Any issues deploying? + +Check out [AWS Troubleshooting](./hubs-cloud-aws-troubleshooting.md) for solutions to common problems. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/system-architecture.md b/docs/archive/hubs-cloud/hubs-cloud-aws/system-architecture.md new file mode 100644 index 0000000..7d5103d --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/system-architecture.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 9 +--- + +# System Architecture + +![AWS Architecture](/img/hubs-cloud-aws-architecture.jpeg) + +When you create your stack, a new VPC is created with two public subnets. + +Hubs Cloud on AWS sets up two auto-scaling groups, one for app servers and one for (optional) streaming servers. Servers are balanced across two AZs. App servers provide the core app functionality and streaming servers can be added to increase resources for voice and video streaming. + +AWS Cloudfront is configured for edge caching of content, and AWS lambda is used for several features such as image resizing, video transcoding, and website thumbnailing. + +When setting up your stack, you can also optionally enable an Application Load Balancer to balance load across multiple servers. If you do not use an ALB, DNS based round robin load balancing is used instead. + +AWS Simple Email Service is used for email unless you configure a custom SMTP server. + +Uploaded assets are stored on Elastic File Store, and static assets (JS/CSS/Images) are stored on S3. The database is a PostgreSQL compatible AWS Aurora Serverless database, which will be paused if not in-use unless configured to have pausing disabled. + +Configuration secrets are stored in AWS Secrets Manager as well as AWS Parameter Store as encrypted strings. + +Data in EFS and RDS is stored encrypted-at-rest. diff --git a/docs/archive/hubs-cloud/hubs-cloud-aws/updating-the-stack.md b/docs/archive/hubs-cloud/hubs-cloud-aws/updating-the-stack.md new file mode 100644 index 0000000..5071ca0 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-aws/updating-the-stack.md @@ -0,0 +1,60 @@ +--- +sidebar_position: 5 +--- + +# Updating the Stack + +You can change various settings of your hub's stack by performing a stack Update. You will not experience any downtime when making these changes. To Update your stack: + +- Select the stack in the CloudFormation console +- Go to Stack Actions -> Update Stack +- Choose "Use current template" +- Review the parameter selections and choose 'Update' + +Some of the things you can do via a stack update: + +- Change the number and type of servers +- Switch your hub into Offline Mode to save costs (and redirect to a URL) +- Add or change a monthly database budget or adjust storage limits +- Add or remove an Application Load Balancer +- Disable or enable database auto-pausing +- Change the database max ACU capacity +- Change the SSH keypair used by your servers + +Some things you should **not** update or change after the stack is created, and should leave as-is: + +- Your domains or mail settings +- Everything under **Restore from Backup** section (to restore from a backup, see [Backup and Restore](./hubs-cloud-aws-backup-and-restore.md)) +- Everything under **Advanced** + +## ✨📝 Upgrade your Hubs Cloud template to the latest + +Infrequently, we'll need to update the Hubs Cloud template which follows this manual update workflow. + +Updating the template changes the underlying aws infrastructure or services such as: machine images, lambdas, autoscaling groups, or machine startup scripts. + +💾 Before following the steps below, make sure you've backed up your stack just in case: [💾 Backup and Restore](./hubs-cloud-aws-backup-and-restore.md) + +1. 🔎 **Determine whether your stack is Hubs Cloud Personal, Enterprise single server, or Enterprise multi-server** + 1. Cloudformation > Stacks > Select your stack > Parameters tab + 1. Does your stack have # of App Servers or # of Streaming Servers listed? + 1. If yes, you have Enterprise multi-server + 1. If no, you have Personal or Enterprise single server +1. 💤 **Update your stack to Offline Mode see [⬆️ Updating the stack](./hubs-cloud-aws-updating-the-stack.md)** +1. ⌛ **Wait for the Offline Mode update to complete** +1. 📎 **Next, get the latest Template URL from the AWS Marketplace flow (_DO NOT CREATE A NEW STACK_)** + 1. Open new tab and go to [hubs.mozilla.com/cloud](https://hubs.mozilla.com/cloud) + 1. Select Personal or Enterprise (depending on step 1) then go through the AWS Marketplace flow, **but do not create the stack** + 1. Continue to subscribe --> Continue to config --> Continue to Launch --> Choose Action Launch Cloud Formation --> Launch + 1. Go to "Create stack" page: Step 1 Specify template page + 1. Copy **"Amazon S3 URL"** from Specify template section +1. 📝 **Replace the current template of your live stack** + 1. Cloudformation > Stacks > Select your stack + 1. Click Update + 1. Select "Replace current template" + 1. Paste previously copied **"Amazon S3 URL"** from step 4 in Amazon S3 URL section + 1. Click Next + 1. ✅ Do all filled in values look correct? If they do **NOT** look correct, then you may have copied the wrong Personal/Enterprise template! Go back to replace template step. Then copy and paste the correct template from step 4 again. +1. ⌛ **Finish the stack update with the new template stay in Offline Mode** +1. 🌅 **After the update is complete, [⬆️ update the stack](./hubs-cloud-aws-updating-the-stack.md) to Online Mode (out of Offline Mode)** +1. 🎉 **Finished! Congrats!** 🎉 diff --git a/docs/archive/hubs-cloud/hubs-cloud-do/_category_.json b/docs/archive/hubs-cloud/hubs-cloud-do/_category_.json new file mode 100644 index 0000000..810cf00 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-do/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Hubs Cloud DigitalOcean", + "position": 2, + "link": { + "type": "generated-index" + } +} diff --git a/docs/archive/hubs-cloud/hubs-cloud-do/do-quick-start.md b/docs/archive/hubs-cloud/hubs-cloud-do/do-quick-start.md new file mode 100644 index 0000000..b95db18 --- /dev/null +++ b/docs/archive/hubs-cloud/hubs-cloud-do/do-quick-start.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 1 +--- + +# DigitalOcean Quick Start + +> **Warning! Hubs Cloud for DigitalOcean is in alpha and provided as is.** +> +> We're unable to provide the level of support as we do for the AWS version. + +Hubs Cloud DigitalOcean can be found on [DigitalOcean Marketplace](https://marketplace.digitalocean.com/apps/hubs-cloud-personal). + +1. You'll need two registered domain names, one for your hub and one for short room links. We recommend using .link domains for short links. Make sure to update the DNS for your domains to [point to DigitalOcean's nameservers](https://www.digitalocean.com/community/tutorials/how-to-point-to-digitalocean-nameservers-from-common-domain-registrars). + +2. [Create your Droplet](https://marketplace.digitalocean.com/apps/hubs-cloud-personal) via the DigitalOcean Marketplace. For testing a \$5 droplet will work just fine. Larger droplets will be required to support more users. In the alpha stage we don't really have particular recommendations, so experiment and let us know what works for you! + + - If you want additional storage for uploads, avatars, and scenes, you should attach a block storage volume. + - If you already have a DigitalOcean project, assign your droplet to your project now. Otherwise you can do this when you create your project in step 4. + +3. Add your two domains to your DigitalOcean project by [adding them to networking](https://cloud.digitalocean.com/networking/domains). + + - If you've already created a DigitalOcean project, add the domains to your project via the "Move Resources" button in the project view. Otherwise, you can add them in the next step when creating a new project. + +4. [Create a New Project](https://cloud.digitalocean.com/projects/new) for your hub and assign your domains and droplet as resources. + + - By associating your domains with your project, we'll be able to automatically add the necessary DNS records for you. + - Otherwise, you'll have to add the necessary DNS records yourself. The setup script (step 8) will tell you what records to add. + +5. Hubs Cloud uses email magic links to log in. You'll need SMTP connection info from an email provider to send these emails. + + - We recommend using [SendGrid](https://www.sendgrid.com) and using port 2525 to prevent firewall blocking. To use SendGrid for SMTP, create an account and then go to the [SMTP Integration](https://app.sendgrid.com/guide/integrate/langs/smtp) to get an SMTP username and password. + - SendGrid has an additional step to [authenticate your domain](https://sendgrid.com/docs/ui/account-and-settings/how-to-set-up-domain-authentication) before your emails will start being sent. + +6. [Create a writable DigitalOcean API token](https://cloud.digitalocean.com/account/api/tokens/new). This token will be needed during setup for configuring DNS, firewall, etc as it allows the setup script to update your project/droplet as needed. + + - The token **won't** be saved and you can remove it from your account once your hub is up. + +7. Once your droplet has started, SSH in as root to complete the setup process. Ex: `ssh root@x.x.x.x` You can find the ip address of your droplet at the top of the droplet detail page in the DigitalOcean dashboard. Depending on how you configured authentication when creating your droplet you will need to either provide the one time password given to you or simply use a pre-configured ssh key. + +8. Upon login the Hubs Cloud setup wizard will start automatically. This will guide you through all the rest of the steps required to get you Hubs Cloud instance up and running. If you ever need to change the settings you entered during setup or if you exited it for any other reason you can re-run it by running `/opt/polycosm/setup.sh` + - You will need to provide a database or create a DigitalOcean Managed Database during setup. DigitalOcean Managed Databases start at \$15/mo [See pricing for all DigitalOcean services here](https://www.digitalocean.com/pricing/). + +DigitalOcean is currently an **alpha** pre-release. If you run into any issues, see the [help page](./help.html) for ways you can get in touch. + +> **Warning! Hubs Cloud for DigitalOcean is in alpha and provided as is.** +> +> We're unable to provide the level of support as we do for the AWS version. diff --git a/docs/archive/hubs-cloud/importing-content.md b/docs/archive/hubs-cloud/importing-content.md new file mode 100644 index 0000000..9f7bd4a --- /dev/null +++ b/docs/archive/hubs-cloud/importing-content.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 4 +--- + +# Importing Content + +The two forms of content you can import into Hubs Cloud are **avatars** and **scenes**. Avatars are 3D figures like robots, humans, and ducks that can be worn by visitors to represent themselves, and scenes are 3D environments like interiors and landscapes that provide visual grounding for a room. + +Mozilla offers a number of [Asset Packs](./hubs-cloud-asset-packs.md) you can import to add some initial content to your hub. Additionally, you can import any custom content you've created, either on [hubs.mozilla.com](https://hubs.mozilla.com), or using the tools like the [Scene Editor](./hubs-cloud-enable-scene-editor.md) available on your hub. For more information about the Scene Editor, see [Spoke Documentation](http://hubs.local:3000/docs/docs/spoke-creating-projects.html)[^1]. + +### Admin Import Tool + +To start importing content, navigate to the "Import Content" tool from the Admin Console. If you don't remember how to get to the Admin Console, see the [Getting Started](./hubs-cloud-getting-started.md) Guide. + +[^1]: 'Spoke' is the Mozilla trademarked name used for the Scene Editor on [hubs.mozilla.com](https://hubs.mozilla.com). + +![Hubs Cloud Import Content](/img/hubs-cloud-import-content.jpeg) + +Once there, you'll need to specify a URL to import: + +![Hubs Cloud Import Content URL](/img/hubs-cloud-import-content-url.jpeg) + +You can enter comma-separated URLs to scenes or avatars on another hub ([example scene](https://hubs.mozilla.com/scenes/rWgv5zN/winter-cheer), [example avatar](https://hubs.mozilla.com/avatars/PcJ8Sxb)). Or, you can specify a link to an [asset pack](./hubs-cloud-asset-packs.md). + +Once you've specified the content URL, you will see a preview of the content you're planning to import. You can then choose to exclude or include certain items and set special tags: + +![Hubs Cloud Import Content UI](/img/hubs-cloud-import-ui.jpeg) + +When ready, click the Import button to begin importing your content. + +### Special tags + +You should also set the proper tags for the imported items for your hub to be ready to use: + +- Import at least one **Default** avatar, which new visitors will have by default. +- Import at least one **Default** scene, which new rooms will have by default. +- Import at least one **Base** avatar, which can easily be re-skinned by visitors. +- Optionally **Feature** one or more items, which will cause those items to be easily discoverable by visitors. + +For more information about special tags, see [Managing Content](./hubs-cloud-managing-content.md). + +### Updating Imported Content + +To refresh content you've imported, simply import it again. If you've previously imported the same content, the existing avatar or scene in your hub will be updated in-place with the newest version of the imported content. diff --git a/docs/archive/hubs-cloud/introduction.md b/docs/archive/hubs-cloud/introduction.md new file mode 100644 index 0000000..c1bebbf --- /dev/null +++ b/docs/archive/hubs-cloud/introduction.md @@ -0,0 +1,31 @@ +--- +sidebar_position: 2.1 +--- + +# Introduction + +![Hubs Cloud](/img/hubs-cloud-logo.jpeg) + +**NOTICE: HUBS CLOUD WILL BE REPLACED BY COMMUNITY EDITION. +PRO TIER IS AVAILABLE NOW TO EASILY DEPLOY CUSTOM CLIENTS ON YOUR OWN DOMAINS +READ MORE [HERE](https://hubs.mozilla.com/#subscribe)** + +[Hubs Cloud](https://hubs.mozilla.com/cloud) allows you to run your own hub on a private server. + +### Set up your own Hubs Cloud server: + +- For AWS, see the [AWS Quick Start](./hubs-cloud-aws-quick-start.md) +- For DigitalOcean, see the [DigitalOcean Quick Start](./hubs-cloud-do-quick-start.md) +- Once your hub is up, see the [Getting Started Guide](./hubs-cloud-getting-started.md) + +### Hubs Cloud Key Features: + +- Use your own domain name. +- Customize the branding, styling, and colors. +- Customize features such as security and media. +- Customize the content library of avatars and scenes. +- Run a custom version of the software to add features and functionality. + +**Currently, Hubs Cloud is offered on AWS and DigitalOcean.** + +**Note: If you're looking for community Edition, which is the replacement for hubs cloud that you can bring anywhere as a dev, read [Hubs Community Edition](./hubs-community-edition-intro.md)** diff --git a/docs/archive/hubs-cloud/limiting-access.md b/docs/archive/hubs-cloud/limiting-access.md new file mode 100644 index 0000000..1f67182 --- /dev/null +++ b/docs/archive/hubs-cloud/limiting-access.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 10 +--- + +# Limiting Access + +This guide shows you how to lockdown your hub and rooms by **account only access** (accounts created by your admin from an email list) or by **using the Hubs Discord bot**. + +## Configure your hub to deny users without accounts + +To lockdown your instance, you remove account creation for non-admins and lock your instance to account access only. Before or after you lockdown your instance to accounts, as the hub admin, you can create accounts for a list of emails or disable existing accounts. + +1. **(Account management) Create accounts for approved emails** + 1. Admin Panel > Accounts menu - [_NetworkError?_](./hubs-cloud-aws-troubleshooting.md#in-my-hubs-admin-panel-i-see-networkerror-or-not-found-page-or-no-data-populates-in-any-of-the-admin-menus) + 2. Batch create accounts (with optional identities) + - Single example: email1,identity1 + - Multiple example: email1,identity1;email2;email3,identity3 with spaces;email4 +2. **(Account management) Remove access to existing accounts by "Disabling" accounts** + 1. Admin Panel > Accounts menu - [_NetworkError?_](./hubs-cloud-aws-troubleshooting.md#in-my-hubs-admin-panel-i-see-networkerror-or-not-found-page-or-no-data-populates-in-any-of-the-admin-menus) + 2. Paste email address in "Find an account with an email address" text box + 3. Select "FIND" + 4. Change "State" dropdown to "disabled" + 5. Click "Save" +3. **Remove account creation for non-admins** + 1. Admin Panel > Setup: App Settings - [_Not Found page?_](./hubs-cloud-aws-troubleshooting.md#in-my-hubs-admin-panel-i-see-networkerror-or-not-found-page-or-no-data-populates-in-any-of-the-admin-menus) + 2. Select "Features" tab + 3. Enable "Disable account creation" +4. **Lock your hub to only accounts can access** + 1. Admin Panel > Setup: App Settings - [_Not Found page?_](./hubs-cloud-aws-troubleshooting.md#in-my-hubs-admin-panel-i-see-networkerror-or-not-found-page-or-no-data-populates-in-any-of-the-admin-menus) + 2. Select "Rooms" tab + 3. Enable "Require accounts for room access" + +**Congrats! You've successfully locked down your instance!** + +## Discord Bot OAuth integration + +- Create a room via the Hubs Discord bot and the room becomes bound to the security context in discord and the channel +- Room-by-room access or channel-by-channel: If the user does not have access to that room bound channel, they will not have access +- User's identity is tied to their identity in Discord + +[Learn more about the Discord bot here](./hubs-discord-bot.md) + +[Enable the Discord bot for your Hubs Cloud instance](./hubs-cloud-discord-bot.md) + +## Room Access Settings + +Individual rooms can also limit access via [Room Access Settings](./hubs-room-settings.md#room-access). diff --git a/docs/archive/hubs-cloud/managing-content.md b/docs/archive/hubs-cloud/managing-content.md new file mode 100644 index 0000000..4cd7299 --- /dev/null +++ b/docs/archive/hubs-cloud/managing-content.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 8 +--- + +# Managing Content + +In Hubs and Spoke, visitors can create their own avatars and scenes. They can then offer to share that content with others, which will let visitors discover the content through tools like the Media Browser. + +However, as the administrator of a hub, you don't always want the content contributed by visitors to be surfaced. For example, it may contain inappropriate or illegal content. Hubs Cloud comes with a set of content moderation tools, so you can fully control and filter the content submitted by your visitors. + +## Content Pipeline + +When a visitor creates a custom avatar or scene, they are offered the option to mark it as _remixable_ and/or _promotable_. _Remixable_ content confers a Creative Commons 3 license to the content so others are free to use or modify it, and _promotable_ content will be enqueued for review to be added to your hub's content library. Once it is approved, content in the library can be discovered by users through tools like the Media Browser. + +All content marked as _Promotable_ will be added to the **Pending Scene/Avatar Queue** when it is either created or updated. You can find these queues in your [Admin Console](./hubs-cloud-getting-started.md): + +![Hubs Cloud Pending Queue Menu](/img/hubs-cloud-pending-queue-menu.jpeg) + +### Approving Content + +When viewing a queue, you will see a list of all the unreviewed scene or avatars that have been created or updated. From here, you have to decide if you are going to **Approve** or **Deny** the item by clicking one of the buttons on the far right: + +![Hubs Cloud Pending Scene](/img/hubs-cloud-pending-scene.jpeg) + +- **Approving** an item will remove it from the queue and add it to the content library. If it's an update, the changes will be applied to the content library. Visitors will be able to discover the item through the Media Browser. + +- **Denying** an item will remove it from the queue and _not_ add it to the content library. The item will not be removed, and will be accessible to anyone who has the URL. However, visitors will not be able to discover it through the Media Browser. + +You can browse all of the approved content in the content library via the **Approved Scenes** and **Approved Avatars** panel in the Admin Console. + +### Featuring Content + +In addition to approving content, you can also **feature** content. Featuring content will place it on the **Featured** tab in the Media Browser, which will increase its visibility to your visitors: + +![Hubs Cloud Featured Content](/img/hubs-cloud-featured.jpeg) + +To feature content, first you'll need to navigate to the content in the **Approved Scenes** or **Approved Avatars**. Once you've found content you'd like to feature, just click the **Feature** button. You can un-feature content that has been featured by using the **Unfeature** button. + +![Hubs Cloud Pending Scene](/img/hubs-cloud-approved-scene.jpeg) + +### Editing content + +To update content, click on the **Edit** button at the far right of the list for the item you want to edit. There you can edit the name, status, and tags of the item: + +![Hubs Cloud Edit Scene](/img/hubs-cloud-edit-scene.jpeg) + +The **status** for the item can be set to **active** or **delisted**. When an item is delisted, it is effectively removed from the content library. + +In addition, you can add **tags** to an item. Tags are used to confer special behavior to items, and also to assist with search. + +#### Special Tags + +Special behavior can be added by giving one of the **special tags** to an item: + +- **`default`** + - Giving an avatar a `default` tag will assign it to new visitors. If multiple default avatars exist, one will be picked at random. + - Giving a scene a `default` tag will assign it to new rooms. If multiple default scenes exist, one will be picked at random. +- **`base`** + - Giving an avatar a `base` tag will surface it in the Avatar Editor, so it can be used as a base model for re-skinning. + - This tag has no effect on scenes. +- **`featured`** + - Giving a scene or avatar a `featured` tag will add it to the **Featured** list in the Media Browser. diff --git a/docs/archive/hubs-cloud/permissive-rooms.md b/docs/archive/hubs-cloud/permissive-rooms.md new file mode 100644 index 0000000..8b8dafe --- /dev/null +++ b/docs/archive/hubs-cloud/permissive-rooms.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 11 +--- + +# Recipe: Permissive Rooms + +Out of the box, the default permissions set on rooms is highly restrictive. This means that if you create a room, only yourself and visitors you choose to promote will have access to all features. Other visitors to your room will be restricted from using most features other than appearing as avatars and speaking. + +Room Permissions can be set on a room-by-room basis to allow more access to room visitors (to see how, see [Room Settings](./hubs-room-settings.md).) + +However, sometimes you want to enable all permissions for all visitors for newly created rooms. For example, you may trust all visitors to your hub use features like media spawning and drawing responsibly. + +To change the default permissions of new rooms to be more permissive. First, open the [Admin Console](./hubs-cloud-getting-started.md) then choose **App Settings**: + +![Hubs Cloud App Settings](/img/hubs-cloud-app-settings.jpeg) + +Then, under **Rooms**, enable the **Permissive Rooms** option and click **Save**: + +![Hubs Cloud Permissive Rooms](/img/hubs-cloud-permissive-rooms.jpeg) + +Once selected, new rooms will have all permissions turned on by default for all visitors, not just the room creator and promoted members. diff --git a/docs/archive/hubs-cloud/ssh-access.md b/docs/archive/hubs-cloud/ssh-access.md new file mode 100644 index 0000000..1ec6938 --- /dev/null +++ b/docs/archive/hubs-cloud/ssh-access.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 15 +--- + +# Advanced: SSH Access + +To access your servers over SSH, in the [Admin Console](./hubs-cloud-getting-started.md) choose **Server Access** and follow the guide. Note that 2-factor authentication is set up by default, so you will need a 2FA device with an application installed like Google Authenticator to connect to your servers. + +Your servers are running [Ubuntu 18.04 Bionic Beaver](http://releases.ubuntu.com/18.04/). + +### Biome Services + +The services required for Hubs Cloud are installed, managed, and supervised with the [Biome Supervisor](https://biome.sh/en/), which is the community distribution of [Chef Habitat](https://www.habitat.sh/). To better understand how Biome works, you can read the [Chef Habitat Guide](https://www.habitat.sh/docs/using-habitat/). + +The biome commandline tool is `bio`, and services run under the `hab` user. + +#### Logging + +Logging is sent to journald. To tail the log, as `root` you can use [`journalctl`](https://www.freedesktop.org/software/systemd/man/journalctl.html): + +``` +journalctl -f +``` + +#### Managing services + +To see the list of running services, as root: + +``` +bio sup status +``` + +You can start/stop services via `bio svc start` and `bio svc stop`. It's advised that you **not** unload or load services via `bio svc load` or `bio svc unload` manually since that will disconnect from the channel, preventing updates, etc. diff --git a/docs/archive/hubs-cloud/third-party-integrations.md b/docs/archive/hubs-cloud/third-party-integrations.md new file mode 100644 index 0000000..fc70c29 --- /dev/null +++ b/docs/archive/hubs-cloud/third-party-integrations.md @@ -0,0 +1,63 @@ +--- +sidebar_position: 12 +--- + +# Recipe: 3rd Party Integrations + +Your hub includes integrations for searching useful content for visitors to spawn into their rooms using the Media Browser. There is built-in support for a variety of sites and search engines, such as [Sketchfab](https://www.sketchfab.com). You can also tweet to share content directly from your hub. + +![Hubs Cloud Media Browser](/img/hubs-cloud-media-browser.jpeg) + +However, before these various content tabs will be enabled for your hub, you will need to add the necessary API keys to enable the integrations. + +In the [Admin Console](./hubs-cloud-getting-started.md) choose **Server Settings**: + +![Hubs Cloud ](/img/hubs-cloud-server-settings.jpeg) + +There you will find under **API Keys** the following keys you can set to enable these features: + +### Sketchfab + +Create a [Sketchfab](https://www.sketchfab.com) account and then [Find your API Token](https://help.sketchfab.com/hc/en-us/articles/202600683-Finding-your-API-Token). + +### GIFs + +Sign up for the [Tenor GIF API](https://tenor.com/gifapi) to get a free API key. + +### Videos & Images + +Create a [Azure Cognitive Services](https://azure.microsoft.com/en-us/services/cognitive-services/) account and enable the [Bing Video Search API](https://azure.microsoft.com/en-us/services/cognitive-services/bing-video-search-api/) and [Bing Image Search API](https://azure.microsoft.com/en-us/services/cognitive-services/bing-image-search-api/). + +1. Sign up for an Azure account at [portal.azure.com](https://portal.azure.com). + +2. Once signed into Azure, search the services available and create a new Cognitive Services offering. You will need to specify a region and application group to deploy to. + +3. When your service has finished spinning up, navigate to the API keys tab. + +4. Copy one of your API keys from the Azure portal. + +5. In your Hubs Cloud admin panel, navigate to the ‘Server Configuration’ panel and open the ‘API keys’ tab. + +6. Paste the Cognitive Services API key into the ‘Bing Search’ text input. + +7. Save your changes to deploy the video/image search to your Hubs Cloud media browser. + +Note: these APIs are **not free** above 1000 transactions per month. You will be charged for their usage by your Hubs Cloud instance in your Azure account. + +### Twitch + +Sign up as a [Twitch Developer](https://dev.twitch.tv/) and [Get a Client ID](https://dev.twitch.tv/docs/v5). + +### Twitter + +Enable visitors to tweet out videos and photos they've taken. + +Sign up as a [Twitter Developer](https://developer.twitter.com/) and create an application to generate your keys and tokens. You'll need Consumer keys (API Key and Secret) and Authentication Tokens (Access Tokens and Secret). In App permissions, you'll need Read and Write permissions. Under Authentication settings, enable 3-legged OAuth and add Callback URLs `https://your-hubs-cloud-domain/api/v1/oauth/twitter`. Then add your `https://your-hubs-cloud-domain` to the Website URL. Request email address from users should be disabled. + +Once you've added your consumer/access tokens and secrets into the Admin Panel > Server settings menu > API Keys, go to a room (with spawning objects enabled), take a picture with the camera, hover over the photo, and click "Tweet". + +Congrats! You've enabled Twitter on your Hubs Cloud instance! + +### Analytics and Error Logging + +Add [Google Analytics](https://analytics.google.com/analytics/web/) tracking IDs and [Sentry](https://sentry.io/welcome/) DSNs to enable aggregated page tracking and error reporting. Note that full URLs which include room, avatar, and scene identifiers will not be sent to analytics services. diff --git a/docs/creators/_category_.json b/docs/creators/_category_.json new file mode 100644 index 0000000..6faa289 --- /dev/null +++ b/docs/creators/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "For Creators", + "position": 4, + "link": { + "type": "generated-index" + } +} diff --git a/docs/creators/behavior-graphs/_category_.json b/docs/creators/behavior-graphs/_category_.json new file mode 100644 index 0000000..d965cf8 --- /dev/null +++ b/docs/creators/behavior-graphs/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Behavior Graphs", + "position": 3, + "link": { + "type": "generated-index" + } +} diff --git a/docs/creators/behavior-graphs/intro-behavior-graphs.md b/docs/creators/behavior-graphs/intro-behavior-graphs.md new file mode 100644 index 0000000..40f5509 --- /dev/null +++ b/docs/creators/behavior-graphs/intro-behavior-graphs.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 1 +--- + +# Introduction to Behavior Graphs + +Documentation coming soon... diff --git a/docs/creators/blender-add-on/_category_.json b/docs/creators/blender-add-on/_category_.json new file mode 100644 index 0000000..a2e1465 --- /dev/null +++ b/docs/creators/blender-add-on/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "The Blender Add-On", + "position": 2, + "link": { + "type": "generated-index" + } +} diff --git a/docs/creators/blender-add-on/add-on-components.md b/docs/creators/blender-add-on/add-on-components.md new file mode 100644 index 0000000..cad65dd --- /dev/null +++ b/docs/creators/blender-add-on/add-on-components.md @@ -0,0 +1,698 @@ +--- +sidebar_position: 3 +--- + +# Blender Add-On Components + +## Overview + +While not necessarily required in order to export models from Blender to create Hubs scenes, the Hubs Components detailed below will let you add a variety of useful functionality, interactivity, and immersion. + +## Animation + +### Loop Animation + +The ‘Loop Animation’ component will let you play looped animations stored as NLA (non-linear animation) tracks in your Blender scene. The component supports multiple animation tracks per mesh, and even allows control over the playback speed (called ‘**Time Scale**’ in Blender) of the animation within Hubs. Even a negative playback speed is possible, resulting in an animation playing backwards. Additionally, animations can have a ‘**Start Offset**’ value, which offsets the first frame of playback. In doing so, you could (as an example) animate a wind turbine once, duplicate it in your scene, and add a frame offset in your loop animation component so that they weren’t both turning in exact unison. + +In the following example, a 1m cube is the child of two nested empties. The parent empty (cubeEmpty_X) has an NLA animation track that moves 2m in X over 30 frames, then moves back to its start position over the course of another 30 frames. The top-level empty (cubeEmpty_Y) has an NLA track where it moves -2m in Y over 30 frames, then returns to the start position, like the first. The combined effect of both loop animation tracks played together looks like the following: + +![Loop Animation Example 1](/img/components_loopAnimation_01.gif) + +- _Two overlapping loop animation tracks and their combined effect._ + +If then you add a 15-frame (one quarter of the total) ‘**Start Offset**’ value to one of the empties, you get this: + +![Loop Animation Example 2](/img/components_loopAnimation_02.gif) + +- _Two overlapping animation tracks with a start offset applied._ + +The ‘Loop Animation’ component is commonly used on ambient scene animations as well as avatar animations (such as idle eye movements). + +### UV Scroll + +The ‘UV Scroll’ component allows you to scroll an object’s texture according to its UV layout along either the U or V axis (or a combination of both). UV scrolls are a widely used way to add animations to real-time 3D scenes with their origins stretching all the way back to the early days of 3D video games. Using scrolling UV’s you can animate an overhead layer of clouds, a water surface, wisps of wind, a scrolling marquee, and all sorts of other environmental effects. They are an inexpensive way to add character and visual interest to Hubs scenes. + +![UV Scroll Example 1](/img/components_UVscroll_01.gif) +A plane using the ‘UV Scroll’ component to scroll its texture in the X direction. + +UV scroll has two basic settings. ‘**Speed**’ lets you determine how fast the scroll occurs in both the X and Y (U and V, respectively) directions. An X value of 1, shown above, means that the texture will scroll as if its UV islands had moved 1 unit to the right over the course of one second. If you wanted it to move at half that speed, a value of 0.5 would be used, resulting in the scroll taking twice as long (2 seconds) to complete one cycle. Speed in this way can be thought of as cycles per second, so if you wanted a cycle to take an entire minute, you would use an X speed value of 1/60, or 0.016667. + +The second option is called ‘**Increment**’ and lets you specify the number of incremental steps to move the texture over the course of one second. An increment X value of 0.1 would move the texture 1/10th of the way from 0 to 1 (in the U direction) a total of 10 times in one second, for a stop-motion sort of look. + +![UV Scroll Example 2](/img/components_UVscroll_02.gif) + +- The same scroll speed as above with an increment value of 0.1. + +We can take advantage of this effect by using long strips of animations in a sort of virtual flip-book, allowing the playback of things such as blinking lights, all the way to full-blown GIF animations. For additional information about advanced uses of the ‘UV Scroll’ component, see Jim’s excellent Creator Labs write-up [HERE](https://hubs.mozilla.com/labs/animating-textures-with-the-uv-scroll-component-pt1/). + +## Avatar + +### Personal Space Invader + +The ‘Personal Space Invader’ component is a special Hubs component that is automatically attached to Hubs avatars and makes it so that when someone gets too close to you, their avatar becomes transparent so that they do not block your view or otherwise be bothersome by being too close. + +![Personal Space Invader Example 1](/img/components_personalSpaceInvader_01.gif) + +### Morph Audio Feedback + +The ‘Morph Audio Feedback’ component is specific to avatars and allows a Blender ‘Shape Key’ to be triggered when a user is speaking. This is commonly used for mouth shapes, so that a mouth appears to open and close when someone is talking. + +![Morph Audio Feedback Options](/img/components_morphAudioFeedback_01.png) + +- Click to add a new ‘Shape Key’. + +To achieve this, two shape keys must be created on the mesh item in question. The first key Blender will call “Basis” by default - this is the starting position of your mesh as you created it. When you press the ‘+’ button a second time, it will create a 2nd shape key for you. This is where you will create your open mouth shape. Rename this 2nd shape key to whatever you like, but use something you will remember as this name will be important later. + +With the 2nd shape key selected, increase its ‘Value’ to 1, then go into edit mode. While in edit mode, change the mouth shape so that it is making the desired open-mouth shape. When done, exit edit mode. You can now click and hold and scrub the value field to see your mouth open and close. Set this back to 0, and click the ‘Basis’ so that it is highlighted. + +![Morph Audio Feedback Example 1](/img/components_morphAudioFeedback_scrub.gif) + +- Scrubbing the shape key value field to preview the effect. + +The last thing you will need to do is add the component itself. With the mesh selected, click to add a Hubs component and select ‘Morph Audio Feedback’. In the ‘Shape Key’ field, click the dropdown menu and select the shape key that you created and named earlier. Use the ‘**Min Value**’ and ‘**Max Value**’ fields to fine-tune your avatar’s mouth shape as it responds to the input audio. For example, I frequently set ‘Max Value’ to 2, which helps to ensure that the mouth animation is visible even when a user is speaking at a low volume; sometimes the opening and closing effect can be too subtle when the max value is left at its default value of 1. You will need to do some experimenting to find what works best for your application. + +![Morph Audio Feedback Example 2](/img/components_morphAudioFeedback_avatarExample.gif) + +- A speaking Hubs avatar using the ‘Morph Audio Feedback’ component. + +### Scale Audio Feedback + +The ‘Scale Audio Feedback’ is used to scale a portion of an avatar mesh when the user is speaking. This is commonly applied to the head of the avatar mesh and is an added layer of visual feedback when someone is talking. + +This component can be applied directly to the mesh, at which point it will automatically scale all verts weighted to the ‘Head’ bone, as well as every child bone. If the component is applied to the armature, it will scale all of the verts associated with that particular bone and its children. + +Using the ‘**Min Scale**’ and ‘**Max Scale**’ values will let you fine tune the amount of scale that occurs during speech. By default, the affected mesh will start at a scale of 1 and scale all the way up to 1.5 times its starting size at full speaking volume. + +![Scale Audio Feedback Example 1](/img/components_scaleAudioFeedback_avatarExample.gif) + +- A speaking Hubs avatar using the ‘Scale Audio Feedback’ component. + +## Elements + +### Link + +The ‘Link’ element works much the same way as the ‘Image’ element and allows you to place a clickable 2D representation of a website link in your Hubs scene. Clicking the link will attempt to open the resulting URL in a new browser tab. Link elements are commonly attached to empties, just like the image element, and are positioned and sized the same way. (See the ‘Image’ element section for more information.) + +![Link Example 1](/img/components_link_01.gif) + +- A clickable ‘Link’ element at the default (1m wide) size. + +Link elements can also be attached to other objects as well. For example, once in a while Hubs will fail to render a preview image of a website as the clickable image for the link due to the complexity of the website in question. In this case, it is recommended to use an ‘Image’ element displaying a screenshot of the website with an additional ‘Link’ element attached to it that contains the desired resulting URL link. + +![Link Example 2](/img/components_link_02.png) + +- An ‘Image’ element with an additional ‘Link’ element applied to it. + +Other elements such as ‘Model’ and ‘Video’ can also have link elements applied to them, making them clickable web links. + +### Media Frame + +A ‘Media Frame’ is a special type of container that can hold 2D media or 3D objects. They are useful for precisely positioning and snapping items into predetermined positions in your scene, such as an image in a picture frame, or a video on a screen. Media frames are not visible in a Hubs scene unless you are actively dragging a media object around with your mouse cursor. Media can be pinned inside of a media frame so that other users do not accidentally move the media inside of it (useful when presenting to an audience). + +![Media Frame Example 1](/img/components_mediaFrame.gif) + +- An image being dragged into a ‘Media Frame’ in Hubs. + +To make a media frame, create an ‘Empty’ in your Blender scene. Since media frames point forwards in the -Y direction, it is useful to change your empty “Display As” type to “Arrows” in the Object Data Properties tab. Once done you can position and orient this item. Next, add the ‘Media Frame’ Hubs component to the empty. You will see a blue cube representing the frame’s default 1m size. To resize a media frame, you cannot scale the empty - you must use the ‘**Bounds**’ controls in the media frame component to set its size. If you are making a frame for 2D media, you can scale down the Y-axis to make a more flat shape. When placing media into the frame in Hubs, the media will snap to the center along the Y axis and stretch to fill the longest dimension of the media inside the frame (along the X or Z axis, whichever is greater). Note: If you make your media frames too thin along the Y-axis, it may be difficult to place media inside of it in Hubs. + +![Media Frame Example 2](/img/components_mediaFrame_01.png) + +- A ‘Media Frame’ seen in Blender, scaled down along the Y-axis. + +The ‘**Media Type**’ dropdown will let you specify which type of media your frame will accept. This can be limited to only 2D media, specific types of 2D media, 3D models, or any type of media. + +For more information about the ‘Media Frame’ component, see Laurie ONeill’s article on Creator Labs [HERE](https://hubs.mozilla.com/labs/working-with-media-frames/). + +### Particle Emitter + +The ‘Particle Emitter’ component lets you add a particle system to your Hubs scene. As [Wikipedia](https://en.wikipedia.org/wiki/Particle_system) writes, “A particle system is a technique in game physics, motion graphics, and computer graphics that uses many minute sprites, 3D models, or other graphic objects to simulate certain kinds of "fuzzy" phenomena, which are otherwise very hard to reproduce with conventional rendering techniques – usually highly chaotic systems, natural phenomena, or processes caused by chemical reactions.” + +That’s a mouthful! Chances are, if you are here reading this then you have a pretty good idea of what a particle system is and what it’s used for, so we will move onto how to set one up in Hubs. + +![Particle Emitter Example 1](/img/components_particleEmitter_01.gif) + +- Multiple Hubs ‘Particle Emitter’ systems emulating a campfire. + +Like many Hubs components, the ‘Particle Emitter’ component is attached to an ‘Empty’ within Blender. Particles are given a directional velocity, so it’s best to use the empty type of “Arrows”. However there are some orientation issues that you will need to be aware of. Creating a default particle system with a start and end velocity of 1 m/s will result in particles that emit in the -Y direction. This is what is considered the “front” facing direction like most of the Hubs Blender components. So you will need to remember that the -Y direction of your arrows correlates to the +Z (“up”) direction with regards to the velocity. In this way, it might be easier to set your empty display mode to something else like a cube and orient and scale it so that it is more obvious when you are looking at it which way is up and down, but that is a matter of personal preference. + +![Particle Emitter Example 2](/img/components_particleEmitter_03.png) + +- A ‘Particle Emitter’ empty set to arrows with its corresponding positive velocity directions. + +Note: The Y and Z axis are swapped with regards to the particle emitter component. A start/end velocity of 1 in Z will result in particles emitted along the -Y axis. A start/end velocity of 1 in Y will result in particles emitted along the +Z axis. A start/end velocity of 1 in X will result in particles emitted along the +X axis. Because of this, it could be easier to use the X axis for more predictable results, if you are using the “Arrows” empty display type. + +As there is currently no preview of particle systems inside of Blender, it will likely take a lot of trial and error to get something that looks good. To make the process somewhat simpler, you can go into Spoke and design your particle system there, and then copy your values to the ‘Particle Emitter’ component in Blender when you are satisfied with how it looks in Spoke. Be aware that Spoke is Y-up and the particles actually emit according to their corresponding velocity axes (as in, a start/end velocity of .5 in Z will actually emit in the positive Z direction, unlike in Blender). Because of this, you will need to either rotate your emitter in Blender, or do the Y/Z conversions yourself. + +The ‘Particle Emitter’ component has the following options: + +![Particle Emitter Example 3](/img/components_particleEmitter_02.png) + +- The ‘Particle Emitter’ options. + +**Image Source**: The URL to the source particle image you wish to use (supports alpha). + +**Start Color**: The color the particle will be when it is first spawned, multiplied on top of the particle color. + +**Middle Color**: The color of the particle at the halfway point of its total lifetime, multiplied on top of the particle color. + +**End Color**: The color of the particle at the end of its lifetime, multiplied on top of the particle color. + +**Start Opacity**: The opacity of the particle at the start of its lifetime. + +**Middle Opacity**: The opacity of the particle at the halfway point of its lifetime. + +**End Opacity**: The opacity of the particle at the end of its lifetime. + +**Size Curve**: The curve that defines the start/middle/end points of the size transition along the particle’s age. + +**Color Curve**: The curve that defines the start/middle/end points of the color transition along the particle’s lifetime. + +**Start Size**: The size of a particle at the start of its lifetime, in meters. + +**End Size**: The size of the particle at the end of its lifetime before it is despawned. + +**Size Randomness**: The amount of variation between particle starting sizes. + +**Age Randomness**: The amount of variation between when particles are spawned. + +**Lifetime**: The maximum age (in seconds) of a particle before it is respawned. + +**Lifetime Randomness**: The amount of variation between particle lifetimes. + +**Particle Count**: The total number of particles visible at any given time for this emitter. + +**Start Velocity (X/Y/Z)**: The speed (in m/s) in which a particle travels at the start of its lifetime. + +**End Velocity (X/Y/Z)**: The speed in which a particle travels at the end of its lifetime. + +**Velocity Curve**: The curve that defines the start/middle/end points of the velocity transition along the particle’s lifetime. + +**Angular Velocity**: The amount of rotational speed applied to a particle. + +### Simple Water + +The ‘Simple Water’ component is a quick way to generate an animated water surface in your Hubs scenes. It has various controls for wave height and speed, and of course color. + +![Simple Water Example 1](/img/components_simpleWater.png) + +- The ‘Simple Water’ settings. + +The component gets applied to an ‘Empty’ in Blender and has a default size of 10m x 10m. Because of this (and since Blender has no “Plane” empty shape) it’s a good idea to set your empty “Display As” setting to “Cube” with a size of 5m (the half-width), and scaled down in the Z axis until it is nearly flat. Upon doing so you can position it in your scene and have a pretty good idea of where it will be. + +![Simple Water Example 2](/img/components_simpleWater_02.gif) + +- A small ‘Simple Water’ example asset. + +### Spawner + +A ‘Spawner’ component allows you to spawn multiple copies of a grabbable object into the scene. After one is grabbed, another copy of the same object will appear at the original position, ready for someone else to come by and grab one. Objects spawned this way will remain in the scene unless they are manually deleted, either via the object context menu, or the room object list. + +![Spawner Example 1](/img/components_spawner2.gif) + +- A ‘Spawner’ that spawns cups of lemonade with gravity enabled. + +To grab an object from a spawner, mouse-over the object with your cursor. The cursor will turn blue indicating that the object is interactive. Press and hold the left mouse button and move the cursor away from the starting point to grab the object. While holding an object, you can scroll the mouse wheel to move the object closer or further away from you. Spawned objects can be inspected via the right-click menu just like objects added via the ‘Model’ component, and are sized and positioned the same way. + +Spawners have one additional option called ‘**Apply Gravity**’. When enabled, objects will fall to the floor in a realistic fashion when the user lets go of the mouse button while holding a spawned object. By default, dropped objects will stay in place if the user lets go of the mouse button while the mouse is still. + +A word of caution: Be careful spawning high poly meshes with a spawner as too many high poly meshes can have a huge impact on room performance. + +### Text + +Hubs uses a version of the Troika-three-text package for three.js. While each parameter has a tooltip when hovering over it in Blender, you can also read the documentation for each parameter on the [Troika documentation page](https://www.npmjs.com/package/troika-three-text). + +You can also play with this [handy visualization of the Troika Text parameters](https://troika-examples.netlify.app/#text) to help you understand how they work. + +![Text Example 1](/img/components_text_01.png) + +Usage: It is recommended that you use an Empty object set to the Arrows type in Blender. Then, apply the Text component. By default, the text will display on the -Y facing side. + +![Text Example 2](/img/components_text_02.png) + +- Lots of options– mouse over them in Blender for more detail. + +### Waypoint + +The 'Waypoint' component can be used to tell Hubs where visitors should start or ‘spawn’ in your scene. It can also be used as a shortcut for visitors to ‘jump’ to a particular spot. By combining its various settings, the Waypoint component can be used to simulate sitting in a chair or otherwise being positioned in one spot–with or without the ability to leave it. + +![Waypoint Example 1](/img/components_waypoint_01.png) + +The Waypoint component has the Hubs visitor facing -Y by default. Rotate the object to change the direction. The robot avatar gizmo is there to help you know where your head/eyes will be, as well as to help you visualize the scale of an avatar. + +Usage: It is recommended that you create an Empty object in Blender, then apply the Waypoint component. The position and orientation of the object will affect the spawning position and orientation. NOTE: Currently, Hubs supports Waypoints that are rotated on their vertical axis. Any rotation on the other axes is ignored. + +![Waypoint Example 2](/img/components_waypoint_02.png) + +**Use As Spawn Point**: Hubs will consider this a valid place to spawn visitors entering the space. Spawn points are chosen randomly, but Hubs tries to avoid using the same one repeatedly. + +**Can Be Occupied**: Flags the Waypoint as ‘occupied’ when someone uses it. Can keep others from using it while occupied. + +**Clickable**: Visitors may click the Waypoint to jump to it. Visible when Hubs menus are toggled. + +**Disable Motion**: Locks the visitor in place, disabling movement. The visitor may still look around and interact with things. + +**Disable Teleporting**: While using this Waypoint, the user may not teleport. Use with caution as visitors will usually need a way to escape a Waypoint. + +**Maintain Initial Orientation**: When ON, a visitor will continue to face the same direction they were facing when they click on the Waypoint, effectively ignoring the Waypoint’s orientation. A stool would be a good example of something where you may not want to define the starting orientation. + +**Snap To NavMesh**: Attempts to make the visitor snap to the nearest area on the NavMesh (navigable floor plan). Without this setting, it’s possible to make someone float in mid-air. + +## Lights + +### Ambient Light + +While not physically accurate, the ‘Ambient Light’ component will apply a uniform light from all directions. It can be used as a quick way to add brightness or tinting to the scene, but is generally considered inferior to using a physically-based workflow. Considered a legacy component, but still useful in some cases. The location of an Ambient Light is unimportant, and often left at the origin (0,0,0). By it’s very nature, there is no shadow cast by an ambient light source. + +![Ambient Light Options](/img/components_ambientLight_01.png) + +**Color**: Opens a typical color picker. + +**Intensity**: Overall brightness. Values above 1.0 may cause unwanted effects. + +### Directional Light + +The 'Directional Light' component creates a dynamic light source (also known as a punctual light) that emits light from a single direction. + +A Directional Light is best made with an Arrows empty in Blender. When the Directional Light component is added, its light rays will travel along the negative Y direction. The light rays attempt to mimic light from a faraway light source like the sun, so all of its rays travel parallel to one another. NOTE: While dynamic lights are computationally expensive, often, a single Directional Light is used when targeting less powerful devices, such as VR or mobile devices, and you still must have a dynamic light source for a particular design. + +![Directional Light Example 1](/img/components_directionalLight_01.png) + +- The forward facing direction of a ‘Directional Light’ component. + +![Directional Light Example 2](/img/components_directionalLight_02.png) + +- The ‘Directional Light’ component and its properties. + +**Color**: Opens a typical color picker. + +**Intensity**: Overall brightness. Values above 1.0 may cause unwanted effects. + +**Cast Shadow**: Enabling shadows enables the parameters below. Note: Don’t forget to put a Shadow component on the objects and surfaces you desire, otherwise a light’s shadow will not appear. Shadows may not be visible on some devices by default. + +**Shadow Map Resolution**: Higher values produce crisper, but more computationally expensive shadows. Try to keep these values as low as possible, especially if you are using multiple shadow-casting lights. Use powers of 2: 64, 128, 256, 512, etc. + +**Shadow Bias**: Best to leave this setting at a default value of -0.003. + +**Shadow Radius**: How far away (in meters) from the light source shadows begin casting. + +### Hemisphere Light + +The 'Hemisphere Light' is considered somewhat of a legacy type, but can still be useful for quick and simple lighting setups. It simulates the effect of light from the sky, while adding a second set of light rays that come from the ground. Hemisphere lights do NOT cast shadows. Hemisphere lights are not recommended for physically-based workflows. Instead, consider using a .HDR image with the 'Environment Settings' component. + +Usage: Add an ‘Empty’ object in Blender, then apply the Hemisphere Light component. Only the orientation matters, but you’ll likely leave it unrotated. NOTE: There is currently no visual gizmo for the Hemisphere Light component. + +![Hemisphere Light Example 1](/img/components_hemisphereLight_01.png) + +**Sky Color**: Light rays from above will be this color. + +**Ground Color**: Light rays from below will be this color. + +### Point Light + +The Point Light component creates a dynamic light source (also known as a punctual light) that emits light in all directions from a single point. It has the ability to cast shadows. + +![Point Light Example 1](/img/components_pointLight_01.png) + +Usage: Add an ‘Empty’ object in Blender, then apply the Point Light component. Only the location matters since all the light rays emit outward. + +![Point Light Example 2](/img/components_pointLight_02.png) + +**Color**: Color of the light rays. + +**Intensity**: Brightness of the light. From the threejs documentation: “Intensity is the luminous intensity of the light measured in candela(cd).” + +**Range**: How far (in meters) the light rays can travel. Leave at 0 for infinite distance. + +**Decay**: The amount the light dims along the distance of the light. 0 = no Decay, 1 = Inverse Falloff, 2 = Inverse Square Falloff. Note: A Decay value of 2 will produce the most realistic lighting behavior, also known as ‘physically-based’. + +**Cast Shadows**: Enabling shadows enables the parameters below. **Note: Don’t forget to put a Shadow component on the objects and surfaces you desire, otherwise a light’s shadow will not appear. Shadows may not be visible on some devices by default.** + +**Shadow Map Resolution**: Higher values produce crisper, but more computationally expensive shadows. Try to keep these values as low as possible, especially if you are using multiple shadow-casting lights. Use powers of 2: 64, 128, 256, 512, etc. + +**Shadow Bias**: Best to leave this setting at a default value of **-0.003**. + +**Shadow Radius**: How far away (in meters) from the light source shadows begin casting. + +### Spot Light + +The Spot Light component creates a dynamic light source (also known as a punctual light) that emits light in a cone shape from a single point. The cone shape can be adjusted to be wide or narrow and have a hard or soft edge. It has the ability to cast shadows. + +![Spot Light Example 1](/img/components_spotLight_01.png) + +Usage: Add an ‘Empty’ object in Blender, then apply the Spot Light component. The light’s position and orientation determine where the light is pointed. **By default, the light rays travel in the negative Y direction.** + +![Spot Light Example 2](/img/components_spotLight_02.png) + +**Color**: Color of the light rays. + +**Intensity**: Brightness of the light. From the threejs documentation: “Intensity is the luminous intensity of the light measured in candela(cd).” +Range: How far (in meters) the light rays can travel. Leave at 0 for infinite distance. + +**Decay**: The amount the light dims along the distance of the light. 0 = no Decay, 1 = Inverse Falloff, 2 = Inverse Square Falloff. Note: A Decay value of 2 will produce the most realistic lighting behavior, also known as ‘physically-based’. + +**Cone Inner Angle**: Angle in degrees for the cone of light that starts in the center of the light. + +**Cone Outer Angle**: Angle in degrees for the cone of light that starts from the Inner Angle and goes to the outer edge of the light cone. + +**Cast Shadows**: Enabling shadows enables the parameters below. **Note: Don’t forget to put a Shadow component on the objects and surfaces you desire, otherwise a light’s shadow will not appear. Shadows may not be visible on some devices by default.** + +**Shadow Map Resolution**: Higher values produce crisper, but more computationally expensive shadows. Try to keep these values as low as possible, especially if you are using multiple shadow-casting lights. Use powers of 2: 64, 128, 256, 512, etc. + +**Shadow Bias**: Best to leave this setting at a default value of **-0.003**. + +**Shadow Radius**: How far away (in meters) from the light source shadows begin casting. + +## Media + +### Audio + +The ‘Audio’ component attaches to an empty and lets you play an audio file hosted on the web via the ‘**Audio URL**’ field. It has the same options as the ‘Video’ component and operates in much the same way. Audio files are positional by default, but can be made non-positional via the accompanied ‘Audio Params’ component under the ‘**Audio Type**’ dropdown. This is useful for ambient background audio that you don’t necessarily want to sound as if it’s coming from a particular place in your scene. + +![Audio Example 1](/img/components_audio_01.png) + +- The ‘Audio’ component and its settings. + +If you wish to conceal the source of your audio file, you can attach an additional ‘**Visible**’ component to it, and uncheck the ‘Visible’ check-box. However this will make it impossible to either pause or adjust the volume for this particular audio source. + +Adding an audio component to your object will also add ‘Networked’ and ‘Audio Params’ components automatically, which are necessary for the audio to work properly. + +### Audio Params + +The ‘Audio Params’ component is added automatically when certain other Hubs components are added to an object (such as a video or an audio target) and allows the user to override scene audio settings at a per-object level. This is useful if you want to make sure a video is never too loud, or to make audio target “speakers” loud and heard from further away than regular spoken audio. + +![Audio Params Example 1](/img/components_audioParams_01.png) + +- The ‘Audio Params’ component. + +See the ‘Audio Settings’ component section for information about what each and every option does. + +### Audio Source + +The ‘Audio Source’ component is used in conjunction with the ‘Audio Target’ component and lets you designate a source area inside which a Hubs user’s spoken audio will be transmitted and re-broadcast at a target location. It works in much the same way as a microphone and speakers: the microphone is the audio source, while the speakers are the audio targets. Currently this only works for spoken audio and not other media sources such as videos placed inside the ‘Audio Source’ volume. + +![Audio Source Example 1](/img/components_audioSource_02.png) + +- A sample Hubs scene with an ‘Audio Source’ volume placed near a microphone. + +To make an audio source, first create an 'Empty' inside of Blender. Change the empty ‘Display As’ type to ‘Sphere’ - this will show you the volume inside which a Hubs avatar must be positioned in order to be heard through the speakers. Give the empty object a unique name such as 'Audio Source 1', or something you will identify later. With the object selected, in the 'Object Properties' panel go to the 'Hubs' section and click '+ Add Component' and add the one called 'Audio Source'. + +![Audio Source Example 2](/img/components_audioSource_01.png) + +- The ‘Audio Source’ component settings. + +From here you can choose whether only room moderators can use the mic or if everyone can via the ‘**Only Mods**’ option. '**Mute Self**' makes it so that you cannot hear your own voice over the loud speakers while you are speaking, which can be distracting. This is enabled by default. Toggling ‘**Debug**’ mode on will show some useful info about the audio inside of the Hubs room, but you'll want this off before you publish your scene. When you are testing this scene in Hubs, be sure to go into the ‘Preferences’ and enable “Show Audio Debug Panel” or the debug information will not be visible. + +### Audio Target + +The ‘Audio Target’ component is used in conjunction with the ‘Audio Source’ component and lets you specify the place (or places) in which spoken audio will be heard when a Hubs user is standing within an ‘Audio Source’ volume. + +![Audio Target Example 1](/img/components_audioTarget_02.png) + +- A sample Hubs scene with two ‘Audio Target’ empties placed in front of speakers. + +To make an audio target, create an 'Empty' and call it something like 'Speaker 1' (or whatever you want). Position it where you want your audio to come from in your scene. The negative Y direction is the forward facing direction of the audio, so using an empty of type “Arrows” is best. It's important to orient the audio target the correct way as it is not only positional but directional as well (ie standing behind the speaker is not as loud as standing in front of it). You can have more than one ‘Audio Target’ point to the same source for multi-speaker arrangements. In the 'Object Properties' tab, add a Hubs Component called 'Audio Target', and then choose your audio source from the dropdown menu; only objects with the ‘Audio Source’ component will show up in this list. + +![Audio Target Example 2](/img/components_audioTarget_01.png) + +- The ‘Audio Target’ component. + +'**Min Delay**' and '**Max Delay**' can be used to simulate a sort of echo-like effect in your scene. For larger environments you might have more delay (so a greater difference between min and max), while in smaller spaces you might not want any at all. Delay is measured in seconds. Play with the settings to find what works best for your application. ‘**Debug**’ works the same way as it does for ‘Audio Source’ and will give you some visual feedback about the shape of the cone of the audio as well as its falloff. Additionally, while in debug mode you will hear a “hiss” sound from your speakers, indicating that they are indeed working. The best way to test audio settings for this type of setup is to have two or more users in the Hubs room (one speaking and one listening). + +Adding an ‘Audio Target’ component to an empty will also automatically add an ‘Audio Params’ component, where you can adjust the volume of this speaker (‘Gain’) and a host of other audio settings. See ‘Audio Settings’ for more information about these settings. + +### Audio Zone + +An ‘Audio Zone’ is a special volume in your Hubs scene inside which you can override audio settings. It is useful for creating private spaces in your scene outside of which audio cannot be heard from within the defined volume. Audio zones affect both spoken audio as well as media audio that are within the audio zone. + +For more information about the ‘Audio Zone’ component and how it works, see [Matt’s article on Creator Labs](https://hubs.mozilla.com/labs/creating-speaker-stages-and-manipulating-audio-in-hubs/). + +### Image + +The ‘Image’ component lets you add images to your Hubs scene via a remote image URL field. Unlike static textures in your scene, these images can be reloaded and updated dynamically by updating the source file. They can also be inspected via the right-click menu, and can have additional functionality such as the ‘Link’ element added to them so that they are clickable links in your scene. + +To use the ‘Image’ component, create an empty and apply the ‘Image’ component to it. The image will face forwards in the -Y direction, so it is useful to change your “Display As” dropdown to “Arrows” in the ‘Object Data Properties’ tab. Once positioned and oriented in your scene, if you would like a visual representation of the size of your image, you can change the “Display As” mode to “Cube”. The default image size is 1m square, so you will need to change your half-width of the cube to .5m (so that it is 1m x 1m). You can also scale down the cube in the Y direction so that it’s roughly flat looking - the image will be positioned in the center along the Y-axis. With all of that done, you can scale the cube empty to any size that you like while having a clear idea of how large it will appear in your Hubs scene. + +![Image Example 1](/img/components_image_01.png) + +- Two images applied to a 6m x 4m wall. The one on the left is a 1m image; the other, 2m. + +The ‘**Controls**’ option lets you determine whether there are additional controls on the image when the user is holding down the space bar to open the object menu. These controls include inspect mode, local view mode, a button to open the image link in a new tab, and a button to refresh the image in the event that the source image was overwritten and needs to be updated. With the ‘Controls’ option disabled however, these options will not appear. + +![Image Example 2](/img/components_imageControls.png) + +- An image element with the controls overlaid on top. + +Lastly is the ‘**Projection**’ type dropdown. By default this is set to “2D image (flat)”, which is the correct setting for traditional flat images. The second option is called “Spherical (360-equirectangular)” and allows for special 360-degree image captures to be displayed inside the faces of a sphere. This is commonly used for background images when scaled up very large (be sure to disable the controls first), but can also be used as little portals that users can step into to look around the 360-degree environment. + +![Image Example 3](/img/components_image-spherical.gif) + +- Stepping into a default 1m (radius) spherical image. + +It is best to set your empty’s “Display As” setting to “sphere” in this case, and leave it at the default 1m (radius) setting. To scale the spherical photo object, use Blender’s standard scale transform tool - scaling the empty’s visible display size in the “Object Data Properties” tab will not resize the image object. + +### Model + +The ‘Model’ component lets you spawn a GLB model directly in your Hubs scene from a URL. It is different from placing a model directly in your source Blender scene in that models added via the ‘Model’ component can be right-clicked and inspected, allowing users to get a closer look at a model from all angles. Additionally, while inspecting a model, users can click the ‘Link’ button to download the GLB file. + +![Model Example 1](/img/components_model.gif) + +- Inspecting a model of a blue cube added via the ‘Model’ component. + +Like many Hubs components, the ‘Model’ component gets attached to an Empty in Blender and faces the -Y direction. The model will come in at its original scale, positioned according to its own origin (from the source file). If you would like to adjust the scale of the model that is spawned, you can scale the empty in Blender prior to exporting the scene. + +### Video + +The ‘Video’ component is yet another 2D Hubs scene element that gets applied to an ‘Empty’ and will display a video in your Hubs scene. It too works like an ‘Image’ element and is placed, oriented and scaled the same way. (See the ‘Image’ element section for more information.) It has a ‘**Video URL**’ field that lets you specify a link to the video you want to play. Hubs supports many video formats - as many as your browser supports! A commonly used one is .mp4. + +![Video Example 1](/img/components_video.png) + +- The ‘Video’ component and its default parameters seen in Blender. + +Like images, you can change your ‘**Projection**’ type from “2D image (flat)” to “Spherical (360-equirectangular)”, allowing Hubs users to step inside of a 360-degree video. The video component has three additional options. ‘**Auto Play**’ lets you choose to have the video automatically play when the scene is loaded. If unchecked, the video will not play until someone presses the play button. ‘**Show Controls**’ determines whether there are play/pause and volume up/down buttons overlaid on top of the video when a user mouses-over the video. If these controls are disabled, it will not be possible to do these actions. Lastly the ‘Loop’ option lets you specify whether you want the video to automatically play again when the end is reached. + +Videos are networked by default, meaning that if a user clicks to pause the video, it will pause for everyone in the room. Additionally, an ‘Audio Params’ component is automatically attached to the object when you add a ‘Video’ component, allowing you to specify audio settings unique to this video. This would allow you, for example, to limit the distance that the audio can be heard from a video source, without affecting the distance that speech between users can be heard. (See ‘Audio Params’ for more information about audio settings.) + +### Video Texture Source + +The ‘Video Texture Source’ component is used in conjunction with the ‘Video Texture Target’ component and lets you specify which Blender camera is the source for your in-room video textures. + +Unlike the way a lot of the Hubs components work, the ‘Video Texture Source’ component attaches directly to a Blender camera object and not an empty. Once applied to your camera object, you will be presented with the following options. ‘**Resolution**’ lets you specify the size of the video signal that will be passed to the video texture, and ‘**FPS**’ lets you choose the frame-rate. By default these values are 1280x720 and 15, respectively. Be careful setting these values too high as they can really start to impact performance. The general rule is to use as low settings as possible while still achieving the look you are after. The default settings are generally fine for most hardware. + +It can be useful to set your ‘Video Texture Source’ camera as your “active camera” in Blender and create a 3D viewport showing the camera view (View > Cameras > Active Camera). This will give you a clear idea of what the video texture will be displaying in your Hubs scene. + +![Video Texture Source Example 1](/img/components_videoTextureSource_01.png) + +- A split view of Blender showing what the ‘Video Texture Source’ camera sees (right). + +### Video Texture Target + +The ‘Video Texture Target’ component works with the ‘Video Texture Source’ component and lets you determine a material in your scene whose texture will be replaced with the video feed coming from the source camera. The component itself is attached directly to the material via the “Material Properties” tab, and not on the “Object Properties” tab like most Hubs Blender components. + +![Video Texture Target Example 1](/img/components_videoTextureTarget_01.png) + +- The ‘Video Texture Target’ component in the “Material Properties” tab. + +Once applied to the material, you will be able to select your camera from the ‘Source’ dropdown menu. Only cameras with the ‘Video Texture Source’ component will show up in this list. The material you want the video texture to display on must have a texture assigned to the diffuse and/or emissive channels in the shader editor for this material, or it won’t work. This can be a 16x16 blank image - it doesn’t matter what it is - the component just needs something to swap out. + +![Video Texture Target Example 2](/img/components_videoTextureTarget_01.gif) + +- An animated camera feeding a video to a ‘Video Texture Target’. + +Make sure that the UV’s of the face you are sending the video to are unwrapped so that they stretch to fill the entire UV space, and that they are oriented properly. Lastly, and this is important, make sure that your resolution settings in your ‘Output Properties’ tab in Blender are set to the same aspect ratio as your source camera prior to exporting your scene. This does not have to be the exact resolution as your ‘Video Texture Source’ camera (tho it can be), but the aspect ratio is what matters. The ‘Frame Rate’ here has no impact on the video feed (that is set in the ‘Video Texture Source’ component). + +![Video Texture Target Example 3](/img/components_videoTextureTarget_02.png) + +- Be sure to set this before you export your scene! + +The ‘Video Texture Target’ component can also be used on Avatars. In this case, the video feed source is your device’s camera or webcam and not a virtual scene camera with the ‘Video Texture Source’ component. To enable the camera in Hubs while using an avatar with a video texture target, press Share > Avatar Camera in the bottom UI bar. This will replace the original texture with your camera feed, allowing for some fun webcam-enabled avatars. + + + +For more information about both ‘Video Texture Source’ and ‘Video Texture Target’, [check out the stream](https://www.youtube.com/watch?v=oEc8ML2Q-z8) that the Hubs team did, viewable on YouTube. + +## Object + +### Ammo Shape + +The ‘Ammo Shape’ component lets you add physics collision properties to a mesh in your scene so that other physics-enabled objects can interact with and bump into it. This interaction only happens with objects that are spawned into or otherwise dragged into the scene, and has zero impact on the movements of avatars (which are driven only by the nav mesh). This component is applied directly to the mesh that you wish to enable collision for. + +Objects exported via the Hubs Blender Exporter receive collision properties by default, however if you wish to override the default settings and have more control over the collision shapes applied, you can add an additional Ammo Shape component to your mesh. + +![Ammo Shape Example 1](/img/components_ammoShape_01.png) + +- The ‘Ammo Shape’ component and its properties. + +The ‘**Type**’ dropdown lets you choose from different collision shape presets. The presets are: + +**Box Collider**: A box-shaped primitive collision shape. + +**Sphere Collider**: A primitive collision shape in the shape of a sphere. + +**Convex Hull**: A convex hull wrapped around the object’s vertices. A good analogy to describe how this works would be a palette of boxes wrapped in shrink wrap. + +**Mesh Collider**: A shape made of the actual vertices of the object. This is the most accurate but can be computationally expensive for complex meshes and should be used with caution. + +For information about the remaining Ammo Shape options, mouse-over them in Blender to read the tooltips. + +### Billboard + +A ‘Billboard’ component is used any time you want an object to always be facing the user. This works for either 2D media or 3D models (where the “front” of the model is the -Y facing direction when exported from Blender). We traditionally use billboards for things such as sprites generated by particle emitters so that the particle images are always fully in view: you never see a particle at an oblique angle, nor the back-facing invisible side, but always the exact front. This is a local effect in that you yourself see the billboarded object facing you, while other people in the same Hubs room will see the same objects facing them on their screens. + +Billboard components are particularly useful for objects such as text that you want to make sure always faces the user, and are commonly used for distant background elements as well. For example, a tree in the distance where a user could never walk to might be better off as a faux 2D cutout of a foreground tree, and with a Billboard component added to it, the user will always see the full image of the tree from any point in the scene. Billboards might also be used on foreground tree branches or leaves so that the tree canopy appears more full with fewer gaps. This is commonly done in video games. + +![Billboard Example 1](/img/components_billboard_only-Y.png) + +The Billboard component has only one option, a radio button labeled ‘**Only Y**’. When this button is checked, the object with the billboard component will only spin on its vertical axis (in Hubs the vertical axis is Y) to rotate towards the user, and not fully rotate upwards or downwards to face the viewer’s exact camera position. By default, with the button unchecked, the behavior will be the latter. + +![Billboard Example 2](/img/components_billboard.gif) + +- The cube on the left has the default Billboard settings. On the right, “Only Y” was selected. + +### Frustum + +The Frustum component fixes a problem you might have when using an animated object. Some animated objects are large or move across a large distance causing the object to disappear when it nears the edges of your view in Hubs. + +![Frustum Example 1](/img/components_frustum_01.png) + +- The ‘Frustum’ component. + +**Culled**: Applying a Frustum component with **Culled** set to **OFF** will ensure that the object always renders, no matter how far off-screen the object is. Use only when needed. + +### Shadow + +The ‘Shadow’ component is a special component that allows 3D objects (or even avatars) in your scene to either cast or receive shadows, used in conjunction with dynamic lights. For example, if you have a dynamic light in your scene and would like your avatar to cast a shadow on the floor from this light source, the avatar will need to have a ‘Shadow’ component with ‘**Cast Shadow**’ enabled, and the floor of your scene will need to have one with ‘**Receive Shadow**’ enabled. Nothing will cast or receive shadows by default. + +![Shadow Example 1](/img/components_shadow.gif) + +- An animated spotlight shining on a sphere and casting a shadow on the floor. + +Also worth noting is that Hubs does not have dynamic shadows on by default. If you are not seeing your shadows, it’s quite possible that you do not have them enabled. To turn them on, go to the ‘More’ menu, click ‘Preferences’, then under the ‘Misc’ tab, make sure “Enable Real-time Shadows” is turned on. Dynamic lights also do not display when your Hubs material quality settings are set to “Low”, which is the default setting for mobile devices (including stand-alone VR devices). + +### Visible + +The ‘Visible’ component is a simple component that lets you make an object invisible in your Hubs scene while retaining the functionality associated with that object. For example, it is common to apply the ‘Visible’ component to your navigation mesh so that it’s not showing in your Hubs scene, yet you can still walk around on it. It’s sometimes useful to add a ‘Visible’ component to an ambient audio source that you want to be heard without the controls or source of the file showing. + +![Visible Example 1](/img/components_visible_01.png) + +- A Hubs navigation mesh with an additional ‘Visible’ component added, toggled off. + +## Scene + +### Audio Settings + +The ‘Audio Settings’ component is added in the “Scene Properties” tab in Blender and lets you override the default audio settings for your entire Hubs scene. It has independent controls for spoken avatar audio as well as scene media audio (such as videos). + +![Audio Settings Example 1](/img/components_audioSettings.png) + +- The Hubs ‘Audio Settings’ component options. + +These settings can be further overridden on a per-object basis by adding an additional ‘Audio Params’ component to that object. So for example, if you wan media volume to be at a specific level for your entire scene, you set those settings in ‘Audio Settings’, but if you want one video in particular to be louder than the rest, you would set that in an ‘Audio Params’ component attached to that particular video. + +The Audio Settings options are: + +**Avatar Distance Model**: The algorithm used to calculate audio rolloff. + +**Avatar Rolloff Factor**: A double value describing how quickly the volume is reduced as the source moves away from the listener. 0 to infinity. + +**Avatar Ref Distance**: A double value representing the reference distance for reducing volume as the audio source moves further from the listener. + +**Avatar Max Distance**: A double value representing the maximum distance between the audio source and the listener, after which the volume is not reduced any further. + +**Media Volume**: The relative volume of media (videos or audio) played in the scene. + +**Media Rolloff Factor**: A double value describing how quickly the volume is reduced as the source moves away from the listener. 0 to infinity. + +**Media Ref Distance**: A double value representing the reference distance for reducing volume as the audio source moves further from the listener. + +**Media Max Distance**: A double value representing the maximum distance between the audio source and the listener, after which the volume is not reduced any further. + +**Media Cone Inner Angle**: A double value describing the angle, in degrees, of a cone inside of which there will be no volume reduction. + +**Media Cone Outer Angle**: A double value describing the angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the ‘Media Cone Outer Gain’ attribute. + +**Media Cone Outer Gain**: A double value describing the amount of volume reduction outside the cone defined by the ‘Media Cone Outer Gain’ attribute. Its default value is 0, meaning that no sound can be heard. + +If you’d like an example of what some sound combinations can sound like, head on over to [THIS](https://hubs.mozilla.com/scenes/hitpNgs) super handy Hubs scene that has a number of videos, each with different ‘Audio Params’ overrides that you can listen to while you walk around so you can get an idea how the settings affect the volume as you move around the scene. + +### Environment Settings + +This is one of a handful of components that gets added in Blender’s Scene Properties tab. This component is required in order to have a background image or color. It’s also used to set a global reflection probe image that you will see reflected in metallic and/or shiny objects. It is also where you can define a ‘look’ for your scene controlled by post-processing effects, similar to making color adjustments on a film or video. + +To use these more effectively, and since there’s no way to preview these in Blender, you can add the following to the end of a Hubs URL and reload: + +**?envSettingsDebug** + +Then, you’ll be able to tweak the parameters in a browser, then use those values back in Blender before you export again. + +![Environment Settings Example 1](/img/components_environmentSettings_01.png) + +**Enable HDR Pipeline**: Checking this enables Bloom below. + +**Background Color**: Opens a typical color picker. (NOTE: THIS DOES NOT WORK CURRENTLY) + +**Background Image**: Expects an equirectangular format image to wrap a 360-degree skybox around the scene. Choose an image you have loaded into Blender. Using an image with high dynamic range (.HDR) can greatly improve the realism of your lighting. + +**EnvMap**: Expects an equirectangular format image to use as a global reflection probe. Highly shiny and/or metallic surfaces will reflect this image. Choose an image you have loaded into Blender. Using an image with high dynamic range (.HDR) can greatly improve the realism of your lighting. + +**Tone Mapping**: Dropdown with preset defaults. Experiment with different looks. These mostly affect brightness and contrast and are applied as a post-processing effect. + +**Exposure**: When using an HDR Pipeline, this controls overall exposure of the scene. If, for example, your scene appears too dark, try raising this by subtle amounts. + +**Bloom**: Accessible when ‘Enable HDR Pipeline’ is checked. Bloom adds a post-processing effect that makes bright areas of the screen appear to glow or ‘bloom’ out from the source pixels. + +![Environment Settings Example 2](/img/components_environmentSettings_02.png) + +- The ‘Environment Settings’ component and its settings. + +**Threshold**: Values brighter than this will have bloom applied to them. + +**Intensity**: Scales the intensity of the bloom effect. + +**Radius**: Spread distance of the bloom effect. + +**Smoothing**: Makes transition between under/over threshold more gradual. + +### Fog + +This is one of a handful of components that gets added in Blender’s Scene Properties tab. +Adding a Fog component creates a fog effect in your scene that obscures things at a distance. +There are some limitations with fog such as how it affects semi-transparent objects, so be aware that fog may not always work as intended. When used subtly, fog can provide a greater sense of scale and depth, such as when you use light-blue tinted fog or dark fog in a night scene. + +![Fog Example 1](/img/components_fog.png) + +**Type**: Linear Fog (default) or Exponential Fog. NOTE: Your choice affects which settings are relevant below. + +**LINEAR FOG**: Somewhat easier to control than exponential–fog appears thicker the farther away it is. + +**EXPONENTIAL FOG**: Fog is controlled by a single density value. + +**Color**: Uniform color of the fog. + +**Near**: Sets the near distance (in meters) to the camera fog should start. + +**Far**: Sets the far distance (in meters) to the camera fog should reach. + +Density: Sets the overall ‘thickness’ of the fog. + +### Navigation Mesh + +Contrary to popular assumption, Hubs avatars do not navigate the 3D scene using any sort of physics system. There’s no collision checks happening under the hood to keep you from walking through a wall. Instead, Hubs uses an invisible floor mesh called a ‘Navigation Mesh’ (or nav mesh for short) that tells hubs where avatars are allowed to walk or teleport to. + +![Navigation Mesh Example 1](/img/components_navigationMesh_01.png) + +- A sample Hubs scene with a ‘Navigation Mesh’ (shown in green). + +The ‘Navigation Mesh’ component gets attached to a duplicated section of floor that has areas cut out for walls and other scene objects that you don’t want avatars to be able to walk through. Navigation meshes must be one mesh object (you cannot have multiple nav meshes in a scene) and all vertices must be welded together so that there are no discontinuous pieces. It’s generally a good idea to also attach a ‘Visible’ component to your nav mesh with its visibility toggled off (unchecked). For more information about making custom nav meshes for your scene, check out Jim’s comprehensive article on Creator Labs [HERE](https://hubs.mozilla.com/labs/what-is-a-nav-mesh/). + +### Reflection Probes + +The ‘Reflection Probe’ element is used to create areas in your scene inside which avatars and objects will be influenced by the colors of a pre-defined reflection cubemap image. It is an advanced technique and when done properly can really enhance the visuals of a scene and make objects and avatars appear more “grounded” in the scene, as if they are being influenced by the same lighting conditions as the rest of the scene. A scene can have multiple reflection probes, each with their own baked image and lighting conditions. Probe volumes can even overlap, creating the effect of a smooth transition as an avatar (for example) travels from one to the next. + +![Reflection Probe Example 1](/img/components_reflectionProbe_01.png) + +- The ‘Reflection Probe’ component and its settings. + +For more information about the ‘Reflection Probe’ element, see [Jim’s excellent article on Creator Labs](https://hubs.mozilla.com/labs/baked-lighting-for-better-looking-hubs-scenes/) titled “Baked Lighting for Better-Looking Hubs Scenes”. diff --git a/docs/creators/blender-add-on/advanced-avatars.md b/docs/creators/blender-add-on/advanced-avatars.md new file mode 100644 index 0000000..63510c2 --- /dev/null +++ b/docs/creators/blender-add-on/advanced-avatars.md @@ -0,0 +1,83 @@ +--- +sidebar_position: 2 +--- + +# Advanced Avatar Customization + +## Advanced Re-skinning + +As described in the [creating custom avatars](intro-avatars.html) page, the most straightforward way to customize an avatar for Hubs is to upload a custom texture set. The simplest version of re-skinning the robot avatar would be to simply paint a 'baseColor' map. + +For more advanced customization, you can use the following resources: + +- [Photoshop PSD Templates](https://github.com/MozillaReality/hubs-avatar-pipelines/blob/master/Photoshop) - Photoshop templates for a custom Hubs base color skin. You can also use Photoshop's 3D painting tools, using the [Robot OBJ/MAT file](https://github.com/j-conrad/hubs-avatar-pipelines/tree/master/Other%20model%20formats). +- [Substance Painter Project](https://github.com/MozillaReality/hubs-avatar-pipelines/blob/master/Substance)- Full Substance Painter projects for advanced custom skinning. You can also download and modify any of our example texture sets. + +![UV Layout example](/img/UVLayout.jpg) + +The UV layout for the base robot avatar is purposefully symmetrical along the X (horizontal) axis. This makes it relatively easy to paint one half of the texture(s) and flip it to the other side. Some image editing applications such as Photoshop have built-in mirroring tools that allow you to paint both halves in real time. + +![Panda Bot example](/img/PandaBot.jpg) + +### Types of Texture Maps + +Because Hubs uses glTF standards it supports many of the map types associated with physically-based materials. The default avatar uses: + +- Base Color - The main design / color map for the texture +- Emissive - Which parts should glow (emit light) +- Normal - How light should reflect off the texture +- ORM - Metallic, roughness, and occlusion + +**NOTE: 'ORM' texture is composed of Ambient Occlusion, Roughness(black = glossy, white = rough), and Metallic (black = non-metal, white = fully metallic) combined in one singular image with each texture occupying the Red, Green, and Blue channels respectively.** + +**It is highly recommended that texture resolution be kept at 1024x1024 or below.** This is mostly due to Hubs being a web-based application where large download times for bigger files can hurt performance, especially on mobile devices. All textures MUST be powers of 2 (64, 128, 256, 512, etc.) + +![Hubs Avatar Customization](/img/avatar-customization.jpeg) + +When you upload textures into Hubs The preview will be updated. You do not need to include all textures - any combination of maps are supported. Each of the slots listed handle a different texture type. You can learn more about [different types of maps here](https://www.khronos.org/blog/art-pipeline-for-gltf). + +## Create Your Own Avatar + +To customize your avatar's shape, you can modify our basic robot template, or upload a .glb file of your choice. If you use the robot template, your avatar will have hands and a body and a head that grows/shrinks when you speak. If you use a plain .glb file, this item is considered the head of the avatar and the whole object will grow and shrink when you speak. + +You can follow along with Jim and Dom in this recorded live stream here to walk through the whole process: https://youtu.be/qBvZhh6KVcg?t=561 + +### Modify Base Robot Template + +We offer the following resources if you'd like to modify our base Robot avatar: + +- [Blender Source Files](https://github.com/MozillaReality/hubs-avatar-pipelines/tree/master/Blender/AvatarBot) are available of our Robot avatar. **For specific information about how to use these .blend files, be sure to check out the readme within the [Blender/AvatarBot](https://github.com/MozillaReality/hubs-avatar-pipelines/tree/master/Blender/AvatarBot) folder.** + +- [Exported GLBs](Exported%20GLB%20models)/[Exported OBJ](https://github.com/MozillaReality/hubs-avatar-pipelines/tree/master/Other%20model%20formats) are available if you'd like to bring them into your editor of choice. + +We recommend using [Blender 2.83](https://builder.blender.org/download/) (or whatever the most recent release is) for custom models since we have provided example files that you may use as a guide. (Typically, skeleton setup varies between modeling appications which can make importing/exporting skeletons a bit tricky due to unexpected changes in bone rotations, but it is still possible to use something other than Blender.) Note: the .blend files were created with [Blender 2.8](https://builder.blender.org/download/) due to the built-in glTF exporter. The glTF importer/exporter for Blender is currently in development. Expect some bugs and [please report them!](https://github.com/KhronosGroup/glTF-Blender-IO/issues) + +Hubs avatars are meant for VR, which means that you should work in real world units. A typical avatar height is roughly 1.7 meters. Note: This is typically a 'standing height'. The lack of legs shown here is a part of that overall height. + +![avatar height diagram](/img/avatarHeight.jpg) + +Files with the suffix _\_base_ refer to the most barebones, basic robot avatar template that can be used as a reference when creating new avatar models. Typically, the Blender workflow would be to either 'Link' or 'Append' the objects from [AvatarBot_base_for_export.blend](https://github.com/MozillaReality/hubs-avatar-pipelines/tree/master/Blender/AvatarBot) in order to use the existing armature (skeleton) and any animations that go along with it, using them as a basis for your own model that you would attach to it. + +The armature is based largely upon the same hierarchy and naming conventions of the skeleton provided by [High Fidelity](https://docs.highfidelity.com/en/rc80/create/avatars/avatar-standards.html#skeleton). This also happens to have a similar structure to VRChat in terms of bone orientations. +However, in our current implementation in Hubs, we have eliminated some of the bones within the hierarchy, namely the lower body and arm joints since we are not using any sort of inverse kinematics (IK) at the moment. This may change in future iterations. + +### Use a Regular .glb File + +You can use any .glb object as an avatar. This could be something you made on your own, or a creative-commons asset from Sketchfab or Google Poly. Sometimes .glb files need a few modifications to work properly as avatars. You may wish to open the object in Blender to fix the object's scale (it should be about 1.7 meters), ensure the object is facing forward, move the object backwards a bit so it doesn't obstruct your view. You might also want to optimize the object using the tips in the [optimizing scenes page](spoke-optimization.html) + +### Upload your own model + +1. Enter a Hubs room +2. Select the ‘People’ list icon in the top right corner of the screen +3. By your name, you will see a pencil icon. Click this icon to open the avatar selection screen +4. Click the ‘Browse Avatars’ button +5. From here, you can see a list of your own avatars, the first spot should say "Create Avatar" +6. In the avatar customization screen choose one of the default body shapes +7. Click 'Custom GLB' to upload your 3d model +8. Save the avatar + + diff --git a/docs/creators/blender-add-on/intro-add-on.md b/docs/creators/blender-add-on/intro-add-on.md new file mode 100644 index 0000000..47e1c5b --- /dev/null +++ b/docs/creators/blender-add-on/intro-add-on.md @@ -0,0 +1,101 @@ +--- +sidebar_position: 1 +--- + +# Introduction to the Hubs Blender Add-On + +Note: The following documentation assumes you are using the latest stable release of Blender. Using older versions or experimental builds of Blender may work, but is not guaranteed. + +To ensure you are using the latest release of Blender, look at the top right of Blender's splash screen on startup and make sure it matches the one on the main Blender download page: https://www.blender.org/download/ + +![Blender Splash Screen Image](/img/BlenderSplash.jpg) + +### What things will export to glTF? + +Not everything you make in Blender can be exported to the glTF (glb) format. This is constantly changing due to ongoing improvements to the Blender glTF importer/exporter add-on, as well as changes to the glTF file format itself. Generally speaking, you can export models with or without textures and/or vertex colors, models with skeletal armatures, models with shape keys (morphing), and models with animation. Things that will _not_ export properly (unless things change at some point): Blender's particle systems, cached vertex animations (like fluid or cloth simulations), and certain types of shaders, to name a few. + +If you have questions or problems getting certain parts of your Blender file to export, please refer to the following for more information: + +[glTF file format overview](https://www.khronos.org/gltf/) + +[Blender glTF Importer/Exporter Github repository](https://github.com/KhronosGroup/glTF-Blender-IO) + +### How to make sure your Blender model(s) export correctly + +There are a few things to check to make sure what you see in Blender is what you'll get in Spoke and Hubs. This is not an exhaustive list, but it contains some common things that can cause unexpected results. + +**+ The scale should read 1, 1, 1.** + +It's easy to scale things in Blender and then forget to **apply that scale (CTRL+a)**. If your object's scale reads something other than 1, 1, 1 then you can end up with an exported model that doesn't match the size or proportion you expected. One way to avoid this common pitfall is to do all your scaling while in Edit mode. Scaling in Edit mode doesn't alter the object scale values. + +**+ Object should be at or near the world origin (0, 0, 0)** + +Not having your object near the origin of the world is a very common problem with models that come from third party sites like Sketchfab or Google Poly, especially if they are animated. You can tell you're having this problem when your model gets dropped into Hubs and it is far from where the loading cube was located. + +**+ Apply any modifiers that you want to see** + +Blender modifiers need to be applied in order for them to show up on your exported model. For example, a character that was made by modeling one half, then adding a 'Mirror' modifier to duplicate the other side will only export the modeled half unless you first _Apply_ that 'Mirror' modifier. If you do not wish to commit to applying that modifier because you are still iterating on your design, you may want to simply duplicate the model first, apply the Mirror, then export just that duplicate. **\*Note**: There is a setting in the glTF exporter to 'Apply Modifiers' upon export. However, this applies all modifiers including Armature modifiers (for skinning to a skeleton) which may not be desirable.\* + +**+ Objects with animation tracks need to have those tracks 'Stashed'** + +In order to support objects with multiple animations, any and all animation tracks need to first be 'Stashed' or 'Pushed Down' for them to export to glTF. It can be performed from either the Action Editor or the NLA (Non-linear animation) editor: + +![Blender Animation Windows](/img/BlenderAnimationStash.jpg) + +**+ glTF & glb are the same-- but not exactly.** + +**TL;DR: When exporting, you'll want to make sure you're exporting as a .glb.** +Spoke and Hubs expect you to use .glb files. A single .glb file contains all mesh data, image textures, and related information packed into a single binary file. Glb files are generally easier to deal with because you're not having to move around separate .bin and texture files. For advanced users, you might choose to export as glTF if you intend to edit the file by hand using a text editor. There are several converters available to convert a glTF to a glb and vice-versa. Refer to the [glTF file format overview](https://www.khronos.org/gltf/) for more information. + +**+ Understanding the Exporter Settings** + +There are quite a few settings to understand in the glTF exporter, but fortunately, they are divided into sections to make it a little easier. In many cases, the defaults work just fine. However, there are a few worth noting when troubleshooting: + +
    +
  • (Include) 'Selected Objects' - Checking this allows you to only export the selected items you want. It's easy to forget this is turned on--(and even easier to forget to select things first!)
  • +
  • (Include) 'Custom Properties' - This one is necessary if you're using things like the custom Hubs comoponents add-on (more on this later) but in most cases is not necessary.
  • +
  • (Geometry) 'Apply Modifiers' - See info above. In most cases you'll want to leave this OFF.
  • +
  • (Geometry) 'UVs, Normals, Tangents' - Best left ON. There may be unusual cases where you don't want these but it would be rare.
  • +
  • (Geometry) 'Vertex Colors' - If you choose to paint vertex colors on your model, which can be a cheap, fast way of applying basic color instead of a texture, you'll need this ON. Otherwise, you can turn it OFF with no apparent effect.
  • +
  • (Geometry) 'Materials' - Pretty much all models require materials to display properly so you will need this ON.
  • +
  • (Geometry) 'Compression' - This might seem like a good idea, but as of this writing, Hubs does not support objects with Google Draco mesh compression. Leave this OFF.
  • +
  • (Animation) 'Limit to Playback Range' - Make sure your playback range is set properly to see the full animation get exported.
  • +
  • (Animation) 'Always Sample Animations' - This one has been found to significantly increase the file size in some cases. Try turning this OFF. If your animation(s) still work without it, leave it OFF.
  • +
  • (Animation) 'NLA Strips' - You must have this ON if you've stashed a bunch of animation tracks on your object(s).
  • +
  • Shape Keys - You must have this turned ON if you have an object that requires shape keys (also known as morph targets or blend shapes in other software).
  • +
  • (Shape Keys) 'Shape Key Normals' - This one can be turned OFF as long as your morphs don't do anything special with the object's normals. If you see odd shading occur when the morphs happen, try toggling this.
  • +
  • Skinning - You must have this turned ON if your object is bound to a skeletal armature.
  • +
+Any parameters not mentioned are probably best left to their defaults. +It's worth noting that because this exporter (and the glTF format) is still subject to its own bug fixes and redesign, some of the settings and/or their defaults may change in the future. + +### Setting up materials that Spoke and Hubs will display correctly + +Blender's documentation has all of the latest information about how materials should be configured for glTF. This information can be found easily by searching for 'glTF' in their docs. Here's the [link to Blender's glTF documentation](https://docs.blender.org/manual/en/dev/addons/import_export/scene_gltf2.html?highlight=gltf#gltf-2-0) + +Instead of repeating that information, here are some helpful tips: + +**+ Whenever possible, use 'unlit' materials** + +While 'unlit' is a somewhat confusing name, it refers to materials where the lights within the scene have no effect on the object(s). In other words, they appear fully lit on their own. Unlit materials are the 'cheapest' materials to render and look the same on all devices. For this reason, many times people will 'bake' the lighting and shadow information into the baseColor texture first, then apply it to an unlit material. The Blender manual mentions how to make an unlit shader graph, but it's not particularly obvious. + +Part of why this is difficult is because you must use the 'Background' node in your shader graph--but the 'Background' node is not listed with all the other nodes by default. Instead, you must find that node by switching the Shader editor to 'World' mode, then copy/paste it into your object's shader graph. You can add it to your Quick Favorites menu to make it easy to find later: + + + +Once you have the Background node, you can plug your texture into it, and send that to the Material Output. When you export to glb and bring the object into Spoke or Hubs, it will be 'unlit' (or fully lit, depending how you think of it.) + + + +An Unlit material is the best type to use for a 'sky dome' since it will not be affected by any scene lights. Generally speaking, if your object doesn't require specular highlights or surfaces that change their look based on lighting, use an unlit material. + +![A Hubs scene with baked lighting](/img/HelloWebXRscene.jpg) + +The scene above had all its lighting baked in Blender, then exported with unlit materials. Putting lights in this scene would have no effect on the room itself, but it looks great (and the same) on all devices. diff --git a/docs/creators/spoke/_category_.json b/docs/creators/spoke/_category_.json new file mode 100644 index 0000000..117b70c --- /dev/null +++ b/docs/creators/spoke/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Spoke", + "position": 1, + "link": { + "type": "generated-index" + } +} diff --git a/docs/creators/spoke/adding-content.md b/docs/creators/spoke/adding-content.md new file mode 100644 index 0000000..174820a --- /dev/null +++ b/docs/creators/spoke/adding-content.md @@ -0,0 +1,96 @@ +--- +sidebar_position: 5 +--- + +# Adding Content + +Once you have created your scene, you can start customizing it by adding content. Spoke and Hubs support a wide variety of media. Note that to publish to Hubs, Spoke projects have a size limit of 128MB. + +## 3D Models + +Spoke allows you to search 3D content from Sketchfab. You can find collections in the assets media browser. + +![Hubs Image](/img/spoke-3d-model.jpeg) + +If you have existing .glb or .glTF models, you can upload those to your asset library as well. + +## Uploading Content + +You can upload your own existing assets to use in Spoke. To upload content: + +1. Select the 'My Assets' tab in the Assets panel of the Spoke editor +2. Click the 'Upload' button in the 'My Assets' panel and choose the file to upload + +You can also drag + drop content into the editor window to upload it to Spoke. Scenes have a size of 128MB, and files used in the scene must be below that size. + +## 3D Model Spawners + +If you want to create a room that has a specific 3D object that people can make copies of, you can create a ‘Spawner’ element. This can be helpful for making it easy to have a scene that can allow multiple people to quickly get their own copies of the same object. To do this, you will want to copy the URL of the model that you want, create a ‘Spawner’ element from the Asset panel > Elements tab, and paste the URL into the properties box. + +![object spawner](/img/spoke-spawner.jpeg) + +## Images + +Images can be added to Spoke with a 2D projection or a 360 degree equirectangular projection (a format that could be used as a skybox or other type of scene background). You can upload images or gifs from your own computer or use the built-in search tool from within Spoke to find media online. + +![Hubs Image](/img/spoke-images.jpeg) + +## Video + +You can link to online videos in Spoke to create a permanent player for video content. Spoke attempts to automatically play any type of streaming video content or live stream. YouTube and Twitch URLs usually work well for streaming if you want to have a permanent link to an ongoing feed in your scene. Like images, videos can be projected in either 2D, or a 360 equirectangular projection. + +It is worth noting that the current behavior for videos in Spoke can be configured to automatically play and loop, but you cannot currently change the video that is linked after the scene is published to Hubs. If you want to temporarily add a video that can be removed, you may want to consider adding it to Hubs and pinning it to your room instead. + +_If you want to use additional types of feeds, such as a screen or window share from your desktop or your webcam, you can add these after you create a Hubs room with your scene. Currently, screen and camera sharing cannot be instantiated inside of Spoke._ + +## Audio + +You can add links to .mp3 files to add audio to a Hubs scene. Currently, however, there are no controls on audio clips added using Spoke. + +We recommend uploading audio files to Hubs directly, so you can access the volume controls in case people have trouble hearing with the audio playing at the same time. + +## Particle Emitter + +The particle emitter is a Spoke object that spawns moving particles. + +![Hubs Image](/img/spoke-particle-emitter.jpeg) + +## Links + +You can include links in your scene to point to other Hubs rooms or to different places on the web. To create a link element in Spoke, under Elements, select the 'Link' element. When your link element is selected, paste your URL into the properties panel. When your scene is published and used to create a room in Hubs, the URL will be resolved to its file type and displayed according to the content type. If you use a URL to a general website, Hubs will attempt to take a screen shot and display that content where the link element is placed. If the url cannot be resolved, it will display a broken media image instead. + +## Media Frames + +You can use the Media Frame element to designate areas you would like media objects to snap to in-world. Media Frames can accept both 2D media and 3D models. + +![mediaframe element in spoke](https://user-images.githubusercontent.com/4493657/142088604-0c8cac09-f8c7-401a-b363-799f319565e9.png) + + + +## Audio Zones + +Audio Zones are 3D volumes that modify the audio properties of audio sources (avatars, videos, audios, audio targets, etc) based on the source's and listener's positions with respect to the audio zone. One obvious application would be to dim audio sources' volumes based on 3D areas like rooms to mimic the real world behavior. + +![Audio Zones Example Image 1](/img/audio-zones-example-0.jpg) + +Audio Zones work based on the audio source and the audio listener's positions and they can be of **inOut** and/or **outIn** types. + +- **inOut:** The audio zone's parameters will be applied to audio sources inside the audio zone volume when the listener is outside the zone. +- **outIn:** The audio zone's parameters will be applied to audio sources outside the audio zone volume when the listener is inside. + +drawing + +
_InOut zone that blocks all the audio sources coming from the inside._
+ +drawing + +
_OutIn zone that blocks all the audio sources coming from the outside._
+ +Audio zones can be inside other audio zones, in that case the applied parameters will be a reduction of the most restrictive parameters. + +drawing + +
_If there are two audio-zones in between the listener and the source and the first one has gain == 0.1 and the other has gain == 0.5, gain == 0.1 is applied to the source._
diff --git a/docs/creators/spoke/architecture-kit.md b/docs/creators/spoke/architecture-kit.md new file mode 100644 index 0000000..cd0209c --- /dev/null +++ b/docs/creators/spoke/architecture-kit.md @@ -0,0 +1,39 @@ +--- +sidebar_position: 6 +--- + +# Architecture Kit + +With the launch of the Architecture Kit, creators now have an additional way to build custom content for their 3D scenes without using an external tool. The Architecture Kit is designed to make it easier to take existing components that have already been optimized for VR and make it easy to configure those pieces to create original models and scenes. + +This kit contains over 400 different pieces that are designed to be used together to create buildings - the collection includes wall, floor, ceiling, and roof pieces, as well as windows, trim, stairs, and doors. + +![Hubs Image](/img/CoastalCliffHouseShot1.jpg) + +## How to use the architecture kit + +Head to [Spoke](https://hubs.mozilla.com/spoke) and start a new project. In the asset panel, find the section labeled "Architecture Kit." + +![Spoke Properties Panel](/img/spoke-architecture-kit-asset-panel.png) + +Drag and drop the components from the asset panel into your scene. Change the texture material in the object's properties panel. + +![Spoke Properties Panel](/img/spoke-architecture-kit-properties-panel.png) + +## Making kit pieces double sided + +After placing objects in the room, you may notice that they dissappear depending on what direction you are looking at them from. This is because all the objects are single sided, which helps improve performance. It also allows creators to have one side of a wall use a different material than the other side, for example, an interior painted wall and and exterior wall with brick. If you would like to make your wall double sided, copy (ctrl+c, command+c) and paste (ctrl+v, cmmd+v) the object, and then press the Q or E key twice to rotate it 180 degrees. + +## Adding trim + +By default kit pieces like walls don't connect in the corners. You might find there is a narrow gap in particular exterior corners. These spots are are designed to fit trim pieces. + +![Spoke Properties Panel](/img/spoke-architecture-kit-trim.png) + +## Examples of rooms built with the architecture kit + +The following are just a few examples of scenes created using the architecture kit + +- [Hubs Commons](https://hubs.mozilla.com/scenes/T5QUL3L/hubs-commons) +- [Catacomb](https://hubs.mozilla.com/scenes/kDTJ34d/catacomb) +- [Spiral Tower](https://hubs.mozilla.com/scenes/uNVZeKd/spiral-tower) diff --git a/docs/creators/spoke/building-with-spoke.md b/docs/creators/spoke/building-with-spoke.md new file mode 100644 index 0000000..64e13d1 --- /dev/null +++ b/docs/creators/spoke/building-with-spoke.md @@ -0,0 +1,31 @@ +--- +sidebar_position: 1 +--- + +# Building Scenes with Spoke + +Want to build custom VR worlds for Hubs? Meet [Spoke](https://hubs.mozilla.com/spoke)! 👋 + +Spoke is an online 3D scene editor developed by the Mozilla Mixed Reality team. With Spoke, you can build environments using 3D models, architecture kit pieces, lights, images, videos, and more. Once your scene is ready, you can upload it to Hubs, or export it as a glTF 3D model. + + + +### ✏️ Create + +No external software or 3D modeling experience required — build 3D scenes using the Spoke web editor so you can have a space that's entirely custom to your needs. From a board room to outer space and beyond, your space is in your control. + +### 🔭 Discover + +Explore images, videos, and 3D models from around the web, all without opening up a new tab. With media integrations from Sketchfab and Google Poly, you'll be on your way to creating a scene in no time. + +### 🎉 Share + +Invite people to meet in your new space by publishing your content to Hubs immediately. With just a few clicks, you'll have a world of your own to experience and share — all from your browser. + +![Screenshot of Spoke](/img/intro-spoke-screenshot-min.jpeg) + +## Getting started + +To build your first custom 3D environments check out Spoke's [interactive tutorial](https://hubs.mozilla.com/spoke/projects/tutorial) or take a look at the [Spoke documentation](./spoke-creating-projects.html). diff --git a/docs/creators/spoke/create-project.md b/docs/creators/spoke/create-project.md new file mode 100644 index 0000000..ea7f442 --- /dev/null +++ b/docs/creators/spoke/create-project.md @@ -0,0 +1,50 @@ +--- +sidebar_position: 2 +--- + +# Create A Project + +In Spoke, you can either create a new project from Scratch, remix an existing Hubs scene, or import a Spoke project someone sends you. + +## Start a new project + +To create a new Spoke project head to [hubs.mozilla.com/spoke](https://hubs.mozilla.com/spoke) and click ‘Get Started’. + +![Spoke Landing Page](/img/spoke-landing-page.jpeg) + +If it's your first time, you will have the option to follow a tutorial to get familiar with the features. If you've created scenes in Spoke before and are signed in, you will see your previous projects listed here. + +![Spoke Projects Page](/img/spoke-projects-page-welcome.jpeg) + +Select "New Project" and you'll be able to pick existing scenes from the community to remix or "New Empty Project" to start from scratch. + +![Spoke Templates](/img/spoke-template.jpeg) + +From here you can customize your scene entirely to your liking! Try [adding content](./spoke-adding-scene-content.md) to your scene, or building a house with our [architecture kit](./spoke-architecture-kit.md). + + + +## Remixing Scenes from Hubs + +Scenes that are published to Hubs with a creative commons license are remixable. You can import them into Spoke from Hubs as follows: + +1. From inside a Hubs room using the scene open the dropdown menu +2. Select ‘Room & Scene Info‘ +3. Click on the name of the scene to open its landing page +4. Select ‘Remix in Spoke‘ + + + +## Import a .spoke file + +If someone wants to share their Spoke scene with you without publishing it to Hubs, they can export it as a .spoke file. You can import .spoke files as follows: + + Click the ‘New Project’ button + In the menu, select File > Import legacy .spoke project + Select ‘Ok’ in the prompt (be careful of overwriting something you want to keep) and then select the desired file to upload. diff --git a/docs/creators/spoke/grid.md b/docs/creators/spoke/grid.md new file mode 100644 index 0000000..5342eba --- /dev/null +++ b/docs/creators/spoke/grid.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 7 +--- + +# Grid + +![Screenshot of Spoke](/img/spoke-grid.png) + +When you first create a new scene in Spoke, you will see the grid in the viewport window. To show or hide the grid press the Toggle Grid Visibility button in the upper menu. + +![Screenshot of Spoke](/img/spoke-grid-toggle.png) + +By default, Snap Mode is enabled, and objects will automatically snap in line with the grid. To disable this, press the Toggle Snap Mode button. + +![Screenshot of Spoke](/img/spoke-snap-toggle.png) + +You can fine tune the size of the grid by changing the number in the box next to the Toggle Snap Mode button. By default, the squares of the grid are .5 meters. Next to this you can change the amount by which an object rotates when you press the Q + E buttons while the object is selected. + +When you first load the scene, the grid will be at the height of 0 on the y access. However, if you are working on a scene that has multiple levels (e.g. floors in a house), you may wish to increase or decrease the height of the grid to make positioning of objects easier when they are not flush with the ground. + +![Screenshot of Spoke](/img/spoke-increment-grid-height.png) diff --git a/docs/creators/spoke/lighting-and-shadows.md b/docs/creators/spoke/lighting-and-shadows.md new file mode 100644 index 0000000..bc00858 --- /dev/null +++ b/docs/creators/spoke/lighting-and-shadows.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 9 +--- + +# Lighting and Shadows + +## Lights + +Lighting can change the mood of your scene. In addition to [Skyboxes](./spoke-skyboxes.html), lighting can come from the following sources: + +| Light | Effect | +| ----------------- | ---------------------------------------------------------------- | +| Ambient Light | Illuminates all objects in your scene | +| Hemisphere Light | Illuminates your scene from directly overhead | +| Directional Light | Illuminates the entire scene, but emits along a single direction | +| Spot Light | Emits along a direction, illuminating objects within a cone | +| Point Light | Emits in all directions from a single point | + +### Shadow Settings + +In the propertie panel for the various lights you will find shadow settings. The settings available vary depending on the type of light. + +| Setting | Effect | +| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Cast shadows | Toggle on/off whether your light will cast shadows. Note you can also set objects to receive shadows | +| Shadowmap resolution | Resolution of the shadowmap, if you turn it down the resolution will be more blocky (or sometimes soft looking), if you turn it up it will increase the resolution but will make your scene more expensive to run | +| Shadow Bias | A per pixel offset of your shadow, Use to fine tune the position of your shadow. This can be used to help reduce the appearance of shadow acne | +| Shadow Radius | Size of the shadow. | + +## Lighting performance on mobile + +You may notice that the lighting in your scene is different on desktop than on mobile devices. Some lighting features are disabled on mobile for performance reasons. diff --git a/docs/creators/spoke/linking-rooms.md b/docs/creators/spoke/linking-rooms.md new file mode 100644 index 0000000..c21a1ee --- /dev/null +++ b/docs/creators/spoke/linking-rooms.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 11 +--- + +# Linking Hubs Rooms + +It is possible to link Hubs rooms together using Spoke, or from directly in Hubs. To do this, you will want to first create your rooms, then build scenes for the rooms that use the 'Link' element to reference to other rooms. + +## Create rooms + +The first thing that you want to do is create your rooms. While you have the ability to create rooms directly from a scene URL, this will generate a new room each time. In order to link multiple rooms together, we recommend generating the rooms first, then updating the rooms to use a scene that contains links to the other room. + +1. Go to [https://hubs.mozilla.com/](https://hubs.mozilla.com/) and use the 'Create Room' button to create a new room. You can use the 'Favorite' button to keep the room pinned to your home page to find it easily, or copy the link somewhere. +2. Do this for each room that you want to have available + +## Option 1: Linking rooms from inside Hubs + +It is possible to link rooms together directly from inside of another Hubs room without having to create new scenes. To do this: + +1. Visit the room that you want to add other room links to +2. Copy the URL to another Hubs room +3. Paste the URL anywhere in the first room. This will generate a screenshot of the room, and add a 'Visit Room' link + +## Option 2: Linking rooms inside Spoke scenes + +You can also link Hubs rooms together from inside of a Spoke scene. To do this: + +1. Create a scene +2. Use the Spoke 'Link' element to create a new link in your scene +3. Place the link element where you want your portal to the other room to be +4. Copy the room link that you want to link to into the link element 'URL' property +5. Publish your scene +6. In the original room, change the scene link to the one that contains your new scene that links to the other room +7. Repeat steps 1-6, publishing a second scene that links to the first room, and use that for your second room + +Note that you can use the same project in Spoke as a base by using the 'Save As' feature to create a copy of your project. If you use the same project, it will update the original scene, which will result in the first room updating to link back to itself. diff --git a/docs/creators/spoke/optimizing-scenes.md b/docs/creators/spoke/optimizing-scenes.md new file mode 100644 index 0000000..c9ed56e --- /dev/null +++ b/docs/creators/spoke/optimizing-scenes.md @@ -0,0 +1,55 @@ +--- +sidebar_position: 12 +--- + +# Optimizing Scenes + +## Improving Performance + +When building Hubs scenes, you'll most likely want them to perform well across a wide-range of devices. From high-powered wired-in VR headsets, to low-powered mobile phones; performance of a scene may vary based on the type of device and connection speed of a your visitors. + +One way to improve performance for everyone is to reduce the complexity of a scene. This could involve reducing the number of objects in a scene or optimizing the assets you are using. In the following section we will briefly cover steps you can take to optimize your assets. + +### Measuring performance + +To take a closer look at your scene's performance, you can open up the VR Status menu. Click on the FPS meter in the lower right hand corner on desktop (or in VR, type /vrstats into the chat box). This will show you additional information on the load time, number of triangles, and textures in your scene. + + + +### Optimizing Images & Videos + +Very large, detailed images and videos can reduce performance on the web. If you are including a lot of this type of media in your scene, you can do the following to maintain good performance. + +- Reduce the dimensions of large images/video +- Compress the files, use the "save for web" feature in Photoshop for images, or use an online image or video compression tool to reduce the file size +- Try converting .png images to .jpeg, as these often have smaller file sizes. +- Convert GIFs to video format, as they run more efficiently in Hubs. + +### Optimizing 3D Models + +Complex 3D models can cause performance challenges in your scenes. Two main factors contribute to an object's complexity, firstly, the texture assets in a model, secondly, the number of triangles in the model itself. Typically the more realistic a model appears, the more complex the model is (although this is not always the case). + +3D models found using the Sketchfab and Google Poly browser in Spoke and Hubs are already filtered based on objects' sizes/complexity. However, if you want to improve the performance of another downloadable model, you can either reduce the objects texture size, or you can reduce the number of triangles. You can use a tool like [Blender](https://www.blender.org/) to do this. + +#### Reduce texture size + +To reduce the image texture size of a glb model, you can either covert to a gltf file, so that there is a folder with all the texture files and reduce the size of the image textures using a tool like photoshop (reduce the size of the images by half, or by a quarter for example). + +We've also made a [video of other things you can do to optimize the size of your textures in Blender](https://www.youtube.com/watch?v=6uhAp1m1SXQ). + +#### Reduce number of triangles + +There is no golden rule of thumb for what number of triangles in a model is ideal, however, we recommend using models with only tens of thousands, rather than hundreds of thousands of triangles. Many complex 3D models can have their triangle count reduced without greatly impacting the way that the model looks. You can do this using the Mesh Decimation tool in Blender. For instructions, check out [this video](https://www.youtube.com/watch?v=IIQNj-6_tQE_) + +## Oculus Quest & Mobile Notes + +Note that some scenes might look different + + diff --git a/docs/creators/spoke/physics-and-navigation.md b/docs/creators/spoke/physics-and-navigation.md new file mode 100644 index 0000000..5612ff8 --- /dev/null +++ b/docs/creators/spoke/physics-and-navigation.md @@ -0,0 +1,31 @@ +--- +sidebar_position: 9 +--- + +# Physics and Navigation + +## The Floorplan Element + +The floorplan defines both where you can walk and how interactable objects collide with the scene. It creates a navigation mesh (where you can walk, the blue mesh when you have the floorplan selected) and a collision mesh (what objects collide with, the red or yellow mesh depending if you are using the trimesh or heightfield). + +![Description of the Floor Plan Panel's properties](/img/FloorPlan.png) + +## Navigation Mesh Generation + +When you click regenerate and when you publish your scene, Spoke generates a nav mesh by doing the following: + +First Spoke combines all the walkable geometry in the scene into one big mesh. Then Spoke voxelizes the mesh. If you've ever seen a Minecraft world, your mesh will be converted into something like a Minecraft landscape. Where the size of the voxels are defined by the cell size and cell width. + +If you have a large scene, you'll need a lot of voxels. Sometimes so many voxels that it can crash. So Spoke had the auto cell size checkbox that will try to keep a reasonable number of voxels to work with. You may get good results with it checked, but usually Spoke can get better results by tweaking some of these values. All of the algorithms that determine if you can walk in a certain area are computed against these voxels. So the higher resolution it is, the more it is going to look like your actual scene. For example, if you have a doorway that is 1m wide and your cell size is 0.25m, the width of the door in the voxelized data structure may only be 0.75m, because one of those voxels intersected with the side of the door. All of the other parameters in calculating the floor plan are dependent on the cell size and cell height. So try reducing the cell size to something small like 0.1m and increasing if it refuses to regenerate or takes too long on your computer. + +Once you have the cell size and cell height tuned, you can fix various other issues with the other parameters. If you have a walkway that is not accessible you can reduce the agent radius or agent height so that the avatar will fit though the voxelized walkway. If you have a ramp or stairs or hill that you can't climb try adjusting the maximum step height and maximum slope. These parameters control how tall of objects you can walk up and what the maximum slope of the path can be. You may have a series of small areas such as some stepping stones in the middle of a creek that are not walkable because they are too small. The minimum region area controls how small the area can be before it is excluded from the navmesh. Note that the agent radius will also matter here. + +Sometimes your mesh will not be very friendly to work with the navmesh generator. In these cases it is recommended to create a custom navmesh in Blender. It can be a simplified mesh that you add as a separate model to your Spoke scene. Mark it as walkable. Then mark the other models that it is taking the place of as not walkable. For smaller fixes to the navmesh you can use the Box Collider to make a walkable area. + +## Collision Mesh Generation + +For collisions Spoke has two methods of generating a collision mesh. The first is the trimesh, it's a combination of all of the collidable meshes in your scene. If the trimesh is too dense, it can cause performance issues in the collision system. For this reason, Spoke also has the heightfield. + +The heightfield divides the scene up into a 2D grid. Looking from above, the heightfield is constructed by finding the height at the center of each cell of the grid. It ends up looking kind of like if you draped a cloth over your environment. It works relatively well for outdoor terrains, but suffers when there are smaller collidable objects, walls, and overhangs. The heightfield cannot create an accurate collision mesh for multi-level scenes. It would only create collision geometry for the top layer of all the collidable geometry in the scene. + +Box colliders can also be used in addition to either method. They are simplified colliders that can help a lot when you have a mesh with complex geometry. diff --git a/docs/creators/spoke/publish-scenes.md b/docs/creators/spoke/publish-scenes.md new file mode 100644 index 0000000..ba2fb7a --- /dev/null +++ b/docs/creators/spoke/publish-scenes.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 10 +--- + +# Publishing Scenes + +You can publish a scene either directly to Hubs, or you can export it as a .glb file or as a legacy Spoke scene. + +## Publishing to Hubs + +When you publish to Hubs, your scene will have a unique URL. On this landing page there is a link to ‘Create a Room with this Scene’ that you can use to create Hubs rooms that uses the scene as a base, and a link that others can use to remix in Spoke. + +![Hubs Image](/img/spoke-scene-remixing.jpeg) + +Always remember to generate a floor plan before exporting your scene to Hubs! For more information check out the [Floorplan](./physics-and-navigation.html) + +Click the 'Publish to Hubs...' button in the upper right corner. You will receive a prompt to rename your scene. + +You will need to login in save and publish your scene. All you need to do is send a magic link to your email. + +Add attributions, and click 'Save and publish' + +If you’ve added models from the search panel in Spoke, attributions for the content will be added to the scene description automatically, but you can add additional attributions for content that you’ve brought in from external sources. + +You will have the options to : + +- Allow Remixing with Creative Commons CC-BY 3.0 - allows users to use your scene as a base template for their own +- Allow Mozilla to promote my scene - this lets mozilla add the scene to the publicly accessible scene database if it meet + +## Export as .glb file + +Exporting as a .glb (glTF binary) file will export the scene into a single .glb file that could be used in other programs that support loading glb files. Please note that the glb is a compiled binary, and cannot be opened in a readable-text format the way that glTF files can. + + In the dropdown menu, select File > Export as binary .glTF (.glb) + +## Export as .spoke file + +Exporting as a legacy Spoke scene will create a .spoke file that can be imported into another Spoke account. You can also share scenes in spoke by labelling them as 'remixable' and sharing the link to the scene with others. + + In the dropdown menu, select File > Export legacy .spoke project diff --git a/docs/creators/spoke/skyboxes.md b/docs/creators/spoke/skyboxes.md new file mode 100644 index 0000000..1f3282d --- /dev/null +++ b/docs/creators/spoke/skyboxes.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 8 +--- + +# Skyboxes + +Skyboxes can significantly impact the ambience of your scene. Unless you have started from a template that removed the default elements, you should have a skybox in your scene when you begin. + +![Screenshot of Spoke](/img/spoke-skybox.png) + +The skybox properties panel lets you fine tune the existing skybox. You can change the following qualities: + +- Time of Day +- Latitude +- Luminance +- Scattering Amount +- Scattering Distance +- Horizon Start +- Horizon End + +![Screenshot of the skybox property panel](/img/spoke-skybox-properties.png) + +## Adding a custom skybox + +It is not possible to add a custom Skybox to a scene. However, one workaround is to insert a 360 image inside of your scene to obscure the existing Skybox. + +For an example of this, check out the [Rolling Hills](https://hubs.mozilla.com/scenes/iu2htZZ/rolling-hills) scene. To see how it's assembled in Spoke, click the "Remix in Spoke" button. + +![Screenshot of the skybox property panel](/img/spoke-skybox-360.png) diff --git a/docs/creators/spoke/spoke-controls.md b/docs/creators/spoke/spoke-controls.md new file mode 100644 index 0000000..aa97599 --- /dev/null +++ b/docs/creators/spoke/spoke-controls.md @@ -0,0 +1,104 @@ +--- +sidebar_position: 4 +--- + +# Spoke Controls + +We recommend using spoke on a desktop or laptop computer as some features are not accessible without a mouse and keyboard. + +## Mouse + + + + + + + + + + + + + + + + + + + + +
Action Button Notes
Rotate Scene Left Mouse Button In the Viewport panel
Pan Scene Middle Mouse Button In the Viewport panel
Fly Right Mouse Button + WASD keys In the Viewport panel
Zoom Scene Scrollwheel In the Viewport panel
Focus Object Double-click In the Hierarchy panel
+ +## Keyboard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Action Key Notes
Translate Tool T Only in the Viewport panel
Rotate Tool R Only in the Viewport panel
Scale Tool Y Only in the Viewport panel
Focus Selection F Only in the Viewport panel
Toggle Global/Local Transform Space Z Only in the Viewport panel
Toggle Center/Selection Pivot X Only in the Viewport panel
Increase Grid Height = Only in the Viewport panel
Decrease Grid Height - Only in the Viewport panel
Rotate Selected Object Left Q Only in the Viewport panel
Rotate Selected Object Right E Only in the Viewport panel
Toggle Snap Mode C Only in the Viewport panel
Invert Snap Mode Ctrl/Cmd While dragging objects in the Viewport panel
Delete Delete, Backspace In the Viewport panel and the Hierarchy panel
Duplicate Ctrl/Cmd + D In the Viewport panel and the Hierarchy panel
Group Selected Ctrl/Cmd + G In the Viewport panel and the Hierarchy panel
Copy Selected Ctrl/Cmd + C In the Viewport panel and the Hierarchy panel
Paste Selected Ctrl/Cmd + V In the Viewport panel and the Hierarchy panel
Undo Ctrl/Cmd + Z In the Viewport panel and the Hierarchy panel
Redo Ctrl/Cmd + Shift + Z In the Viewport panel and the Hierarchy panel
Save Ctrl/Cmd + S In the Viewport panel and the Hierarchy panel
Scrub faster Shift While scrubbing numeric properties
Scrub slower Alt/Option While scrubbing numeric properties
diff --git a/docs/creators/spoke/user-interface.md b/docs/creators/spoke/user-interface.md new file mode 100644 index 0000000..0dbf4d7 --- /dev/null +++ b/docs/creators/spoke/user-interface.md @@ -0,0 +1,133 @@ +--- +sidebar_position: 3 +--- + +# User Interface + +![Hubs Image](/img/spoke-user-interface.jpeg) + +## Toolbar + +![Toolbar](/img/spoke-toolbar.jpeg) + +### 1. Dropdown Menu + +In the dropdown menu you will find options to save, save as, export your file, as well as find help on how to use Spoke. + +### 2. Transformation Tools + +**Translate [T]:** Reveals the translation gizmo, drag the arrows to move object along the X, Y, or Z axis. you can also move objects around using the grab tool. While objects are selected press G to grab the selection move your mouse and click to place the object in the scene. PRess Esc or G again to cancel the current grab operation. + +**Rotate [R]:** Reveals the rotation gizmo, drag the rings of the gizmo to rotate the object along the X, Y, or Z axis. + +**Scale [Y]:** Reveals the scale gizmo, drag the center cube of the gizmo to scale the object up or down. + +### 3. Grid Tools + +**Toggle Transform Space [Z]:** - regarding the transform space-- It's changing the transform gizmo to be oriented to the World XYZ vs. the Object's XYZ. You won't really see a difference until you rotate the object. +like, rotate a car 45 degrees. Then, to go 'forward', you'd want to switch to the object's local axis + +**Transform Pivot [X]:** Sometimes placing an object can be tough if the model's pivot point is set incorrectly. You can change how the pivot is caluclated using this dropdown menu. Can be set to center, bottom, or selection. + +**Toggle Snap mode [C]:** Sometimes you may want to move and object with a prevision position or rotation. To do this toggle the snapping mode by clicking on the magnet icon. You can set the translation and rotation snap settings by using the dropdown menus. + +**Snap Mode Controls:** determines how precisely your transformation tools are applied + +**Toggle Grid Visibility:** Shows/hides the grid on 3D grid. In placement mode, objects canbe placed on top of other objects or the grid. When building verticailly it can be useful to change the grid height + +- Press `=` to increase grid height +- Press `-` to decrease grid height + +### 4. Publish To Hubs + +Click this button to open the publish dialog where you can edit your scene's information before publishing it to Hubs. + +## Viewport Panel + +![Viewport Panel](/img/spoke-viewport-panel.jpeg) + +The viewport shows a preview of your scene where you can select and move objects. + +> Note that whatever the viewport is looking at when you publish the scene to hubs will be the scene's thumbnail image. + +### Object Selection + +You can select objects by clicking on them (hold shift to select multiple objects). + +### Camera Movement + +Left click and drag to orbit around your scene. Hold the right mouse button to enter fly mode where you can use your mouse to look around the scene and the WASD keys to move the camera. Press the `F` key to focus the selected objects. + +### Transform Gizmo + +When you have one or more objects selected, the transform gizmo will appear. + +## Hierarchy Panel + +![Hierarchy Panel](/img/spoke-hierarchy-panel.jpeg) + +Objects you add to the scene show up in the hierarchy panel. Double click the object focus it in the viewport. You can drag objects inside the hierarchy panel to reorder or reparent them. You can also drag drop items from the assets panel and files from your computer into the hierarchy panel to add them to your scene. + +## Properties Panel + +![Properties Panel](/img/spoke-properties-panel.jpeg) + +Additional object properties can be set in the properties panel. This includes things like shadows, light color, and more. + +Objects are added to Spoke and can be customized by changing their properties. Different types of objects have different properties available to them (for example, a light will have an "intensity" property, but a 3D model won’t). Most objects will have transform properties, which represent the physical position in the space. + +## Assets Panel + +![Assets Panel](/img/spoke-assets-panel.jpeg) + +You can find content to add to your scene in the assets panel. You can click on assets to add them to the scene. Assets can also be dragged from the assets panel and dropped onto the viewport, hierarchy panel, or properties panel. + +### Asset Sources + +On the left side of the assets panel are a list of sources: + +#### Elements + +Elements are the basic building blocks in Spoke. You'll find lights, media, spawn points, and every other type of object here. + +#### My Assets + +Upload and search your own 3D models, images, videos, and audio. + +#### Architecture Kit + +The Architecture Kit contains pieces that can be put together to construct a wide variety of structures. This kit contains floors, walls, stairs, and more. + +#### Rock Kit + +The Rock Kit contains a collection of realistic rock models that can be used to add detail to terrain, construct platforms, or anything else you might need a rock for. + +#### Sketchfab + +Sketchfab is an online marketplace for 3D models. It contains a wide variety of high quality models to help you fill out your scene. + +#### Google Poly + +Google Poly is another source for 3D models. Most models are in a flat low poly style. + +#### Bing Images + +Search Bing for images from around the web. + +#### Bing Videos + +Search Bing for videos from around the web. + +#### Twitch + +Find live streams of games and more on Twitch. + +#### Tenor Gifs + +Find animated gifs to add to your scene on Tenor. + +## Experimental Features + +We're continuously working on new features for Spoke. To try them out, you can enable experimental features. Note that these features are still in testing stages, and may not continue to be supported. + +![Experimental Features](/img/spoke-experimental-features.jpeg) diff --git a/docs/developers/_category_.json b/docs/developers/_category_.json new file mode 100644 index 0000000..7e28f9b --- /dev/null +++ b/docs/developers/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "For Developers", + "position": 5, + "link": { + "type": "generated-index" + } +} diff --git a/docs/developers/community-edition/_category_.json b/docs/developers/community-edition/_category_.json new file mode 100644 index 0000000..c51165e --- /dev/null +++ b/docs/developers/community-edition/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Hubs Cloud Community Edition", + "position": 2, + "link": { + "type": "generated-index" + } +} diff --git a/docs/developers/community-edition/intro-ce.md b/docs/developers/community-edition/intro-ce.md new file mode 100644 index 0000000..f6884b5 --- /dev/null +++ b/docs/developers/community-edition/intro-ce.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 1 +--- + +# Introduction to Hubs Cloud Community Edition + +Documentation coming soon... diff --git a/docs/developers/contributing/_category_.json b/docs/developers/contributing/_category_.json new file mode 100644 index 0000000..a567fb1 --- /dev/null +++ b/docs/developers/contributing/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Contributing to Hubs", + "position": 3, + "link": { + "type": "generated-index" + } +} diff --git a/docs/developers/contributing/intro-contrib.md b/docs/developers/contributing/intro-contrib.md new file mode 100644 index 0000000..21b5d32 --- /dev/null +++ b/docs/developers/contributing/intro-contrib.md @@ -0,0 +1,73 @@ +--- +sidebar_position: 1 +--- + +# Introduction to Contributing + +This page outlines opportunities for people who want to contribute to the Hubs project. We welcome external contributions that align with the project's mission around enabling collaboration and communication through shared 3D spaces. You can find information about how to contribute to Hubs and the supporting projects that make up the platform here. + +Contributors are expected to abide by the project's [Code of Conduct](https://github.com/mozilla/hubs/blob/master/CODE_OF_CONDUCT.md) and to be respectful of the project and people working on it. + +The following GitHub projects are part of the Hubs platform and governed by these contributing guidelines: + +- https://github.com/mozilla/hubs/ - the core Hubs project +- https://github.com/mozilla/spoke - 3D editor for creating scenes +- https://github.com/mozilla/dialog - networking +- https://github.com/mozilla/reticulum - server infrastructure for Hubs +- https://github.com/mozilla/hubs-ops - operations infrastructure for Hubs +- https://github.com/MozillaReality/hubs-discord-bot - Hubs' Discord integration + +## Quick Start + +We are happy to receive contributions to the Hubs platform in a number of different ways as outlined below. Please note that all contributions are subject to approval by the project maintainers. We ask (but do not require) that those interested in contributing to Hubs consider joining the public [Hubs Discord chat server](https://discord.gg/wHmY4nd) to connect with the dev team, ask questions, and view discussions about work being done on the project. + +### 💻 Code Contributions + +Hubs has a client-server architecture that gives multiple users the ability to connect to a shared room on the server. If you are interested in contributing to the Hubs client, follow the instructions in the [Readme](https://github.com/mozilla/hubs#readme) to get started. If you want to contribute to the networking or infrastructure, consider looking at the [reticulum](https://github.com/mozilla/reticulum) or [Dialog](https://github.com/mozilla/dialog) repositories. If you are interested in working on the code for Spoke, the 3D editor used to create custom environments for Hubs rooms, explore the [Spoke](https://github.com/mozilla/spoke) repository. + +For more information on the inner workings of Hubs and the architectural decisions behind the project, check out [this presentation on the Mozilla Hubs Code Base](https://vimeo.com/365531296) by Engineering Lead Greg Fodor. + +Issues that are open are tagged. If you explore a bug or feature request that you'd like to fix, make a comment on the case so we know you're looking into it! We try to use the '[good first issue](https://github.com/mozilla/hubs/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)' tag to identify some cases that may be easier than others to begin with as you get started with the code base. + +Steps to contributing code to the Hubs project: + +1. Clone the repo you want to contribute to and get things running locally +2. Find an issue or improvement that you want to fix - give us a heads up that you're working on it by dropping in a comment on the issue. +3. Fix the bug! Test out your changes on your local setup and let us know if you have questions or want another opinion about the fix. +4. Submit your PR for a code review and someone from the team will take a look and give feedback. Make sure you follow up! We'll close the PR if it seems like you've abandoned it by not responding to any questions or comments we leave in the review. If your PR adds a new feature, consider requesting the 'What's New' tag. With the 'What's New' tag, any text in the main body of the PR up to (and including) an image will be added to the [Hubs website](https://hubs.mozilla.com/whats-new). Gifs are especially appreciated! [This pull request](https://github.com/mozilla/hubs/pull/1536) shows an example of how the 'What's New' tag can be used. +5. Celebrate! 🎉 You're helping Mozilla's mission to make the web an open and accessible place for social experiences! + +### 🐛Filing Issues and Feature Requests + +Reporting bugs, feature requests, and questions that you have about the platform helps the team prioritize the work that we're doing and make Hubs better! We welcome user-submitted issues and use GitHub's built-in issue tracking for our bug reporting process. + +- If you are filing a bug, please include information about the operating system, device, and browser that you were using when you saw the bug. _Example: Seen on Windows 10 with Firefox 66.0.5 on Oculus Rift_ + +- The more detail the better! If you are able to reproduce a bug on multiple different browsers or on both desktop and mobile, that information is helpful for us to know about + +- Screenshots when appropriate are much appreciated 📷 + +We will do our best to respond to and tag inbound issues as they are submitted in a timely manner. Bugs will be prioritized according to the following table: + +| Priority | Criteria | Example | +| -------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| P0 | Needs immediate attention. Affects many users and their ability to use core product functionality of connecting to rooms with other users. | No one can enter any Hubs rooms with any VR headset | +| P1 | Address as quickly as possible. Affects many users and their ability to use a common product feature. Workaround is difficult or unavailable. | Teleporting doesn't work for users on Quest with the Oculus browser. | +| P2 | Address when able. Affects some users regularly but mildly, or is a hard-to-repro failure seen rarely that is fixed with an easy workaround. | Lobby camera in Camera mode does not show emojis shared from iOS. One user reports getting disconnected after ten minutes in a particular room, but no one else experiences it and they are able to refresh to re-enter. | +| P3 | Address when able after P2 bugs are fixed. Affects a small set of users inconsistently in a non-breaking way with an easy workaround. | Every so often, a standalone VR headset will show up as a mobile phone in the user list. Refreshing fixes it. | + +### 🎨 3D Art + +If you are a 3D artist and want to support what we're doing with Hubs, consider creating and releasing content under a Creative Commons license or creating scenes using the [Spoke web editor](https://hubs.mozilla.com/spoke) and releasing them as remixable environments. Content with low polygon counts that are optimized to run well on the web are much appreciated! In particular, we'd love to see scenes that capture a wide range of experiences. + +### 📜 Documentation + +Our documentation for Hubs is hosted on the [GitHub Hubs Wiki](https://github.com/mozilla/hubs/wiki) section of the project. The documentation for Spoke is hosted on the [GitHub Spoke Wiki](https://github.com/mozilla/spoke/wiki) For contributing corrections or additional pages for the Wiki, please file an issue as a suggestion in the corresponding repository with your proposed content and we will review it and add it to the wiki when all looks good! + +### 🌐 Localization + +Hubs is currently en-US only, but if you would like to work with us on localization efforts, submit a suggestion through the GitHub issues and we'll work with you from there. + +### 🦆 General Help + +We believe in the power of community (that's why we're building this, after all!) and know that not all forms of support will come from something outlined here. Feel free to jump into our public [Discord chat server](https://discord.gg/wHmY4nd) to chat with us and ask about how you can get involved! See our [help page](./help.html) for other ways to contact us. diff --git a/docs/developers/contributing/issues.md b/docs/developers/contributing/issues.md new file mode 100644 index 0000000..7566e0f --- /dev/null +++ b/docs/developers/contributing/issues.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 2 +--- + +# Submitting Issues + +Documentation coming soon... diff --git a/docs/developers/contributing/pull-requests.md b/docs/developers/contributing/pull-requests.md new file mode 100644 index 0000000..e24ed5f --- /dev/null +++ b/docs/developers/contributing/pull-requests.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 4 +--- + +# Submitting Pull Requests + +Documentation coming soon... diff --git a/docs/developers/contributing/triage.md b/docs/developers/contributing/triage.md new file mode 100644 index 0000000..9e75b17 --- /dev/null +++ b/docs/developers/contributing/triage.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 3 +--- + +# Triage + +Documentation coming soon... diff --git a/docs/developers/development-basics/_category_.json b/docs/developers/development-basics/_category_.json new file mode 100644 index 0000000..76628b5 --- /dev/null +++ b/docs/developers/development-basics/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Development Basics", + "position": 1, + "link": { + "type": "generated-index" + } +} diff --git a/docs/developers/development-basics/dev-basics.md b/docs/developers/development-basics/dev-basics.md new file mode 100644 index 0000000..7aa58e1 --- /dev/null +++ b/docs/developers/development-basics/dev-basics.md @@ -0,0 +1,83 @@ +--- +sidebar_position: 3 +--- + +# Development Basics + +The Hubs client is a web application that runs in each user’s web +browser. It contains the HTML, CSS, and Javascript necessary to simulate a +networked 3D world and display interactive 2D menus. This document provides +an overview of the Hubs client: the technologies it uses, the backend services +it connects to, and how its code is organized. + +## Technologies and Backend Services + +The client combines several libraries and technologies to provide this +experience to users, and offers developers various ways to change and extend +its functionality. + +These are the main technologies in use by the hubs client: + +- [`Three.js`](https://threejs.org/) : `Three.js` is a 3D graphics and scene + graph library for building and creating 3D scenes. Three.js makes it easier + to use the browser’s built-in graphics capabilities, such as + [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API), + [WebXR](https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API), + and [WebGPU](https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API) + (someday). +- [`bitECS`](https://github.com/NateTheGreatt/bitECS) : `bitECS` is an ECS + library for managing game state that lives outside the `Three.js` scene graph. + In the Hubs client, most “things” (avatars, images, an animated + emoji) are referenced by an entity ID. This entity ID is used to access + component data stored in pre-allocated `TypedArrays`. +- [`Media Capture and Streams API`](https://developer.mozilla.org/en-US/docs/Web/API/Media_Capture_and_Streams_API), + [`WebRTC`](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API), + and [`WebAudio`](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) : + The `Media Capture and Streams API` allows microphones, cameras, and + screencapture to be accessed within the browser. Data is captured and encoded + locally before being sent (as `WebRTC` streams) to a backend service + ([`Dialog`](https://github.com/mozilla/dialog)), where they are forwarded to + other clients connected to the same room. Incoming streams are decoded and + transformed (e.g. by `PannerNode` s and `GainNodes` from the `WebAudio` API) + before being played through the user’s speakers. +- [`HTTP`](https://developer.mozilla.org/en-US/docs/Web/HTTP), + [`Web Sockets`](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) : + The Hubs client is web app, which means its code is downloaded when you visit a + hubs-powered site. After its initial load, the hubs client exchanges many, many + messages to the backend web server, [`Reticulum`](https://github.com/mozilla/reticulum). + To download assets like 3D model files and 2D images, the client makes `HTTP` + requests. To exchange game state information like, “where my avatar is + moving”, the client sends messages over a `Web Socket` connection + (specifically, via [`Phoenix channels`](https://www.phoenixframework.org/)). +- [`Webpack`](https://webpack.js.org/) and [`npm`](https://www.npmjs.com/) : + The Hubs client is built and bundled by `Webpack`. Building the client (or + custom versions of the client) typically involves running a few commands with + `npm`. +- [`Typescript`](https://www.typescriptlang.org/) : `Typescript` is a superset + of Javascript that compiles to Javascript. We adopted typescript in 2022. While + we are not trying to rewrite all of our existing javascript, new code is + usually written in typescript. + +## How the code is organized + +There are three main sections of application code: + +The [`admin`](https://github.com/mozilla/hubs/tree/master/admin) directory +contains a separate application that powers the Hubs admin panel. Note that +this directory will likely undergo changes in the near future. + +The [`react-components`](https://github.com/mozilla/hubs/tree/master/src/react-components) +directory contains all of the 2D UI shown in menus, modals, and toolbars +throughout the client. It is built with [`React`](https://react.dev/). + +The [`src`](https://github.com/mozilla/hubs/tree/master/src) directory contains +of the code that powers the 3D simulation. The entry points for various pages +are defined in `webpack.config.js`. + +## Where to go from here + +Check out the other docs. + +- [Core Concepts for Gameplay Code](./dev-client-gameplay.html) +- [Interactivity (WIP)](./dev-client-interactivity.html) +- [Networking](./dev-client-networking.html) diff --git a/docs/developers/development-basics/extending-client.md b/docs/developers/development-basics/extending-client.md new file mode 100644 index 0000000..5bf412f --- /dev/null +++ b/docs/developers/development-basics/extending-client.md @@ -0,0 +1,138 @@ +--- +sidebar_position: 7 +--- + +# Extending Hubs: Custom Clients + +Now that you have a working Hubs Cloud instance, you can create and deploy custom versions of the [Hubs Client](https://hubs.mozilla.com) yourself! By forking the [hubs repository](https://github.com/mozilla/hubs), making code changes, then deploying it to your live instance. + +Your custom client code will be based off of the [`hubs-cloud` branch](https://github.com/mozilla/hubs/tree/hubs-cloud) which hosts Hubs client changes compatible with Hubs Cloud servers. Changes due to upgrades will be visible in merged PRs on the branch. + +## Setup your Custom Client with your fork and upstream + +### Setup your fork of the hubs repo + +Your fork is a copy of the hubs repository on your github account. + +1. Create a [github account](https://github.com) +1. Go to https://github.com/mozilla/hubs +1. Click the "Fork" button in the upper right hand corner +1. You'll be redirected to [github.com/mozilla/hubs/fork](https://github.com/mozilla/hubs/fork) +1. Make sure to UNCHECK the 'Copy the master branch only' option so that you have access to all the branches +1. Go to your newly forked repo (upper left should say "your-github-username / hubs" NOT "mozilla/hubs") +1. Click green "Code button" to open the **clone** options for your repo +1. **Copy** the url, you'll need this copied url for the next steps (everyone new to git use HTTPS) + +Next, you will be cloning this repo onto your local machine. + +You'll need: **git** installed for this step. + +Run the following commands. To setup your forked repo on your machine. + +```bash +# Clone your forked hubs repository locally +git clone +cd hubs +git checkout hubs-cloud # to move to the hubs-cloud branch +``` + +The "hubs-cloud" branch should function as the "master" branch. Since Hubs Cloud clients are compatible with the hubs-cloud branch. For code changes, branch off this branch. + +### Setup upstream remotes + +Upstream remote repository points to the original hubs repo, so when the hubs repo get updated, your fork can pull in those changes and stay up to date. + +Next, setup the original hubs repo as a remote upstream repository to keep your branches up to date. + +```bash +# Connect to the mozilla managed hubs repository +git remote -v # should only print out "origin" your forked hubs repository url +git remote add upstream https://github.com/mozilla/hubs.git +git remote -v # now should see both origin + upstreams +``` + +You should see this printed: + +``` +origin +origin +upstream https://github.com/mozilla/hubs.git (fetch) +upstream https://github.com/mozilla/hubs.git (push) +``` + +Success! You've set up your fork and upstream repositories on your machine. + +## Run your custom client + +Now that you have the Hubs repository forked and cloned on your machine, you'll need to install some dependencies. You'll need [Node JS](https://nodejs.org/en/) installed first. Then you'll install the hubs dependencies. We recommend using `npm ci` instead of `npm install` so that you always use the versions of modules in the `package-lock.json` file. + +```bash +npm ci +``` + +To run the client against your Hubs Cloud stack and deploy code to it, you'll need to be authenticated. Run `npm run login` and follow the instructions to authenticate (Warning: NOT `npm login`). + +```bash +npm run login +``` + +Once you are logged in you can start up the local development server with `npm start`. Your local development server will automatically rebuild your javascript project and refresh the page when you make changes. It will also connect to your Hubs Cloud server for all API requests, game/voice networking, and fetching configurations set in your admin panel. + +```bash +npm start +``` + +After you've made changes to your client's code you can deploy the changes to your Hubs Cloud stack with the `npm run deploy` command. Once that has finished you should see the changes live on your site! Please expect the `npm run deploy` command to take a while. + +```bash +npm run deploy +``` + +> Note: When running a deploy, ensure webpack-dev-server (`npm start`) is **not** running. This may cause conflicts in the build process. + +If `npm run deploy` hangs on "Building Admin Console" for more than 20 minutes: + +1. Stop then restart `npm run deploy` (sometimes it takes 2 tries to deploy) +1. If it still hangs on "Building Admin Console" you may have a problem building the Admin Console + +To test that your admin panel build is working, in your hubs repo root, try: + +1. `cd admin` - _be in the admin/ directory_ +1. `npm ci` +1. `npm run build` +1. If these commands succeed, try the `npm run deploy` command again. +1. If these commands fail, try `npm ci` and the `build` commands one more time, then fix the error in your code, then try these commands again. + +If at any point you want to revert your Hubs client back to using the Mozilla upstream version of the client, run `npm run undeploy`. + +```bash +npm run undeploy +``` + +## Update your Custom Client to the latest + +You need to pull in the latest changes to the hubs-cloud branch into your fork + code. + +Hubs Cloud is updated every month, to ensure your Hubs Cloud custom client is up to date, you should do this regularly in case of changes. See [Hubs Cloud Changelog](https://github.com/mozilla/hubs-cloud/blob/master/CHANGELOG.md) for details. + +Check your remotes for the upstream mozilla hubs repository. If not, follow "Setup remotes" steps above. + +```bash +git remote -v # should see origin AND upstream fetch/push .git urls +``` + +Fetch and merge the upstream Mozilla hubs-cloud branch into your branch. Especially important after a Hubs Cloud update. + +```bash +git fetch upstream # Gets all updates for your mozilla/hubs repo +git checkout your-current hubs-cloud-branch +git merge upstream/hubs-cloud # Merges updates from the hubs-cloud branch into your current branch +``` + +Resolve conflicts. Then, deploy the updates. + +```bash +npm run deploy +``` + +Congrats! Your client is now updated to the latest and live! diff --git a/docs/developers/development-basics/extending-plugins.md b/docs/developers/development-basics/extending-plugins.md new file mode 100644 index 0000000..3123687 --- /dev/null +++ b/docs/developers/development-basics/extending-plugins.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 8 +--- + +# Extending Hubs: Plugins + +Documentation coming soon... diff --git a/docs/developers/development-basics/gameplay.md b/docs/developers/development-basics/gameplay.md new file mode 100644 index 0000000..10f2b4d --- /dev/null +++ b/docs/developers/development-basics/gameplay.md @@ -0,0 +1,1176 @@ +--- +sidebar_position: 4 +--- + +# Core Gameplay Concepts + +## Intro + +This document gives an overview of the core concepts for writing gameplay +code in the Hubs client. + +### Gameplay + +TODO: Write this section to clarify the term "gameplay" + +### Target readers + +This document is intended for users with some coding experience that want to +extend the gameplay functionality of the Hubs client. + +## ECS (Entity Component System) + +[ECS](https://github.com/SanderMertens/ecs-faq#what-is-ecs) became a popular +topic in recent years. + +- [Unity’s `DOTS`](https://unity.com/dots) emphasizes data-oriented + design for speed and control, separates behavior from data, and helps + developers build multi-threaded game loops. +- [Supermedium’s `A-Frame`](https://aframe.io/) emphasizes ease of use + and a low barrier to entry, exposes [`Three.js`](https://threejs.org/) through + familiar HTML, and enables rapid prototyping with many built-in components and + hundreds more from the community. + +Originally built with `A-Frame`, Hubs switched to `bitECS` and using `Three.js` +directly. Motivation, goals, and non-goals about the transition can be found +in this PR from June, 2022. [#5536](https://github.com/mozilla/hubs/pull/5536) + +TODO: Write the scope in this document based on that PR + +### bitECS + +[`bitECS`](https://github.com/NateTheGreatt/bitECS) is an ECS framework written +in [`TypeScript`](https://www.typescriptlang.org/). + +The `bitECS` API is minimal, and +[its own documentation](https://github.com/NateTheGreatt/bitECS#--documentation) +should be consulted for details. The main ideas from the Hubs gameplay code +perspective are: + +- Component data are [structs of arrays](https://en.wikipedia.org/wiki/AoS_and_SoA). +- Entities are indices into these arrays. +- Queries filter entities by their associated components. + +`bitECS` has no built-in concept of systems. We frequently refer the functions +invoked during the game loop as “systems”, but there is no formal +construct. + +We highly recommend to understand the basic `bitECS` API and concept +[`from their documents`](https://github.com/NateTheGreatt/bitECS#--documentation) +before reading the following sections. No worry, they are very simple. + +### Disclaimer + +Much has been written about the philosophy of various ECS frameworks and design +choices. Our choices should not be interpreted fanatically. + +We need to store game state somehow, and conventions are useful. We use +`Three.js`, which means a lot of game state is stored in various `Object3D` +subtypes. We store the rest in `bitECS` entities and components, or `map` s +from entity to struct in cases where `bitECS` components won’t do. +Refer to [this section for this design decision](#avoid-duplicating-state). + +In other words, our game state is not “purely” in ECS, nor do we +care to make it so. The PR linked above states the (relatively humble) goals +and non-goals of our entity framework. + +## Three.js + +[`Three.js`](https://threejs.org/) is a JavaScript 3D graphics library. +We use this library for rendering 3D objects. + +3D objects are rendered in the 3D scene by +[`Three.js WebGLRenderer`](https://threejs.org/docs/#api/en/renderers/WebGLRenderer) +if [`Three.js Object3D`](https://threejs.org/docs/#api/en/core/Object3D) +subtype renderable objects (eg: [`Three.js Mesh`](https://threejs.org/docs/#api/en/objects/Mesh)) +are added to [`Three.js Scene`](https://threejs.org/docs/#api/en/scenes/Scene). + +We also highly recommend to understand the basic `Three.js` API and concept +[`from their documents`](https://threejs.org/docs/). + +## Add-on + +Add-on is one or set of application logics. It consists of components, +systems, and inflators. + +In the Hubs Client, most of the features are written as add-ons (eg: media +loading, physics, object menus, and so on). The rest of the features will be +rewritten as add-ons soon. + +You can also add your custom add-ons. + +Note that currently we don't have good APIs to register custom add-ons yet. +You are required to edit some Hubs Client core files. + +TODO: Add APIs to register custom add-ons. + +### Directories + +Most of the built-in add-on source codes are found in +[`src/components`](https://github.com/mozilla/hubs/tree/master/src/components) and +[`src/bit-systems`](https://github.com/mozilla/hubs/tree/master/src/bit-systems). +Also find the files imported from them. If you want to read the built-in add-on +code check the directories. + +### Simple example + +Let's start with making an easy and workable add-on example. We will make an +add-on that linearly moves Three.js objects associated with entities. You will +know likely what add-on is and how it looks like from this first easy example. + +First, we will define a new component needed for the add-on. `Velocity` +component holds a vector information that indicates the direction and speed +of movement. + +```typescript +// src/components/velocity.ts +import { defineComponent, Types } from "bitecs"; + +export const Velocity = defineComponent({ + x: Types.f32, + y: Types.f32, + z: Types.f32, +}); +``` + +Second, we will write a systems that moves Three.js objects. `velocitySystem` +gets the ids of entities that have `Velocity` and `Object3DTag` components by +using `bitECS` query, gets Three.js objects associated with entities, and updates +the objects' position. + +(`HubsWorld`, `eid2obj`, and `Object3DTag` will be explained in the later sections.) + +```typescript +// src/systems/velocity.ts +import { defineQuery } from "bitecs"; +import { Object3DTag } from "../bit-components"; +import { Velocity } from "../components/velocity"; +import { HubsWorld } from "../app"; + +const velocityQuery = defineQuery([Velocity, Object3DTag]); +export function velocitySystem(world: HubsWorld) { + velocityQuery(world).forEach((eid) => { + const obj = world.eid2obj.get(eid)!; + obj.position.x += Velocity.x[eid]; + obj.position.y += Velocity.y[eid]; + obj.position.z += Velocity.z[eid]; + }); +} +``` + +We will edit a bit an existing Hubs core file `src/systems/hubs-systems.ts` to +call `velocitySystem` from `mainTick` that is invoked every animation frame. + +```typescript +// src/systems/hubs-systems.ts +... +import { velocitySystem } from "../systems/velocity"; +... +export function mainTick(...) { + ... + velocitySystem(world); + ... +} +... +``` + +TODO: Add an API to register system. + +Next, we will write an inflator for `Velocity` component. Inflator is not +part of `bitECS` but a Hubs special that adds component(s) to an entity and +initializes component(s) data. + +```typescript +// src/inflators/velocity.ts +import { addComponent } from "bitecs"; +import { Velocity } from "../components/velocity"; +import { HubsWorld } from "../app"; + +export type VelocityParams = { + x?: number; + y?: number; + z?: number; +}; + +const DEFAULTS: Required = { + x: 0.0, + y: 0.0, + z: 0.0, +}; + +export function inflateVelocity( + world: HubsWorld, + eid: number, + params: VelocityParams +) { + params = Object.assign({}, params, DEFAULTS) as Required; + addComponent(world, Velocity, eid); + Velocity.x[eid] = params.x; + Velocity.y[eid] = params.y; + Velocity.z[eid] = params.z; +} +``` + +TODO: Rename inflator to addXXX for easiness to understand? + +The add-on is ready now. + +If you call the inflator from somewhere to add `Velocity` component and also +add Three.js object to entities, you will see the objects move in the 3D scene. + +```typescript +// somewhere +import { addEntity } from "bitecs"; +import { BoxGeometry, Mesh, MeshBasicMaterial } from "three"; +import { inflateVelocity } from "../inflators/velocity"; +import { addObject3DComponent } from "../utils/jsx-entity"; +import { HubsWorld } from "../app"; + +function xxx(world: HubsWorld) { + ... + const eid = addEntity(world); + inflateVelocity(world, eid, { + x: 1.0 + }); + addObject3DComponent(world, eid, new Mesh( + new BoxGeometry(1.0, 1.0), + new MeshBasicMaterial() + )); + ... +} +``` + +(`addObject3DComponent` will be explained in [the later sections](#entitydef-jsx-prefab).) + +If you want to allow your custom components to be created from `JSX` and/or +`glTF`, you also need to edit the core `src/utils/jsx-entity.ts` file for a +mapping from their key in the inflator. It will be explained later +[here](#entitydef-jsx-prefab) and [here](#inflators-for-gltf) for each. + +TODO: Write an outline of concepts in the form of an example before breaking +down the individual concepts. + +Let's look into systems, components, inflators, and others more details below. + +TODO: Consider to add a more concrete example with full functionalities (eg: +network and interactivity), or replace this simple and abstract example +with it. + +## Writing systems + +### Systems are functions + +`bitECS` has no built-in concept of [systems](https://github.com/NateTheGreatt/bitECS/blob/master/docs/INTRO.md#-system). +We frequently refer the functions invoked during the game loop as +“systems”, but there is no formal construct. + +TODO: Perhaps we may need to define the type of system function, +eg: `(world: HubsWorld) => void`. + +### The game loop + +We provide the browser’s +[`requestAnimationFrame`](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) +(or [`XRSession.requestAnimationFrame`](https://developer.mozilla.org/en-US/docs/Web/API/XRSession/requestAnimationFrame) +in [`immersive mode`](https://developer.mozilla.org/en-US/docs/Web/API/WebXR_Device_API)) +with our game loop function (`mainTick`), to be invoked each frame. All the +systems are invoked from `mainTick` one by one. + +If you want to your addon you need to edit `mainTick` to insert your systems. + +TODO: Write about system order + +### Accessing Entities + +[`bitECS` queries](https://github.com/NateTheGreatt/bitECS/blob/master/docs/INTRO.md#-query) +allow us to find entities based on the [components](https://github.com/NateTheGreatt/bitECS/blob/master/docs/INTRO.md#-component) +that are attached to them. `enterQuery` and `exitQuery` wrap regular queries so +that we handle when an entity first matches or stops matching a given query. +[The `bitECS` documentation](https://github.com/NateTheGreatt/bitECS#--documentation) +should be consulted for more details. + +Holding the references to entities may be danger because entities can be +deleted or even recycled [as explained later](#creating-entities). It is safer +to use queries as much as possible to fetch entities when needed. + +### Asynchronous Operations/Coroutines + +`async` functions should not be used. Instead, [`coroutines`](https://x.st/javascript-coroutines/) +should be used to ensure that systems run in `mainTick`. + +If you use `async` in a system, the system can restart outside of `mainTick`. +Using `coroutines` enforces systems to run in `mainTick`. We want all the +systems to run in `mainTick` for good lifecycle control. + +We provide `coroutine` helper functions. Refer to [the "JobRunner" section](#jobrunner) +below for details. + +## Writing components + +TODO: Write what components briefly are + +### Defining components + +`bitECS` [components](https://github.com/NateTheGreatt/bitECS/blob/master/docs/INTRO.md#-component) +are defined with [`defineComponent`](https://github.com/NateTheGreatt/bitECS/blob/master/docs/API.md#definecomponent--object). + +### Data types + +`bitECS` components natively support only numeric types: `i8`, `ui8`, `ui8c`, `i16`, +`ui16`, `i32`, `ui32`, `f32`, `f64`, and `eid`. + +Refer to the following sections if you want to use non-numeric types. + +### Avoid holding references + +The `eid` type indicates that the property values will be entity IDs. Be +careful when storing references to entities. If the referenced entity is +removed from the world with [`bitECS removeEntity()`](https://github.com/NateTheGreatt/bitECS/blob/master/docs/API.md#removeEntity), +then you should consider the entity reference in the component to be invalid! +You can use [`bitECS entityExists()`](https://github.com/NateTheGreatt/bitECS/blob/master/docs/API.md#entityexists) +to check whether the referenced entity still exists, but in general it is best +to avoid storing entity references if you can. + +The most common scenario for using the `eid` type is when building multi-entity +objects, such as in-world menus. The `VideoMenu` component in the Hubs Client +core stores references to each entity that has a target video or a part object +(eg: label or indicator) of the menu so that it can manage them all easily. + +```typescript +export const VideoMenu = defineComponent({ + videoRef: Types.eid, + timeLabelRef: Types.eid, + trackRef: Types.eid, + headRef: Types.eid, + playIndicatorRef: Types.eid, + pauseIndicatorRef: Types.eid, +}); +``` + +### String data + +We sometimes want to be able to store string data in components. Since `bitECS` +does not allow strings in components, we provide a helper mechanism to store +numeric string ID’s instead. + +Let's think of a `SceneLoader` component with a `src` property, which we +wish was a string, as an example. + +Define a component with `src` property as `ui32` type. And mark the `src` +property as string data with the symbol `$isStringType`, defined in the Hubs +Client core `src/bit-components.js` file. + +```typescript +export const SceneLoader = defineComponent({ src: Types.ui32 }); +SceneLoader.src[$isStringType] = true; +``` + +The symbol indicates that this property is a string handle. Code that handles +component state anonymously (e.g. [our `createDefaultInflator()` that will be +explained later](#default-inflators)) use this to correctly handle the property values. + +Strings are converted to numeric `StringID` s by the `APP.getSid` function. +`StringID` s can be converted back to strings by the `APP.getString` function. +`APP` is exposed to global scope from Hubs Client core `src/app.ts` and it +can be accessed anywhere. + +Then, code that initializes `SceneLoader` component will be like this + +```typescript +export type SceneLoaderParams = { + url: string; +}; + +export function inflateSceneLoader( + world: HubsWorld, + eid: number, + params: SceneLoaderParams +) { + addComponent(world, SceneLoader, eid); + SceneLoader.src[eid] = APP.getSid(params.url); +} +``` + +and code that accesses the property will be like this. + +```typescript +const sceneLoaderQuery = defineQuery([SceneLoader]); +const sceneLoaderEnterQuery = enterQuery(sceneLoaderQuery); +export function sceneLoaderSystem(world: HubsWorld) { + sceneLoaderEnterQuery(world).forEach(eid => { + const src = APP.getString(SceneLoader.src[eid]); + console.log(`Loading scene from this url: ${src}`); + ... + }); +} +``` + +### Booleans/Flags + +`bitECS` components do not support `boolean` properties. In lieu of boolean +properties, we often define a single `flags` property as an unsigned integer +type to use as a bitmask: + +```typescript +export const Waypoint = defineComponent({ + flags: Types.ui8, +}); + +// Use bit shifting to create values we can use instead of booleans +export enum WaypointFlags { + canBeSpawnPoint = 1 << 0, + canBeOccupied = 1 << 1, + canBeClicked = 1 << 2, + willDisableMotion = 1 << 3, + willDisableTeleporting = 1 << 4, + willMaintainInitialOrientation = 1 << 5, + snapToNavMesh = 1 << 6, +} + +// These values are booleans because they originate from an external source, like json in a gltf file. +export type WaypointParams = { + canBeSpawnPoint: boolean; + canBeOccupied: boolean; + canBeClicked: boolean; + willDisableMotion: boolean; + willDisableTeleporting: boolean; + willMaintainInitialOrientation: boolean; + snapToNavMesh: boolean; +}; + +// When we inflate a waypoint component, we pack the booleans into the flags property +export function inflateWaypoint( + world: HubsWorld, + eid: number, + props: WaypointParams +) { + addComponent(world, Waypoint, eid); + let flags = 0; + if (props.canBeSpawnPoint) flags |= WaypointFlags.canBeSpawnPoint; + if (props.canBeOccupied) flags |= WaypointFlags.canBeOccupied; + if (props.canBeClicked) flags |= WaypointFlags.canBeClicked; + if (props.willDisableMotion) flags |= WaypointFlags.willDisableMotion; + if (props.willDisableTeleporting) + flags |= WaypointFlags.willDisableTeleporting; + if (props.willMaintainInitialOrientation) + flags |= WaypointFlags.willMaintainInitialOrientation; + if (props.snapToNavMesh) flags |= WaypointFlags.snapToNavMesh; + Waypoint.flags[eid] = flags; + + // More lines omitted +} + +// Later, we can read the waypoint flags using bitwise &: +const canBeSpawnPoint = Waypoint.flags[eid] & WaypointFlags.canBeSpawnPoint; +``` + +### The escape hatch + +Sometimes, we want to store non-numerical data in components. Since `bitECS` +doesn't support non-numerical component properties, we store it in regular +`Map` s instead. + +Let's think of defining a `MediaPDF` component that manages both numerical and +non-numerical data as an example. + +Define a component with numeric properties, and separately create a +`Map` for non-numerical data. + +```typescript +// src/components/media_pdf.ts +export const MediaPDF = defineComponent({ + pageNumber: Types.ui8, +}); + +export type MediaPDFData = { + pdf: PDFObject; + material: MeshBasicMaterial; + canvasContext: CanvasRenderingContext2D; +}; + +export const MediaPDFMap = new Map(); +``` + +`bitECS` is not aware of anything about such `Map`s so allocating and +deallocating an element of `Map` for an entity and initializing and +cleaning up non-numerical data are your responsibility. + +Then inflator and system will be like these. + +```typescript +// src/inflators/media_pdf.ts +import { MeshBasicMaterial } from "three"; +import { MediaPDF, MediaPDFMap } from "../components/media_pdf"; + +export type MediaPDFParams = { + pdf: PDFObject; + canvasContext: CanvasRenderingContext2D; +}; + +export function inflateMediaPDF( + world: HubsWorld, + eid: number, + params: MediaPDFParams +) { + addComponent(world, MediaPDF, eid); + MediaPDF.pageNumber[eid] = 0; + + MediaPDFMap.set(eid, { + pdf: params.pdf, + material: new MeshBasicMaterial(), + canvasContext: params.canvasContext + }); +} + +// src/systems/media_pdf.ts +import { MediaPDF, MediaPDFMap } from "../components/media_pdf"; +import { disposeMaterial } from "../utils/three-utils"; + +const pdfQuery = defineQuery([MediaPDF]); +const pdfExitQuery = exitQuery(pdfQuery); +export function mediaPDFSystem(world: HubsWorld) { + pdfExitQuery(world).forEach(eid => { + const { pdf, material } = MediaPDFMap.get(eid)!; + pdf.cleanup(); + disposeMaterial(material); + MediaPDFMap.delete(eid); + }); + + pdfQuery(world).forEach(eid => { + const { pdf, material, canvasContext } = MediaPDFMap.get(eid)!; + const pageNumber = MediaPDF.pageNumber[eid]; + ... + }); +} +``` + +### Tag components + +`bitECS` components with no properties are called tag components. It is useful +to be able to tag an entity so that it appears in queries. + +TODO: Currently we use name "\*Tag" for some components even that have +properties to avoid the conflict with existing object names. (eg: +`DirectionalLightTag` to avoid the conflict with `Three.js DirectionalLight`.) +It doesn't match the Tag components description. We may need to update the +description or use other component name patterns. + +### Avoid duplicating state + +[`Three.js Object3D`](https://threejs.org/docs/#api/en/core/Object3D) and +its subtypes have many properties that change at runtime. Rather than storing +a duplicate copy of these properties in `bitECS` components, we use tag +components on the entity so that they show up in the necessary queries, and +then operate on the associated `Object3D` directly. + +Let's think of [`TroikaText`](https://protectwise.github.io/troika/troika-three-text/) +as an example. We use `TroikaText` library for high quality texts in the 3D +scene. `TroikaText` class extends [`Three.js Mesh`](https://threejs.org/docs/#api/en/objects/Mesh), +which extends `Three.js Object3D`. `TroikaText` s have a `text` string property +and a function `sync` that will flush the `text` to the underlying shader program. + +In Hubs, we define the `TextTag` component without any property. + +```typescript +export const TextTag = defineComponent(); +// Not +// export const TextTag = defineComponent({ text: Types.ui32 }); +// TextTag.text[$isStringType] = true; +``` + +We do not duplicate the `text` string in a `bitECS` component. We simply +operate on the underlying `Object3D` (a `TroikaText`): + +```typescript +const textQuery = defineQuery([TextTag, TimeLabel]); +export function textSystem(world: HubsWorld) { + textQuery(world).forEach((eid) => { + const timeLabel = world.eid2obj.get(eid)! as TroikaText; + timeLabel.text = new Date().toISOString(); + timeLabel.sync(); + }); +} +``` + +Refer to the later sections for `world.eid2obj.get(eid)! as XXX`. + +TODO: Write benefits from this design decision. + +TODO: Do we use another example because this Text example doesn't match the +actual implementation. `TroikaText.sync()` shouldn't be called each system. +It should be called only once in a frame in a dedicated system. This example +might be confusing if the readers check the actual code. + +## Writing inflators + +`Inflator` is one of the special concepts, which may not appear in standard +ECS patterns, in Hubs Client. + +Once component is added to an entity and its data is initialized, it starts to +be processed by systems in ECS world. In other words, components need points +where they are added to entity and their data is initialized. + +`Inflator` is the component entry point in the Hubs Client. + +TODO: Rename inflate to add or setup because the name may not clearly explain +what it does? + +### Inflator functions + +An `inflator` is a function that takes initialize parameter for some +components and set up them for an entity. + +```typescript +export type FooParams = { + x?: number; + y?: number; + z?: number; +}; + +const DEFAULTS: Required = { + x: 0.0, + y: 0.0, + z: 0.0, +}; + +export function inflateFoo(world: HubsWorld, eid: number, params: FooParams) { + params = Object.assign({}, params, DEFAULTS) as Required; + addComponent(world, Foo, eid); + Foo.x[eid] = params.x; + Foo.y[eid] = params.y; + Foo.z[eid] = params.z; + addObject3DComponent(world, eid, new FooObject3D()); +} +``` + +Inflator function type must be `(world: HubsWorld, eid: number, params?: object) => void` +for integration with [our `renderAsEntity()` explained later](#renderasentity). + +An inflator may create a `Three.js Object3D` object and add it to an entity +with our `addObject3DComponent()`. Refer to [the later section](#single-object3d-per-an-entity) +for adding a `Object3D` to an entity. + +An inflator may set up multiple components. + +### Inflators are synchronous + +Inflator functions must be synchronous functions for simplicity. + +TODO: More describe the benefit from this limitation + +### No dependency with other Components + +Inflators shouldn't expect any state of passed entity. For example they +shouldn't expect an entity has certain components or [`Three.js Object3D` is +already set to it](#single-object3d-per-an-entity). This is a bad example. + +```typescript +export function inflateFoo(world: HubsWorld, eid: number, params: FooParams) { + addComponent(world, Foo, eid); + // Inflator shouldn't have a dependency with other components + if (hasComponent(world, Bar, eid)) { + Foo.x[eid] = Bar.x[eid]; + } + // Inflator can't expect Three.js Object3D is already set + if (hasComponent(world, Object3DTag, eid)) { + const obj = world.eid2obj.get(eid)!; + Foo.y[eid] = obj.position.length(); + } +} +``` + +If a compilation data initialization has a dependency with other components, +it may be a sign that you should redesign components. + +If dependencies really aren't avoidable, you may think of initializing in +system with query [as explained later](#component-initialization-with-object3d). + +### Default inflators + +TODO: Write this section + +## Creating entities + +An entity is an identifier pointing to a group of components. It doesn’t +contain any direct behavior or data. + +### Entity basics + +`bitECS` entities are added to the `bitECS` world with [`bitECS addEntity()`](https://github.com/NateTheGreatt/bitECS/blob/master/docs/API.md#addEntity) +and removed from the world with [`bitECS removeEntity()`](https://github.com/NateTheGreatt/bitECS/blob/master/docs/API.md#removeentity). +In `bitECS`, component state is stored in large, pre-allocated `TypedArrays`. +In other words, entities are not objects with components inside them. Entities +are simply numbers (aliased as `EntityID` type in `src/utils/networking-types.ts`) +and often called Entity IDs. The `World` keeps track of things like whether an +entity has a given component ([`hasComponent(world, MyComponent, eid)`](https://github.com/NateTheGreatt/bitECS/blob/master/docs/API.md#hasComponent)). + +Note that you rarely need to call `addEntity()` directly. Instead you will +often use [our `prefab` and `renderAsEntity()` mechanisms explained later](#single-object3d-per-an-entity) +to create an entity with components and `Three.js Object3D` set up. + +### Entity ID’s are recycled + +After an entity is removed, its `EntityID` can later be reused in subsequent +calls to `addEntity`. This does not happen right away, but is something you +should be aware of, and is all the more reason to avoid holding onto entity +references. + +## Hubs Client ECS specialities + +Hubs Client core provides some special functions, patterns, and limitations +for simplicity, efficiency, and consistency. You must follow these Hubs Client +ECS specialities, which might not match standard ECS patterns, for the +consistency unless any strong reasons. + +### HubsWorld + +`HubsWorld` defined in [`src/app.ts`](https://github.com/mozilla/hubs/blob/master/src/app.ts) +extends [`bitECS World`](https://github.com/NateTheGreatt/bitECS/blob/master/docs/INTRO.md#-world). +It manages some extra Hubs Client specific resources and also provides some +useful data. For example you can get elapsed and delta time from it. + +It is instantiated at the beginning of the Hubs Client application and passed +to a lot of functions (inflators, systems, utils, and so on). + +### Single Object3D per an entity + +We often associate an entity with a single `Three.js Object3D`. We don't allow +multiple `Object3D`s per an entity for simplicity. (An entity without +associated `Object3D` is allowed.) + +TODO: Write the benefit from this limitation + +You need to call `addObject3DComponent()` defined in +[`src/utils/jsx-entity.ts`](https://github.com/mozilla/hubs/blob/master/src/utils/jsx-entity.ts) +to associate an `Object3D` with an entity. + +```typescript +import { addEntity } from "bitecs"; +import { BoxGeometry, Mesh, MeshBasicMaterial } from "three"; +import { addObject3DComponent } from "../src/utils/jsx-entity"; + +const eid = addEntity(world); +addObject3DComponent( + world, + eid, + new Mesh( + new BoxGeometry(1.0, 1.0, 1.0), + new MeshBasicMaterial({ color: 0xffffff }) + ) +); +``` + +`addObject3DComponent()` checks whether an `Object3D` is associated for an +entity. It throws an exception if already associated. It prevents multiple +`Object3D` associations. + +```typescript +const eid = addEntity(world); +addObject3DComponent(world, eid, new Group()); +// Throws an exception +addObject3DComponent(world, eid, new Group()); +``` + +`addObject3DComponent()` adds the built-in component `Object3DTag` defined in +[`src/bit-components.js`](https://github.com/mozilla/hubs/blob/master/src/bit-components.js) +to an entity and stores an `Object3D` in the special `eid2obj` map managed in +`HubsWorld`. + +`bitECS` component doesn't natively support non-numerical data type. So we +decided to store `Object3D`s associated with entities in a special map +`HubsWorld.eid2obj` that maps from Entity ID to `Object3D`. + +TODO: Replace `HubsWorld.eid2obj` with `Object3DTagMap` to be more aligned with the pattern +described above? + +You can use `Object3DTag` component with query to find entities +that have associated `Object3D`, and access the associated `Object3D`s with +`HubsWorld.eid2obj` map. + +```typescript +const objectQuery = defineQuery([Object3DTag]); +export function object3DSystem(world: HubsWorld) { + objectQuery(world).forEach(eid => { + const obj = world.eid2obj.get(eid)!; + ... + }); +} +``` + +`Object3DTag` component and `HubsWorld.eid2map` manipulations are hidden in +the Hubs Client core. They should be read-only from add-ons. + +### EntityDef, JSX, Prefab + +You will rarely need to call `bitECS addEntity()` yourself. Instead, you will +write entity definitions called `EntityDef`s using +[`React JSX`](https://legacy.reactjs.org/docs/introducing-jsx.html) syntax. + +`EntityDef`s are `JSX` expressions that can be passed to our +`renderAsEntity()` explained later to add entities to the world and assign +components to the entities. + +Let's write an easy example. Assume that `Foo` component and are inflators +are defined as the following. + +```typescript +// src/components/foo.ts + +import { defineComponent, Types } from "bitecs"; +export const Foo = defineComponent({ + a: Types.f32, + b: Types.f32, +}); + +// src/inflators/foo.ts + +import { addComponent } from "bitecs"; +import { HubsWorld } from "../app"; +export type FooParams = { + a: number; + b: number; +}; +export function inflateFoo(world: HubsWorld, eid: number, params: FooParams) { + addComponent(world, Foo, eid); + Foo.a[eid] = params.a; + Foo.b[eid] = params.b; +} +``` + +First, you need to edit the core `src/utils/jsx-entity.js` file to register +`JSX` key - inflator map in `JSXComponentData` for inflator parameters +and `jsxInflators` for inflator function. Choosing `foo` as a key here. + +``` +// src/utils/jsx-entity.js +import { FooParams, inflateFoo } from "../inflators/foo"; +... +export interface JSXComponentData extends ComponentData { + ... + foo?: FooParams; + ... +} +... +const jsxInflators: Required<{ [K in keyof JSXComponentData]: InflatorFn }> = { + ... + foo: inflateFoo, + ... +}; +... +``` + +TODO: Add an API to register `JSX` key - inflator map + +You may find `commonInflators` and `gltfInflators` in the file. [They will be +explained later](#gltf). + +Next, write a function with `JSX` syntax that creates `EntityDef` that +represents entities and associated components with component parameters. We +call such functions `prefab`. + +```typescript +/** @jsx createElementEntity */ + +// src/prefabs/foo.tsx + +export function fooPrefab(params: { a: number; b: number }) { + return ; +} +``` + +Multiple components association, multiple entities, and nested entities are +allowed. + +``` +// src/prefabs/foobarbazqux.tsx + +export function fooBarBazQuxPrefab() { + return ( + + + + + ); +} +``` + +Although `EntityDef` s are written with `React JSX` syntax, this is not +`React`. The `JSX` syntax allows us to describe our desired scene graph, +entities, and components. `EntityDef` s are meant to be easy to edit by +hand and to version control. + +### renderAsEntity() + +Our `renderAsEntity()` function defined in [`src/utils/jsx-entity.js`](https://github.com/mozilla/hubs/blob/master/src/utils/jsx-entity.ts) +parses `EntityDef`, adds entities to the world, and assign components to the +entities. + +It also ensures that each entity has an associated `Three.js Object3D`. If no +inflator adds an `Object3D`, it adds `Three.js Group` to an entity. + +TODO: Rename `renderAsEntity()` because the name might be confusing? Readers, +especially who know `Three.js`, may think it renders an object similar to +[`Three.js WebGLRenderer.render()`](https://threejs.org/docs/#api/en/renderers/WebGLRenderer.render) +and the object is added to `Three.js Scene` but the both are not true. For +example, `createRenderableEntity(world: HubsWorld, def: EntityDef)` or +simply `parse(world: HubsWorld, def: EntityDef)` may be misleading? + +```typescript +import { renderAsEntity } from "../utils/jsx-entity"; +import { fooPrefab } from "../prefabs/foo"; + +const eid = renderAsEntity(world, fooPrefab({ a: 0, b: 1 })); + +// It is equivalent to + +export function createFooEntity( + world: HubsWorld, + params: { a: number; b: number } +) { + const eid = addEntity(world); + inflateFoo(world, eid, { a: params.a, b: params.b }); + + if (!hasComponent(world, Object3DTag, eid)) { + addObject3DComponent(world, eid, new Group()); + } + + return eid; +} + +const eid = createFooEntity(world, { a: 0, b: 1 }); +``` + +`renderAsEntity()` lets `Object3D`s form graph from nested entities definition +and returns an entity id of the root entity. + +```typescript +import { renderAsEntity } from "../utils/jsx-entity"; +import { fooBarBazQuxPrefab } from "../prefabs/foobarbazqux"; + +const eid = renderAsEntity(world, fooBarBazQuxPrefab()); + +// It is equivalent to + +export function createFooBarBazQuxEntity(world: HubsWorld) { + const fooBarEid = addEntity(world); + inflateFoo(world, fooBarEid, { a: 0, b: 1 }); + inflateBar(world, fooBarEid, { c: 2, d: 3 }); + + if (!hasComponent(world, Object3DTag, fooBarEid)) { + addObject3DComponent(world, fooBarEid, new Group()); + } + + const bazEid = addEntity(world); + inflateBaz(world, bazEid, { e: 4, f: 5 }); + + if (!hasComponent(world, Object3DTag, bazEid)) { + addObject3DComponent(world, bazEid, new Group()); + } + + const quxEid = addEntity(world); + inflateQux(world, quxEid, { g: 6, h: 7 }); + + if (!hasComponent(world, Object3DTag, quxEid)) { + addObject3DComponent(world, quxEid, new Group()); + } + + const fooBarObj = world.eid2obj.get(fooBarEid)!; + const bazObj = world.eid2obj.get(bazEid)!; + const quxObj = world.eid2obj.get(quxEid)!; + + fooBarObj.add(bazObj); + fooBarObj.add(quxObj); + + return fooBarEid; +} + +const eid = createFooBarBazEntity(world); +``` + +Remember that inflators are synchronous so you can process `Three.js Object3D` +operations right after `renderAsEntity()`. + +```typescript +const eid = renderAsEntity(world, xxxPrefab()); +const obj = world.eid2obj.get(eid); +obj.position.set(10.0, 50.0, -10.0); +scene.add(obj); +``` + +### JobRunner + +TODO: Write this section + +```typescript +import { defineQuery, enterQuery, exitQuery } from "bitecs"; +import { ClearFunction, JobRunner, withRollback } from "../utils/coroutine-utils"; +import { Foo } from "../components/foo"; + +function* yieldFunc(world: HubsWorld, eid: number, clearRollbacks: ClearFunction) { + yield* barFunction(world, eid); + clearRollbacks(); + ... +} + +const jobs = new JobRunner(); +const fooQuery = defineQuery([Foo]); +const fooEnterQuery = enterQuery(fooQuery); +const fooExitQuery = exitQuery(fooQuery); +export function fooSystem() { + fooEnterQuery(world).forEach(eid => { + jobs.add(eid, clearRollbacks => yieldFunc(world, eid, clearRollbacks)); + }); + fooExitQuery(world).forEach(eid => { + jobs.stop(eid); + }); + fooQuery(world).forEach(eid => { + ... + }); + jobs.tick(); +} +``` + +## Three.js operations + +TODO: Write these sections + +### Add Object3D to Scene + +### Resource management + +### Entity deletion + +### Matrices update + +## glTF + +Hubs supports [standard 3D format `glTF`](https://www.khronos.org/gltf/). + +Both `glTF` formats, where binary data buffers contain base64-encoded strings +(as in `.gltf`) and raw byte arrays (as in `.glb`) are supported in Hubs. We +refer to `gltf` and `glb` files interchangably. + +### Hubs bitECS components in glTF + +Hubs Client `glTF` loading mechanism can parse Hubs bitECS component data +embedded in `glTF` and creates entity with components set up. + +The loading mechanism recognizes embedded `glTF MOZ_hubs_components` extension +as Hubs bitECS component definition. + +### Hubs Blender add-on and Spoke + +[`Hubs Blender add-on`](https://github.com/MozillaReality/hubs-blender-exporter) +can export `glTF` file with Hubs bitECS component data. + +[Our online authoring tool Spoke](https://hubs.mozilla.com/spoke/) also +includes component data in the gltf files that it exports and uploads. + +### Inflators for glTF + +If you want the Hubs Client `glTF` loading mechanism to enable to set up your +custom Component, you need to let it recognize the component. + +[Similar to `JSX` inflators map](#entitydef-jsx-prefab), insert a mapping from +a key in `glTF MOZ_hubs_component` to an inflator in `GLTFComponentData` for +inflator parameters and `gltfInflators` for inflators. In this example, +choosing `foo` as a key for `Foo` component. + +``` +// src/utils/jsx-entity.js +import { FooParams, inflateFoo } from "../inflators/foo"; +... +export interface GLTFComponentData extends ComponentData { + ... + foo?: FooParams; + ... +} +... +const gltfInflators: Required<{ [K in keyof GLTFComponentData]: InflatorFn }> = { + ... + foo: inflateFoo, + ... +}; +... +``` + +If you want to insert the same mapping for both `JSX` and `glTF`, insert it to +`CommonData` and `commonInflators` in the file. + +TODO: Add an API to register mapping + +## More complex add-ons patterns + +TODO: Write these sections + +### Asynchronous component initialization + +```typescript +const FooInit = defineComponent(); +const Foo = defineComponent(...); + +function* initFoo(world: HubsWorld, eid: number, clearRollbacks: ClearFunction) { + const xxx = yield* yieldFunction(world, eid); + clearRollbacks(); + addComponent(world, Foo, eid); + Foo.xxx[eid] = xxx; + ... +} + +const jobs = new JobRunner(); +const fooInitQuery = defineQuery([FooInit]); +const fooInitEnterQuery = enterQuery(fooInitQuery); +const fooInitExitQuery = exitQuery(fooInitQuery); +export function fooInitSystem(world: HubsWorld) { + fooInitEnterQuery(world).forEach(eid => { + jobs.add(eid, clearRollbacks => initFoo(world, eid, clearRollbacks)); + }); + fooInitExitQuery(world).forEach(eid => { + jobs.stop(eid); + }); + jobs.tick(); +} +``` + +### Component initialization with Object3D + +```typescript +const FooInit = defineComponent(); +const Foo = defineComponent(...); + +export function inflateFoo(world: HubsWorld, eid: number) { + addComponent(world, FooInit, eid); +} + +const fooInitEnterQuery = enterQuery(defineQuery([FooInit, Object3DTag])); +export function fooInitSystem(world: HubsWorld) { + fooInitEnterQuery(world).forEach(eid => { + const obj = world.eid2obj.get(eid)!; + removeComponent(world, FooInit, eid); + addComponent(world, Foo, eid); + Foo.xxx[eid] = something(obj); + ... + }); +} +``` + +### Advanced example: Media loader + +### Advanced example: PDF loader + +### Advanced example: Object Menu + +## Handling interactions + +Refer to [the interactions documentation](./dev-client-interactivity.html). + +## Handling networking + +Refer to [the networking documentation](./dev-client-networking.html). diff --git a/docs/developers/development-basics/interactivity.md b/docs/developers/development-basics/interactivity.md new file mode 100644 index 0000000..7945228 --- /dev/null +++ b/docs/developers/development-basics/interactivity.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 5 +--- + +# Interactivity + +This document is WIP. + +## User input + +## Standard Interactions + +## Collision volumes diff --git a/docs/developers/development-basics/networking.md b/docs/developers/development-basics/networking.md new file mode 100644 index 0000000..52d036e --- /dev/null +++ b/docs/developers/development-basics/networking.md @@ -0,0 +1,626 @@ +--- +sidebar_position: 6 +--- + +# Networking + +## Intro + +This document describes the way that entity state is networked across clients +and optionally [persisted to the database](#persistency). + +Entity state includes things like what objects should be created by each client +in a room, where those objects are, and associated [component](./dev-client-gameplay.html) +data. [`WebRTC`](https://webrtc.org/) connections for streaming data (voice, +video, screenshare) are out of scope for this document: Those are handled +separately by [`dialog`](https://github.com/mozilla/dialog) and the +`DialogAdapter`. + +TODO: Add the link to our WebRTC document when it will be ready + +### Target readers + +This document is intended for users with some coding experience that know +[our basic gameplay code concept](./dev-client-gameplay.html) and want to write +the networking gameplay functionality of the Hubs client. + +## Networking Overview + +### Reticulum + +[`Reticulum`](https://github.com/mozilla/reticulum) is a hybrid +game-networking and web API server built on [Phoenix](#phoenix). +It manages a [mesh topology network](https://www.computerhope.com/jargon/m/mesh.htm) +of Phoenix nodes. + +Hubs uses Reticulum server for real-time data transfer and also persistent data +(like accounts, rooms, [Spoke](https://hubs.mozilla.com/spoke/) projects, and +more) management. Persistent data is stored in a [PostgreSQL](https://www.postgresql.org/) +database. + +When you connect to a room, you are connecting to a load-balanced node on this +mesh over [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API)s. +Messages are relayed between all users in that room across the mesh via a +[pub/sub system](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) +called [Phoenix Channels](https://hexdocs.pm/phoenix/Phoenix.Channel.html). + +TODO: Write what Phoneix node is? + +### Phoenix + +[`Phoenix`](https://www.phoenixframework.org/) is a web development framework +written in [Elixir](https://elixir-lang.org/) which implements the server-side +Model View Controller (MVC) pattern. [The Phoenix Guides](https://hexdocs.pm/phoenix/overview.html) +are a great resource for an overview of how it works. + +Real-time data is managed by [Phoenix Channels](https://hexdocs.pm/phoenix/Phoenix.Channel.html). +The relevant channel for entity state networking is the `HubChannel` defined in +[`src/utils/hub-channel.js`](https://github.com/mozilla/hubs/blob/master/src/utils/hub-channel.js). + +TODO: Write what Phoneix Channels are? + +### Data sync frequency + +Clients send messages at fixed intervals (rather than anytime entity state is +updated) so that frequently updated components do not cause a client to flood +the network with an unnecessary amount of update messages. + +### Message receiver + +Clients receive messages outside of frame ([`mainTick`](./dev-client-gameplay.html)) +boundaries, and simply queue them for processing. Some core [systems](./dev-client-gameplay.html) +in clients process queued messages each frame in `mainTick`. + +### Partial or full update + +An entity’s state is simply the component data associated with this +entity. Updates can be partial (updating only some components) or full +(updating all components). + +TODO: Write how to specify partial or full update + +### Persistency + +Hubs Client manages who the creator of `networked instanciated entities`, +[which will be explained later](#createnetworkedentity), is. When the creator +(a local or remote Hubs Client) is disconnected from a room, +`networked entities` instanciated by it are removed from the room. + +In order to keep these entities stayed in the room even after their authors +leave a room, the entity must be [`pinned`](https://hubs.mozilla.com/docs/hubs-features.html). +Pinned entities are stored in database in Reticulum. + +[More details will be explained later.](#persisting-networked-entity-state) + +### Eventual Consistency + +`Reticulum` does not enforce a single, consistent networked entity state. In +fact, reticulum knows very little about the messages it is passing between +clients. Furthermore, messages are not guaranteed to be received in the same +order by all clients. Therefore, it is each client’s responsibility to +handle messages in such a way that all clients will eventually recreate +identical entity state. This general concept is called +[Eventual consistency](https://en.wikipedia.org/wiki/Eventual_consistency). + +### Ownership + +TODO: Polish this section + +TODO: Write our Ownership and SoftOwnership concepts + +Users do need to understand that ownership is not transactional or guaranteed. +That is, ownership is not “requested and then transferred”, and +just because one client claims ownership of an entity does not mean that other +clients will respect that claim. + +Users can first call the built-in `takeSoftOwnership()` function to try to +take ownership and then inspect the ownership state with the built-in +`Networked` or `Owned` components as needed in cases when their ownership +claims matter. They may find themselves writing [coroutines](./dev-client-gameplay.html) +that looks like this: + +```typescript +import { hasComponent } from "bitecs"; +import { Owned } from "../bit-components"; +import { takeSoftOwnership } from "../utils/take-soft-ownership"; + +takeSoftOwnership(world, eid); +yield sleep(3000); // Wait a few seconds to see if we "win" ownership +if (!hasComponent(world, Owned, eid)) return; +``` + +## Simple example + +Let's write a simple networked component example. You need some additional +works to let your [component](<(./dev-client-gameplay.html#prefab)>) support +network. + +Assume `Foo` component is defined with some properties, an +[inflator](<(./dev-client-gameplay.html#prefab)>) for it is written, and the +inflator is registered in the built-in +[jsxInflators map](./dev-client-gameplay.html#entitydef-jsx-prefab). + +```typescript +// src/components/foo.ts + +import { defineComponent, Types } from "bitecs"; + +export const Foo = defineComponent({ val: Types.f32 }); + +// src/inflators/foo.ts + +import { addComponent } from "bitecs"; +import { HubsWorld } from "../app"; +import { Foo } from "../src/components/foo"; + +export type FooParams = { + val?: number; +}; + +const DEFAULTS: Required = { + val: 0 +}; + +export function inflateFoo(world: HubsWorld, eid: number, params: FooParams) { + params = Object.assign({}, params, DEFAULTS) as Required; + addComponent(world, Foo, eid); + Foo.val[eid] = params.val; +} + +// src/utils/jsx-entity.js + +import { FooParams, inflateFoo } from "../inflators/foo"; +... +export interface JSXComponentData extends ComponentData { + ... + foo?: FooParams; + ... +} +... +const jsxInflators: Required<{ [K in keyof JSXComponentData]: InflatorFn }> = { + ... + foo: inflateFoo, + ... +}; +... +``` + +First, write a [prefab](./dev-client-gameplay.html#prefab) for `Foo` component +with `networked` key, [which will be explained later](#entitydef-jsx-prefab), +and register it in the built-in [`prefabs`](#prefab) map. This prefab is used +to set up entities with associated components in both local and remote clients. + +```typescript +// src/prefabs/networked-foo.tsx + +/** @jsx createElementEntity */ +import { prefabs } from "./prefabs"; + +export type NetworkedFooPrefabParams = { + val: number; +}; + +export function NetworkedFooPrefab(params: NetworkedFooPrefabParams) { + return ; +} + +prefabs.set("networked-foo", { template: NetworkedFooPrefab }); +``` + +And then write a network schema which defines how component data is packed in +network message and register it in the built-in [`schemas`](#network-schema) +map. + +```typescript +// src/network-schemas/foo.ts + +import { Foo } from "../components/foo"; +import { schemas } from "../utils/network-schemas"; +import { defineNetworkSchema } from "../utils/define-network-schema"; + +const runtimeSerde = defineNetworkSchema(Foo); +export const NetworkedFoo: NetworkSchema = { + componentName: "foo", + serialize: runtimeSerde.serialize, + deserialize: runtimeSerde.deserialize, +}; + +schemas.set(NetworkedFoo, NetworkedFooSchema); +``` + +Now, `Foo` component data is ready for network sync. The built-in +[`createNetworkedEntity()`](#createnetworkedentity) function locally creates +new entities with associated components set up, and also sends a message to +remote clients to cause the same entity and components set up there. When `Foo` +component data is updated, Hubs Client sends a message to remote Hubs Clients +for sync. + +```typescript +import { createNetworkedEntity } from "../utils/create-networked-entity"; + +const eid = createNetworkedEntity(world, "networked-foo", { val: 0 }); +``` + +Let's dive into more details below. + +## Creating Networked Entities + +`Networked entities` are any entities with the the built-in `Networked` +component. Hubs Clients make their components data synched with remote clients. + +### Prefab + +[Prefabs](./dev-client-gameplay.html#prefab) for networked entities must be +registered in the built-in `prefabs` map defined in +registered in the built-in `prefabs` map defined in +[`src/prefabs/prefabs.ts`](https://github.com/mozilla/hubs/blob/master/src/prefabs/prefabs.ts), +which is a map from `prefabName` string to `PrefabDefinition`, to let +[`createNetworkedEntity()`](#createnetworkedentity) recognize it. +`PrefabDefinition`s include functions that take `InitialData` and return +[`EntityDef`](./dev-client-gameplay.html)s. + +Prefabs for networked entities must include `networked` key that is for +[Networked component](#networked-component) that manages networking related +internal data. + +Example: + +```typescript +// src/prefabs/networked-foo.tsx + +/** @jsx createElementEntity */ +import { prefabs } from "./prefabs"; + +export type NetworkedFooPrefabParams = { + val: number; +}; + +export function NetworkedFooPrefab(params: NetworkedFooPrefabParams) { + return ; +} + +prefabs.set("networked-foo", { template: NetworkedFooPrefab }); +``` + +TODO: Write `networkedTransform` + +TODO: Add a better API for registering prefab? + +### createNetworkedEntity() + +Calling the built-in `createNetworkedEntity(world: HubsWorld, prefabName: string, data: InitialData)` +function defined in [`src/utils/create-networked-entity.ts`](https://github.com/mozilla/hubs/blob/master/src/utils/create-networked-entity.ts) +that takes + +- A `prefabName`, to indicate which prefab to initialize +- An [`InitialData`](https://github.com/mozilla/hubs/blob/master/src/utils/networking-types.ts) struct, to know how to initialize the prefab + +TODO: Write what exactly `InitialData` is? + +creates entities and associated components with the specified prefab in the +local Hubs Client and also would cause the Hubs Client to send a message for +entities and associated components setup in the remote Hubs Clients the next +time it sends messages. + +Entities created with `createNetworkedEntity()` are called `networked +instanciated entities`. + +Example: + +```typescript +import { createNetworkedEntity } from "../utils/create-networked-entity"; + +const eid = createNetworkedEntity(world, "networked-foo", { val: 0 }); +``` + +### Network Schema + +A [`NetworkSchema`](https://github.com/mozilla/hubs/blob/master/src/utils/network-schemas.ts) +indicates how to pack component data into network update messages, and has the +following properties: + +- A `componentName` string that uniquely identifies the component +- A `serialize` (and `deserialize`) function that defines how component data + is packed into (and unpacked from) network update messages. +- An optional `serializeForStorage` (and `deserializeForStorage`) function + that defines how component data is packed into (and unpacked from) + network update massages that is able to be saved (and loaded) from the + database for persistent data. + +TODO: Write how `componentName` is used + +The `serialize` and `deserialize` functions can be generated by calling +the built-in `defineNetworkSchema()` function defined in +[`src/utils/define-network-schema.js`](https://github.com/mozilla/hubs/blob/master/src/utils/define-network-schema.js). + +TODO: Write how to write custom serialize and deserialize functions? + +The `serializeForStorage` and `deserializeForStorage` functions need careful +authoring to allow for reading component state that has been saved to the +database in a backwards-compatible way. + +Note: `NetworkSchema`s are likely to change in the near future, as we are +looking for ways to simplify the complexity that `serializeForStorage` and +`deserializeForStorage` introduce. + +`NetworkSchema` must be added to the built-in `schemas` map defined in +[`src/utils/network-schema.ts`](https://github.com/mozilla/hubs/blob/master/src/utils/network-schemas.ts). + +Example: + +```typescript +// src/network-schemas/foo.ts + +import { Foo } from "../components/foo"; +import { NetworkSchema, schemas } from "../utils/network-schemas"; +import { defineNetworkSchema } from "../utils/define-network-schema"; + +const runtimeSerde = defineNetworkSchema(Foo); +export const NetworkedFoo: NetworkSchema = { + componentName: "foo", + serialize: runtimeSerde.serialize, + deserialize: runtimeSerde.deserialize, +}; + +schemas.set(Foo, NetworkedFooSchema); +``` + +TODO: Add a better API for registering network schema? + +## Async initialization + +When [`createNetworkedEntity()`](#createnetworkedentity) is called, +[`network instantiated entities`](#createnetworkedentity) are +created synchronously. That is, any asynchronous loading that entities need +to do to be “fully realized” will happen later. For example +some accociated components or descendant entities may be set up asynchronously +[as explained here](./dev-client-gameplay.html#asynchronous-component-initialization). + +Between the time that the `network instantiated entities` are created and the +time that the associated components or descendant entities are set up Hubs +clients may receive update messages about the components or descendant entities +they don't recognize yet. + +Hubs clients store these update messages in their local storages until they can +be applied. + +## Hubs client internal + +The following sections are for explaining Hubs Client core inside about how the +network features explained above are implemented. Users who just want to write +networked gameplay functionality don't need to know them. They are for Hubs +Client core developers. + +**Note that This section is T.B.D.** + +TODO: Polish this section + +### Networked Component + +Networked entities are any entities with the `Networked` component. The +`Networked` component defined in +[`src/bit-components.js`](https://github.com/mozilla/hubs/blob/master/src/bit-components.js) +contains: + +- A (networked) `id`, which clients use to uniquely identify this entity across + the network. This cannot simply be the `eid` of an entity, because `eid`s are + assigned locally to each client. +- A `creator`, which is used at various times to determine whether or not an + entity should be created or removed. +- An `owner`, which is used to determine which `client` has authority to update + the state of this entity. +- A `lastOwnerTime`, which is used to determine the most recent time that an + `owner` was assigned. +- A `timestamp`, which is the most recent time the networked state of this + entity has been updated. + +The `creator` can be set to a `ClientID`, `"reticulum"`, or a `NetworkID`. + +- When the `creator` is a `ClientID`, it means that a client in the room has + caused this “root” entity (and its descendants) to be created, and + the entity (and its descendants) should be removed when the client leaves the + room. +- When the `creator` is `"reticulum"`, it means that the [Reticulum](#reticulum) + is responsible for deciding whether this “root” entity should be + created or removed. +- When the `creator` is a `NetworkID`, it means that the entity is a descendant + of a “root” entity, and its creation/removal will be subject to its + ancestor. + +Conceptually, the `creator` and the `owner` act as authorities over two facets +of a networked entity. + +- The `creator` is the authority over the entity’s existence. Thus, it is + checked when processing [`CreateMessage`s](#createmessage) and before an entity + may be removed. For an entity to be created, its `creator` must have the + appropriate permission. An entity’s `creator` changes infrequently. It + only happens when a client [`pins`](#persistency) (or `unpins`) an entity, + which changes the `creator` to (or from) `"reticulum"`. +- The `owner` is the authority over the entity’s current state. Thus, it + is associated with [`UpdateMessage`s](#updatemessage). The `owner` is expected + to change regularly, whenever a new client performs an action on an entity. The + built-in [`takeOwnership()`](#ownership) and [`takeSoftOwnership()`](#ownership) + functions allow a client to establish itself as the `owner` of an entity. + +TODO: Consider to move this ownership explanation to the [Ownership](#ownership) +or [Ownership handling](#ownership-handling) section. + +### Message Types + +Clients send and receive these types of messages: + +- `CreateMessage` +- `UpdateMessage` +- `DeleteMessage` +- `ClientJoin` +- `ClientLeave` +- `CreatorChange` + +#### CreateMessage + +These tell a client to create an entity. Each `CreateMessage` contains: + +- A `networkId`, which clients will use to uniquely identify this entity. +- A `prefabName`, to know which prefab to initialize, +- An `initialData` struct, to know how to initialize the prefab, + +Reticulum inserts a `fromClientId` into `"nn"` messages, so that clients who +receive a `CreateMessage` can check whether the sending client has permission +to create the entity. These `fromClientId` s are guaranteed to be sent by +reticulum in a way that clients are unable to spoof. + +Entities that are created by calling `createNetworkedEntity` or receiving a +`CreateMessage` are said to be `network instantiated`. `Network instantiated` +entities may have many descendants. We do not say that the descendants are +`network instantiated`. + +#### UpdateMessage + +These tell a client to update an entity. Each `UpdateMessage` contains: + +- A `networkId`, which clients use to uniquely identify which entity the + message refers to, +- A `lastOwnerTime`, which tells clients when the sender of this message most + recently witnessed ownership being transferred. +- A `timestamp`, which indicates when a message was sent. +- An `owner`, which indicates which `client` should have authority over + updating this entity’s state. + +Update messages also have the `data` needed to update an entity’s state. +An entity’s state is simply the component data associated with this +entity. Updates can be partial (updating only some components) or full +(updating all components). Update messages also have two variants, depending +on whether they are can be saved for long term storage in the database. This +topic will be covered in another section. + +#### DeleteMessage + +These tell a client to `delete` an entity. Each `DeleteMessage` contains simply +the `NetworkID` of the entity to be deleted. We distinguish between entities +that have been `deleted` and those that are simply `removed`: + +- A `deleted` entity was explicitly deleted by a client. That is, someone + pressed a button or took some action to delete it on purpose. Entities that + have been `deleted` cannot be recreated. +- A `removed` entity was removed incidentally. For example, it may have been + removed when the `creator` disconnected from the room. If the `creator` + reconnects and sends a `CreateMessage` with a matching `networkId`, it is + acceptable to recreate the entity. + +#### ClientJoin + +These tell a client that a new client has connected. The next time the +built-in `networkSendSystem` runs, the receiving client will send the new +client messages about entities it is the `creator` of, and update messages +for entities it is the `owner` of. + +#### ClientLeave + +These tell a client that another client has disconnected. The next time the +built-in `networkReceiveSystem` runs, the receiving client will `remove` +entities that the disconnected client was the `creator` of. + +#### CreatorChange + +These tell a client that the `creator` of an entity has been reassigned. +Typically, this means that an entity has been [`pinned`](#persistency) (or +`unpinned`), and reticulum has assigned (or unassigned) itself as the +entity’s `creator`. + +TODO: Clarify the initial creator + +#### Note + +Note that this is a slight simplification. The message types are not +represented in these exact terms throughout the client. For example, clients +may combine `CreateMessage`s, `UpdateMessage`s, and `DeleteMessage`s into a +single outgoing message, which receiving clients then separate and parse. There +are also two variants of `UpdateMessage`, which will be explained above. + +### Ownership handling + +Most of the complexity in the built-in `networkSendSystem` and the +`networkReceiveSystem` stem from this property of the network. Here are some +examples where this complexity reveals itself: + +- The `lastOwnerTime` is used to ensure that ownership transfer is handled + identically by all clients, even when messages arrive out of order. +- The `deletedNids` collection ensures that out-of-order `CreateMessage`s do + not cause `deleted` entities to be accidentally recreated. +- The `storedUpdates` allows a client to save `UpdateMessage`s it has received + but has no way to process, as can happen when it receives an `UpdateMessage` + from the `owner` of an entity before it receives a `CreateMessage` from its + `creator`. +- The `takeSoftOwnership` function allows clients to take ownership of unowned + entities in such a way that only clients with the most recent information about + that entity will be eligible as the new owner. + +For the most part, users of the networking systems do not need to understand +these concepts. These are handled internally by the systems themselves. However, +users do need to understand that ownership is not transactional or guaranteed. +That is, ownership is not “requested and then transferred”, and +just because one client claims ownership of an entity does not mean that other +clients will respect that claim. + +Users can inspect the state the built-in `Networked` or `Owned` components as +needed in cases when their ownership claims matter. They may find themselves +writing coroutines that looks like this: + +```typescript +takeSoftOwnership(world, eid); +yield sleep(3000); // Wait a few seconds to see if we "win" ownership +if (!hasComponent(world, Owned, eid)) return; +``` + +TODO: Explain more what this example code does and does for. + +If this becomes a common and error-prone pattern, then we may introduce helper +functions or additional semantics to cover these cases. + +### Async initialization handling + +A critical property of the networked system that enables the async +initialization to work is that descendants of `networked instantiated` +entities are assigned network IDs deterministically, even in cases where +some parts of a descendant hierarchy fails to load. This ensures that the +descendants can load in any order (or even fail to load) without causing a +client to delete, overwrite, or ignore descendant updates. + +### Event handlers + +Event handlers that queue messages for later processing can be found in +`listenForNetworkMessages` defined in +[`src/utils/listen-for-network-message.ts`](https://github.com/mozilla/hubs/blob/master/src/utils/listen-for-network-messages.ts). + +### Persisting Networked Entity State + +By default, `networked instanciated entities` which are created with +the built-in [`createNetworkedEntity()`](#createnetworkedentity) function, +are removed when their creator (client) is disconnects. In order to persist +these entities the entity must be +[`pinned`](https://hubs.mozilla.com/docs/hubs-features.html). Only +`networked instanciated entities` can be `pinned`. + +To `pin` an `network instantiated entities`, a client calls the built-in +`createEntityState()` function. This will save the current state of the +entities to the database. We say that the entities are `persistent`. + +To update the state of a persistent entity, a client calls the built-in +`updateEntityState()` function. + +To delete the saved entity state of a persistent entity, a client calls +the built-in `deleteEntityState()` function. Note that deleting the saved +entity state is not the same as deleting the entity. It simply means that +the information saved to the database about this entity will be deleted. + +When the client connects to a hub channel, it calls the built-in +`listEntityStates()` function in order to receive the entity states that have +been saved to the database. + +Messages for persisted entities' states are handled similarly to non-persited +entities'. The messages are queued and later processed. The client’s +eventually consistent properties guarantee that if entity state updates that +come from the database are out-of-date, they will be appropriately handled. + +The built-in functions described in this section are defined in +[`src/utils/entity-state-utils`](https://github.com/mozilla/hubs/blob/master/src/utils/entity-state-utils.ts). diff --git a/docs/developers/development-basics/query-strings.md b/docs/developers/development-basics/query-strings.md new file mode 100644 index 0000000..7a99cae --- /dev/null +++ b/docs/developers/development-basics/query-strings.md @@ -0,0 +1,36 @@ +--- +sidebar_position: 9 +--- + +# Query String Parameters + +Some developer-oriented options that are not available in the preferences panel in Hubs are available as query string parameters. These are intended mainly for development or debugging and are not something most users will need to use. + +Examples: + +``` +https://hubs.mozilla.com/12345/my-room-name?allow_multi +https://localhost:8080/?hub_id=12345&allow_multi +``` + +- `allow_multi` - Allow multiple instances off the app in the same browser session +- `allow_idle` - Disable the idle detector timeout +- `idle_timeout` - Idle timeout in seconds +- `avatar_scale` - Scale your self! +- `no_stats` - Disable performance stats +- `vr_entry_type` - Either "2d", "vr", or "daydream". Used internally to force a VR entry type. Add "\_now" to the end of the value to skip the audio check. +- `disable_telemetry` - If `true` disables Sentry telemetry. +- `log_filter` - A `debug` style filter for setting the logging level. +- `debug` - If `true` performs verbose logging of Janus and NAF traffic. Also enables debug mode on the physics system. +- `vrstats` - If `true` shows stats in VR. +- `debug_log` - If `true`, enables an on-screen debug log and console. Useful for debugging on mobile devices. +- `userinput_debug` - If `true`, enables an on-screen userinput debug status panel. Press "L" on your keyboard to show the panel. +- `fov` - Set a custom field of view in degrees (between 1 and 179) for the camera. (2D only) +- `force_enable_touchscreen` - Force virtual gamepad controls to appear on the screen. +- `default_material_quality` - Either "high", "medium", or "low". Set a default material quality for users with non-mobile devices that take effect when a user has not set a specific preference. +- `default_mobile_material_quality` - Either "high", "medium", or "low". Set a default material quality for users with mobile devices that take effect when a user has not set a specific preference. +- `envSettingsDebug` - Show a debug panel for the environment-settings component allowing you to configure tonemapping and exposure settings. +- `debugLocalScene` - Override what happens when dropping glb files into the scene, instead loading them as the scene (locally, without uploading). This is useful for quickly itterating on scene changes. +- `debugNavmesh` - Helps you to visually distinguish navmesh in your scene, a white series of zigzag lines help you in distinction + +Note: Once you access a room with `debugLocalScene`, there is no scene linked to that room, so to access the same room again normally, you need to change the scene (using Room Info & Settings Panel) while you are in that room diff --git a/docs/developers/development-basics/setup-local-dev.md b/docs/developers/development-basics/setup-local-dev.md new file mode 100644 index 0000000..dd1a05e --- /dev/null +++ b/docs/developers/development-basics/setup-local-dev.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 2 +--- + +# Local Development + +Documentation coming soon... diff --git a/docs/developers/development-basics/system-overview.md b/docs/developers/development-basics/system-overview.md new file mode 100644 index 0000000..0b6c9d5 --- /dev/null +++ b/docs/developers/development-basics/system-overview.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 1 +--- + +# System Overview + +## [The Client](https://github.com/mozilla/hubs) + +Renders almost everything the user sees. The html pages are served by Reticulum but come from the client. + +The front-end is built with React for 2D components and Three.js and A-Frame for the 3D scene. The 3D content is synced across clients using networked aframe. Physics run on the client using Ammo.js/Wasm. + +Each page on the client is served from the back-end, Reticulum. The /admin folder contains the code for the Admin Panel which is separate to run from Hubs. + +### [networked aframe](https://github.com/networked-aframe/networked-aframe) + +Game networking is implemented using the networked-aframe library. Currently, authorization and authentication is enforced on a small subset of messages like joining and kicking, but the capability is there for us to do message-level authorization. + +### Ammo.js/Wasm + +All physics simulation is done on the clients -- there is no server-side physics simulation of any kind. The servers are basically a message bus that takes the client messages, does slight modifications and adds authorization, then broadcasts the messages and their updates to all connected peers. Things like ownership over objects and other incidental concerns to orchestrate the in-game experience among peers is all based upon the client protocol implementation. + +# [Reticulum](https://github.com/mozilla/reticulum) + +A mesh network of erlang/elixir/phoenix nodes, and is responsible for all non-voice/video traffic between users including: + +- Avatar transforms +- Auth/magic sign in links +- Decrypt +- Scene updates +- User permission validation + +When you connect to a room, you are connecting to a load-balanced node on this mesh over websockets. Messages are relayed between all users in that room across the mesh via a pub/sub system called phoenix channels. + +# [Habitat](https://www.chef.io/products/chef-habitat) + +Habitat provides packaging and orchestration. Deployment is orchestrated by Habitat. + +Every AWS EC2 instance is running Habitat and Habitat runs packages such as Hubs, Reticulum, Dialog etc. + +# [Dialog](https://github.com/mozilla/dialog) + +Voice, video and audio traffic is handled via WebRTC Server based on the open source “mediasoup” project. (We formerly used the “Janus” project as our WebRTC server). It uses an SFU (Selective Forwarding Unit) topology where each participant is sending their data to a central routing machine which then sends back all participants data to each participant. + +# Postgres DB + +For persistent state, we're not doing anything fancy. We have a postgresql database behind reticulum and a file store for the two methods of durable storage. Reticulum manages both. When you update permanent room state, such as pin objects, etc, you are interfacing with APIs in reticulum to update bits on those two backing stores. diff --git a/docs/fundamentals/_category_.json b/docs/fundamentals/_category_.json new file mode 100644 index 0000000..478702f --- /dev/null +++ b/docs/fundamentals/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Hubs Fundamentals", + "position": 3, + "link": { + "type": "generated-index" + } +} diff --git a/docs/fundamentals/avatar-links.md b/docs/fundamentals/avatar-links.md new file mode 100644 index 0000000..7ca17c6 --- /dev/null +++ b/docs/fundamentals/avatar-links.md @@ -0,0 +1,28 @@ +--- +sidebar_position: 6 +--- + +# Sharing Avatar Links Privately + +**Do you have a hubs room where you want specific avatars to be available for specific people but not others? +For example, an event where the performer has an exclusive avatar or moderators wear a custom moderator shirt, unavailable to attendees?** If so, read on... + +If you [create a custom avatar](./intro-avatars.md), you can send the 2D texture set or the 3D GLB model file to the event organizes to upload. + +Alternatively, if you want to make it easier on the event organizers, you can create a "dressing room" for special avatars. This is a room, where the different avatars are on display for people to wear. + +### Creating a dressing room + +1. Create a new Hubs room to be the "dressing room". +2. Upload a special avatar you want to share, and then find it in your list of "my avatars". +3. Right click on it and select "copy link location". + +![Example get avatar link screenshot](/img/hubs-exclusive-avatars.png) + +4. Go back to the dressing room, then press CTRL+V (CMD+V on Mac). A 2D representation of the avatar is added to the room as an object. +5. Pin this object so that it doesn't disappear when you leave the room. (Hover cursor on it, press the space bar, and select "pin".) +6. Share the URL to this dressing room with the organizing team. To wear an avatar, users just have to point at the one they want and select "use avatar". + +Here's a screenshot of an example "dressing room": + +![Example dressing room with custom avatars](/img/hubs-dressing-room.png) diff --git a/docs/fundamentals/controls.md b/docs/fundamentals/controls.md new file mode 100644 index 0000000..8ebf3a7 --- /dev/null +++ b/docs/fundamentals/controls.md @@ -0,0 +1,686 @@ +--- +sidebar_position: 9 +--- + +# Controls + +## Touchscreen Controls + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionControlsContext
MovePinch
RotateSingle-finger drag
Move and RotateOn-screen joysticks
Spawn or drop penTap on the pen button
Rotate objectDrag fingerAfter pressing and holding the "rotate" button in the object's menu
Toggle menusTwo-fingered tap
+ +## Keyboard and Mouse Controls + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionsControlsContext
MoveArrow or W, A, S, D keys
TurnQ and E or left mouse button
TeleportRight mouse button
Toggle fly modeG or type /fly in chat
Move fasterShiftIn conjunction with using other keys to move
Show menusHold Space
Toggle menusTab
Toggle UI` (backtick key)
Toggle microphone muteM
Focus chatT
Inspect your avatarI
Focus on media or someone's avatarFHover over the media or someone's avatar you'd like to inspect
Rotate objectMove mouseAfter pressing and holding the "rotate" button in the object's menu
Scale objectShift + Mouse wheelWhile holding an object
Move object closer/awayMouse wheelWhile holding an object
Drop pen or cameraRight mouse button or EscapeWhile holding a pen or camera
Next/previous pen colorShift + E, Shift + QWhile holding a pen
Change pen sizeShift + Mouse wheelWhile holding a pen
Undo pen strokeCtrl + ZWhile holding a pen
Take photoLeft mouse buttonWhile holding a camera
Increase/decrease media volumeMouse wheelWhile hovering over media
Exit camera mirror modeEscape
Search the webCtrl-[1-7]
Spawn from ChatCtrl-EnterWhile typing into chat box
I'm Feeling LuckyCtrl-EnterWhile searching content
EmotesNumbers 1-7
+ +## Oculus Touch Controls + +You can also use the [keyboard keys](#keyboard-and-mouse-controls) listed above while using your Oculus Rift. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionsControlsContext
MoveLeft controller thumbstick
TurnRight controller thumbstick
Move fasterB or Y buttons to move faster
TeleportTrigger
Show menusHold A or X
Rotate objectRotate controllerAfter pressing and holding the "rotate" button in the object's menu
Grab objectGrip button on either controller
Scale objectMove both hands together or apart while holding objectWhile holding an object
Move object closer/awayUp/down on right thumbstickWhile holding an object with cursor
Draw with penTriggerWhile holding a pen
Next/previous pen colorLeft/right on thumbstickWhile holding a pen
Change pen sizeUp/down on thumbstickWhile holding a pen
Undo pen strokeB or Y buttonWhile holding a pen
Take photoTriggerWhile holding a camera
Increase/decrease media volumeUp/down on right thumbstickWhile hovering over media
+ +## Vive Controls + +You can also use the [keyboard keys](#keyboard-and-mouse-controls) listed above while using your Vive. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionsControlsContext
Move + Left controller touchpad +
Turn + Right controller touchpad +
Move faster + Press top of touchpad +
Teleport + Trigger +
Teleport + Press center of touchpad + While holding pen
Show menusPress and hold center of touchpad on right controller
Rotate objectRotate controllerAfter pressing and holding the "rotate" button in the object's menu
Grab objectGrip button on either controller
Scale objectMove both hands together or apart while holding objectWhile holding an object
Move object closer/awaySwipe up/down on right touchpadWhile holding an object with cursor
Draw with penTriggerWhile holding a pen
Next/previous pen colorUp/down on touchpadWhile holding a pen
Change pen sizeSwipe left/right on touchpadWhile holding a pen
Undo pen strokePress top of touchpadWhile holding a pen
Take photoTriggerWhile holding a camera
Increase/decrease media volumePress up/down on right touchpadWhile hovering over media
+ +## Windows Mixed Reality Controls + +You can also use the [keyboard keys](#keyboard-and-mouse-controls) listed above while using your Windows Mixed Reality headset. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionsControlsContext
Move Left controller joystick
Turn Right controller joystick
Move fasterTrigger
TeleportRight controller joystick up
Show menusPress and hold center of touchpad on left or right controller
Press buttonTriggerWhile cursor is on button
Rotate objectRotate controllerAfter pressing and holding the "rotate" button in the object's menu
Grab objectGrip button on either controller
Scale objectMove both hands together or apart while holding objectWhile holding an object
Move object closer/awayPress bottom/top of touchpad on right controllerWhile holding an object with cursor
Draw with penTriggerWhile holding a pen
Next/previous pen colorPress right/left on touchpadWhile holding a pen
Change pen sizeSwipe up/down on touchpadWhile holding a pen
Undo pen strokePress center of touchpadWhile holding a pen
Take photoTriggerWhile holding a camera
+ +## Oculus Go and Samsung Gear VR Controls + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionsControlsContext
TurnTouchpad left/right
TeleportTrigger
Show menusPress and hold center of touchpad on right controller
Grab objectTrigger
Move object closer/awaySwipe up/down on touchpadWhile holding an object
Drop pen or cameraPress center of touchpadWhile holding a pen or camera
Draw with penTriggerWhile holding a pen
Next/previous pen colorLeft/right on touchpadWhile holding a pen
Change pen sizeSwipe left/right on touchpadWhile holding a pen
Undo pen strokePress top of touchpadWhile holding a pen
Take photoTriggerWhile holding a camera
Increase/decrease media volumeScroll up/down on touchpadWhile hovering over media
+ +## Google Daydream Controls + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionsControlsContext
TurnTouchpad left/right
TeleportTrigger
Grab objectPress center of touchpad
Rotate objectRotate controllerAfter pressing and holding the "rotate" button in the object's menu
Move object closer/awaySwipe up/down on touchpadWhile holding an object
Drop pen or cameraPress center of touchpadWhile holding a pen or camera
Draw with penPress top of touchpadWhile holding a pen
Next/previous pen colorPress left/right on touchpadWhile holding a pen
Change pen sizeSwipe left/right on touchpadWhile holding a pen
Undo pen strokePress top of touchpadWhile holding a pen
Move pen closer/awaySwipe up/down on touchpadWhile holding a pen
Take photoPress top of touchpadWhile holding a camera
Increase/decrease media volumeScroll up/down on touchpadWhile hovering over media
+ +## Gamepad Controls + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionsControlsContext
MoveLeft thumbstick
Move fasterLeft trigger
TurnLeft/right bumper. Right thumbstick
Show menusHold Up on D-pad
Toggle menusStart/Menu button
TeleportA
Grab objectRight Trigger
Rotate objectMove cursorAfter pressing and holding the "rotate" button in the object's menu
Move object closer/awayUp/down on left joystick while holding left triggerWhile holding an object
Spawn penY
Drop penBWhile holding a pen
Draw with penRight TriggerWhile holding a pen
Next/previous pen colorA/XWhile holding a pen
Undo pen strokeYWhile holding a pen
diff --git a/docs/fundamentals/custom-avatars.md b/docs/fundamentals/custom-avatars.md new file mode 100644 index 0000000..cdc0ca0 --- /dev/null +++ b/docs/fundamentals/custom-avatars.md @@ -0,0 +1,49 @@ +--- +sidebar_position: 2 +--- + +# Creating Custom Avatars + +In Hubs you can choose how you want to represent yourself. Select from any of the featured or newest avatars, or create your own. + +Get started quickly using one of these web based tools: [Quick Customized Avatars](https://hubs.mozilla.com/labs/quick-customized-avatars-in-hubs/). + +Depending on how involved you'd like to get in the avatar creation process, you might choose to simply 're-skin' one of the base avatar bodies, or upload your own 3D model. + +![Image of a custom avatar](/img/intro-avatars-image-min.jpeg) + +## To 're-skin' a robot or box bot avatar + +The most straightforward way to customize an avatar for Hubs is to upload a custom texture on one of the base robots. To do this: + +1. Enter a Hubs room. +2. Select the "People" list icon in the top right corner of the screen. +3. By your name, you will see a pencil icon. Click this icon to open the avatar selection screen. +4. Click the "Browse Avatars" button. +5. From here, you can see a list of your own avatars, the first spot should say "Create Avatar". +6. In the avatar customization screen choose one of the default body shapes. +7. Click "Base Map" and upload an image file. If you want to design a custom texture for the robot skin, see the details below. +8. Save the avatar. + + + +### Create a robot texture + +The easiest way to design a new skin for a robot avatar is to use our avatar re-skinning tool 'Quilt' to mix together image files, preview what they look like on a robot and export a single texture map file. Try it yourself at [tryquilt.io](http://tryquilt.io/). + +![Examples of robot avatars](/img/intro-hubs-tryquilt.jpeg) + +For downloadable .psd files see our [advanced avatar customization](creators-advanced-avatar-customization.html) documentation. + +### Create a box bot texture + +The easiest way to create a new skin for a box bot is to use a Minecraft avatar building tool to create your own, or search online for Creative Commons Minecraft skins. + +![Examples of box bots](/img/box-bot-examples.jpeg) + +## Advanced Avatar Customization + +For more on customizing Hubs avatars, such as texture maps, downloadable templates, and instructions for using your own 3D models, check out the [advanced avatar customization](creators-advanced-avatar-customization.html) section of the documentation. diff --git a/docs/fundamentals/fundamental-faqs.md b/docs/fundamentals/fundamental-faqs.md new file mode 100644 index 0000000..df11f79 --- /dev/null +++ b/docs/fundamentals/fundamental-faqs.md @@ -0,0 +1,145 @@ +--- +sidebar_position: 11 +--- + +# FAQ + +## What is the capacity of a Hubs room? + +We recommend a maximum of 25 in-room participants. This capacity is the default because low power devices, such as mobile phones and standalone VR headsets, may begin experiencing performance issues in busier rooms. You can adjust the room capacity in the [room settings](hubs-room-settings.html) menu. + +Once a room is full, all additional users (participant #26 and beyond) can still participate by watching from the lobby. Users in the lobby can see and hear what's happening in the room and interact via text chat; however, they are not represented as avatars in the room and their mic is not active. There is no hard limit on lobby capacity, however, performance may decrease once there are over one hundred people in the lobby. + +If you want to scale Hubs for a larger event we recommend splitting crowds into multiple rooms with smaller groups, or live streaming the event, depending on the use case. + +For more information on setting up Hubs for large events, we recommend exploring [Hubs Cloud](https://hubs.mozilla.com/cloud) as an option for your organization's event needs. + +## How long does a Hubs room last? + +Hubs rooms stay open forever unless you choose the "close room" option from the dropdown menu. Unless a room has been "closed", you will always be able to use the URL to revisit your room. If you plan to revisit a room, you might like to add it to your favorites for easy access. + +## Can I play video content in Hubs? + +Hubs has the ability to play videos in the room, which allows you to watch with friends or live stream content from an existing stream. For videos, Hubs supports standard video formats. Live stream content is supported in the HLS format. You can embed videos from popular video hosting websites like Vimeo, YouTube, and Twitch, but due to high load these may sometimes be unreliable. For mission-critical content, we recommend hosting videos on the Hubs servers by uploading to your Hubs room or Spoke (there is a 128MB size limit for these videos) or using a hosting provider like Amazon S3. + +## Where does the chat log go? + +The chat log only exists temporarily. Messages disappear after a set period of time. We are working on developing chat scrollback. Until this is released, you can also keep track of in-world chat by setting up the [Hubs Discord Bot](hubs-discord-bot.html). + +## Can I share a PowerPoint presentation in Hubs? + +Hubs is great for giving presentations. Supported media types are PDF files, images, 3D models, audio, video, webcam input, and screen sharing. + +To use a PowerPoint in Hubs, you can convert it to a PDF file and import it directly into Hubs, or you can use screen sharing to stream a view of your presentation into Hubs. + +## Is it possible to have my video or slides show up in a good place (like on a wall) automatically? + +Precise positioning using the [object controls](./hubs-features.html#object-menu) in Hubs can be a bit tricky at the moment. ([We are working on it!](https://github.com/mozilla/hubs/issues/1324)) + +If precise positioning is important, you may prefer to build your media into the scene using [Spoke](https://hubs.mozilla.com/spoke), Hubs' web-based scene editing tool. Spoke has controls that let you fine tune object placement. + +In the meantime, you may find it easier to resize and place objects when using Hubs in VR. If you are setting up a room on desktop, we recommend directly facing the surface you wish to place your media on when importing the files. To move the media into position, you may find you have more control if you click on the object with your mouse to grab it, and then move it into place using the WASD keys. + +## What devices does Hubs run on? + +Because it runs in the browser, Hubs is very cross-platform compatible. It works on mobile, desktop, and VR devices, and runs on most modern browsers. For more information check out the [supported devices & browsers](./hubs-create-join-rooms.html#supported-devices--browsers) section. + +## Why are lines on my drawings disappearing? + +There is a maximum number of lines that can be included in drawings using the pen tool. Once the limit is reached, the first lines will start to disappear. To prevent this, periodically open the object menu on your drawing, and press the "create" button (magic wand). This will turn your drawing into an object, and reset your line count to 0. + +## Can I create custom environments? + +Environments are completely customizable using [Spoke](https://hubs.mozilla.com/spoke), Hubs' web-based scene editing tool. [Learn more here.](intro-spoke.html) + +## How do I record my event in Hubs? + +We recommend using screen recording software like [OBS](https://obsproject.com/) to capture events in Hubs. To hide the user interface when recording, you can press the backtick key ( ` ), or turn on [camera mode](hubs-room-settings.html#camera-mode). + +## Can I add custom interactive objects to my room? + +[Spoke](https://hubs.mozilla.com/spoke) allows you to create model spawners in your room, enabling users to generate copies of 3D models in the room. + +It is not possible at the moment to add scripting or further interactivity to objects in Spoke or Hubs. + +## Can I import 3D models from [other software]? + +Hubs supports importing glTF binary (.glb) models. If the tool you use doesn't create .glb files, we recommend using a tool like [Blender](https://www.blender.org/) to convert your model. + +## Is it possible to create my own avatar? + +For sure! We love seeing custom avatars. You can either re-skin the default avatars or upload your own 3D model (.glb). For more information check out the [Creating Custom Avatars](./intro-avatars.html) section. + +## Is it possible to create a link to another room from within a room? + +Yes, just copy and paste a link for one Hubs room into another (or paste the URL into the Hubs chat box and press the little magic wand icon). Due to browser limitations, when you open the new Hubs room you have to go through the "enter room" process again. + +## Can I prevent other people in the room from drawing, controlling slides/videos, etc? + +If you are the room moderator you can turn these on/off by going to [room settings](hubs-room-settings.html) in the dropdown menu. + +## Is there a laser pointer tool in VR? + +The pen in Hubs doubles as a laser pointer tool. When the pen is emitting a laser, you and others will see a line going from your avatar in the direction you are pointing. + +## How do I fly? + +You can type /fly in the text chat box, or press G on desktop, or press down on the joystick in Quest. + +## How do I access the text chat box & preferences on Quest? + +You need to leave VR mode to access the text chat box & preferences on Quest. Press the home button on your controller and "quit" VR. + +## Why do things disappear when I leave the room? + +Check out the [troubleshooting](hubs-troubleshooting.html#objects-disappear-after-leaving-room) section. + +## When I load a room, I get an error saying unable to connect to room. Help! + +Check out the [troubleshooting](hubs-troubleshooting.html#unable-to-connect-error) section. + +## Why is there echo in the room? + +Check out the [troubleshooting](hubs-troubleshooting.html#there-is-echo-in-the-room) section. + +## How much does Hubs cost for an event? + +Creating private rooms on [hubs.mozilla.com](https://hubs.mozilla.com/) is free! + +If you are interested in hosting an event, or would like to create a customized Hubs environment on your own infrastructure/domain, check out [Hubs Cloud](https://hubs.mozilla.com/cloud) or fill out the [Hubs Events form](https://mzl.la/hubsevents) so that we can provided tailored information for your event needs. + +## Can I prevent unregistered attendees from attending my event? + +Hubs rooms can only be accessed by individuals with the URL. Authentication can be done either the [Hubs Discord Bot](hubs-discord-bot.html), or using an approved list of users in [Hubs Cloud](https://hubs.mozilla.com/cloud). + +## Can I run custom code in a Hubs room? + +You can't run custom code in the main Hubs website (hubs.mozilla.com) but you can add your own if you self-host using Hubs Cloud (see previous answers). To add custom code you will need to create your own custom fork of the Hubs Cloud client. + +For more information, see our documentation on [custom clients](./hubs-cloud-custom-clients.html). + +## Is it possible for me to create a custom version of Hubs which has different features or styling? + +See previous answer. + +## Can I pay Mozilla to do X, Y, Z? + +It's not possible to pay Mozilla for custom work, however, our code is open source and we welcome external contributors in [GitHub](http://github.com/mozilla/hubs). You can post in the #work-for-hire channel of our [Discord chat server](https://discord.gg/wHmY4nd) if you are interested in paying someone to build something for you. + +## Can I run my virtual event in Hubs? + +Yes, check out the information [here](./intro-events.html) for more information on how to get started: + +If you have questions about whether Hubs will be a good fit for your event, drop by our office-hours or meetup to speak to a member of our team. See our community [Discord chat server](https://discord.gg/wHmY4nd) for the schedule. + +## Have you considered adding feature X? + +We keep track of bugs and feature requests in GitHub. If there is a feature you would like, see if someone has already mentioned it in our [list of bugs/feature requests](https://github.com/mozilla/hubs/issues). If you find someone else has already asked for the feature, let us know in a comment that you would like it too. If it's not already mentioned, feel free to submit a "feature request." Note, please include as much detail as possible to feature requests to let us know how you see this feature benefiting your use case. + +## Where can I find the Mozilla Hubs Privacy Policy? + +https://www.mozilla.org/en-US/privacy/hubs/ + +## Need help with something else? + +If you can't find what you need in the rest of the documentation, see the [help page](./help.html) for ways to get in touch. diff --git a/docs/fundamentals/getting-started.md b/docs/fundamentals/getting-started.md new file mode 100644 index 0000000..0d70f6b --- /dev/null +++ b/docs/fundamentals/getting-started.md @@ -0,0 +1,96 @@ +--- +sidebar_position: 1 +--- + +# Getting Started With Hubs + +In the following guide we'll show you the basics of Hubs! (Prefer a video? [Click here](https://www.youtube.com/watch?v=5QnOsyyebEQ).) + +To get started, head to [hubs.mozilla.com](https://hubs.mozilla.com/). Make your own room by clicking “Create a Room.” + + + +

🎉 Congratulations - you now have your very own virtual space! 🎉

+ +## Enter the Room + +Before entering, you are in the room's lobby. From here, you can see and hear what's going on inside the room, and you can only interact with others using text chat. Entering the room can be a bit different depending on the type of device you are using. + +**On a desktop computer?** + +- Click "Enter Room" and follow the prompts to select a name/avatar and enable the mic. + +**On a VR headset or mobile device?** + +- Take a look at the [instructions](./hubs-create-join-rooms.html#enter-the-room) in the Hubs documentation. + +## Explore Hubs + +### Look around + +Try exploring your new space. On desktop use your **WASD** or arrow keys to move around. You can also press your right mouse button to teleport to a different location. Rotate your view using the **Q** and **E** keys, or hold down your left mouse button and drag. + +For VR and mobile controls see our list of [Hubs controls](hubs-controls.html). + +### User Interface + +Take a moment to take a look around the user interface. You can mute your mic, take photos, share your screen, create objects, and more. We'll introduce the basics of some of these controls in this guide. For more detailed information check out the [Hubs Features](hubs-features.html) section of the documentation. + +![Hubs Image](/img/hubs-user-interface.png) + +### Import Media + +In Hubs you can import 3D models, images, videos and PDFs from all over the web including SketchFab, Google Poly, SoundCloud, Vimeo, Twitch, Crunchyroll, and more. + +Try searching for content in the Media Browser (the magic wand button at the top of the screen). + +You can also add media by dragging and dropping a file into the room, or by copying (ctrl+c or command+c) a URL and then pasting it in the room (ctrl+v or command+v). + + + +### Object Menus + +Additional controls for objects, videos, and drawings can be found in their object menus. + +To reveal these controls, hover your cursor over the object and press the space bar or tab key on desktop. + +For VR and mobile controls see our complete list of [Hubs Controls](hubs-controls.html). + +![Screenshot of the Object Menu](/img/intro-hubs-object-menu-min.jpeg) + +### Avatar Menus + +You can open up a menu on users just like on objects. This lets you control their volume or hide them from your view. +If you are a room owner or moderator you will have extra permissions, like being able to mute the user's mic or temporarily kick them from the room. + +![Screenshot of the Avatar Menu](/img/intro-hubs-avatar-menu-min.jpeg) + +### Change the Scene + +You can change your scene to suit the mood of your event. There are lots of environments to choose from in our scene database, or you can create your own custom worlds using our scene editor [Spoke](intro-spoke.html). Explore the scene browser by opening the dropdown menu and selecting Choose a Scene. + +Note, only room moderators can change the scene. You also need to be signed in using your email address. Logging in is not required to use Hubs but doing so provides benefits such as being able to save favorite rooms, and upload custom avatars. All we need is an email address to authenticate your account — no additional information is required. + + + +## Invite Friends + +Your new space is private, and no one else can join until you invite them. + +When you are ready to invite others click the "Share" button at the top of your screen. Copy the room URL or shortlink code and send it to your friends. + +![Screenshot of the Share pop-up](/img/hubs-invite-dialogue.PNG) + +## Next Steps + +This was just a quick overview of some of Hubs' basic features. For a detailed overview of what you can do in Hubs check out [Hubs Features](hubs-features.html) in the documentation. diff --git a/docs/fundamentals/hosting-events.md b/docs/fundamentals/hosting-events.md new file mode 100644 index 0000000..fc70c95 --- /dev/null +++ b/docs/fundamentals/hosting-events.md @@ -0,0 +1,81 @@ +--- +sidebar_position: 3 +--- + +# Hosting Events in Hubs + +This guide will talk you through the process of using Hubs for an event on [Mozilla Hubs](https://hubs.mozilla.com). We've broken this guide down into different sections that can help you get started with creating and configuring a room, choosing a custom scene, inviting people, and moderating your event. + +If you're new to Mozilla Hubs, check out these getting started guides to familiarize yourself with the platform: + +1. [Getting Started with Hubs](./intro-hubs.html) +2. [Familiarize yourself with Hubs Controls](./hubs-controls.html) + +## Events in Hubs + +Hubs is a platform where you can create private rooms and meet with friends in a 3D environment online. Hubs rooms are capped at a room capacity of 24 users, but this limit can be increased to 30. Additional people can also view and hear the room content from the room lobby. Client performance is an important consideration with Hubs, and it will vary based on the devices that your attendees are connecting with. Mobile devices (phones, standalone headsets) may have performance challenges when there are more than 10 people in an individual room. + +Events in Hubs work best for meetups that are designed to have attendees engaged and participating actively with one another, or as a shared viewing environment for streamed video content. + +If you are interested in hosting a large event with multiple tracks, you may be interested in exploring [Hubs Cloud](./hubs-cloud-getting-started.html). Hubs Cloud allows you to customize your deployment of the Hubs platform, so that you manage and maintain the system, offers configuration tools for rooms and accounts, and is better suited for larger events. For events that have larger participant interest, we recommend creating several viewing rooms and streaming the primary content to a service like [Twitch](https://twitch.tv). + +## Setting up a Room + +Your event will need a room, which can be created from the home page at [hubs.mozilla.com](https://hubs.mozilla.com). When you create a room, you are the room's "owner", which grants you full rights and permissions within the room you have created. We recommend that you log in with a Hubs account when you create rooms, since this will ensure that you are still recorded as the room owner even if you change devices. Logged-in room owners have additional configuration tools available to them that enable more nuanced control over how visitors can interact in the space. + +When you create a room as a signed-in user, you can save the room to your favorites list. Rooms that you have favorited appear on the home page when you're signed in to hubs.mozilla.com. This is a helpful way to save links to rooms that you want to return to. By default, rooms stay open until they are explicitly closed by the room owner or a moderator, and once rooms are closed, they cannot be re-opened. + +### Room Permissions + +You can specify whether users in the room are able to create and move objects, pin content, and draw with the pen. To set these for your Hubs room, click the menu icon, select 'Room Settings', and toggle the permissions that you want to set. By default, users can create and move objects, pin content, draw, and create cameras. Removing these permissions can help keep rooms performant, and reduces the likelihood that someone will bring content into the room that is undesirable. + +## Choosing a Scene + +With Hubs, you can create your own scenes to use as the environment for your rooms. Any scene can be used to create multiple rooms, and you can remix existing scenes that have been shared with a Creative Commons license in [Spoke](./intro-spoke.html) to make edits and personalize spaces. For events, we've provided a few example scenes below to get you started. + +[Conference Room A](https://hubs.mozilla.com/scenes/GvQthTN/conference-room-a) - A smaller meeting room for professional meetings of up to ten users + +[Lake Office](https://hubs.mozilla.com/scenes/QiUmYC3/lake-office) - An open space with low audio attenuation designed to make it easier to break off into smaller groups around the room + +[Living Room](https://hubs.mozilla.com/scenes/y7wBpta/better-lit-living-room) - A more casual space that works well for smaller group discussions and for streaming panelists + +[Conference Presentation Hall](https://hubs.mozilla.com/scenes/HHKr45j/conference-presentation-hall) - A larger meeting space with room for slides and a speaker on stage + +[Outdoor Meetup Space](https://hubs.mozilla.com/scenes/2rEmqCK/outdoor-meetup) - A large, outdoor space with spaces to put large video streams + +[Conference Lobby Hall](https://hubs.mozilla.com/scenes/u3ezwKe/customizable-conference-lobby) - A large space with room to move around to different places and converse, with places to link other rooms + +From each of the above scene URLs, you can "Create a room with this scene" directly from the scene page. Alternatively, you can paste the scene URL into an existing room that you have already created and [change the scene from within the room by following these steps](./hubs-room-settings.html#change-the-scene). + +## Invitations + +By default, Hubs rooms [are private, available only to people who you share the URL with](https://blog.mozvr.com/creating-privacy-centric-virtual-spaces/). When planning an event with Hubs, it's important to consider who you want to invite, and only share the link with the attendees you want to have in the space with you. Keep in mind that those attendees will also be able to share the URL, so communicate whether or not how private you would like your event to remain. + +### Discord Integration + +For an additional authentication mechanism, you can use [Discord](https://discordapp.com) and our [Hubs Discord Bot](https://hubs.mozilla.com/discord) to create rooms. This will require that users are a) a member of your Discord server, b) allowed in the channel the room has been bound to and c) signed in before they can access the Hubs room. + +Read more about the [Discord Bot](./hubs-discord-bot.html). + +### Embedded Rooms + +You can also embed rooms that you own into an existing webpage via an iframe. For larger events that have multiple rooms open at the same time, it can be helpful to embed rooms into a central location to help people find occupied rooms and enter from a single location. + +## Moderation & Event Controls + +If your event is semi-public or public, you should have a moderation strategy in place. The following links explain the tools that are available to you as the room creator, and how to promote trusted users in the room to also be moderators to help manage a space. Generally, for events that are open to a semi-trusted or anonymous audience, we recommend having multiple moderators to help manage the space. Please keep in mind that anyone who has access to the room link will be able to enter your room unless you have configured the Discord authentication mechanism, or are running a configured Hubs Cloud instance. + +- [Promoting Room Moderators](./hubs-room-settings.html#promoting-room-moderators). +- [Temporarily Kick Users](./hubs-room-settings.html#kick-users). + +If you are using the Discord Bot for moderation, you can remove a user permanently by revoking their Discord account from being able to access the specific channel that is used for the Hubs room, or by removing them from your Discord server. + +### Code of Conduct + +We recommend that events that are semi-public or public have a prominent link to the code of conduct guidelines for the space. You can learn more about Mozilla's own [Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) or provide a link to your own when you create an event. We also recommend adding an image to your event rooms that includes a link to your code of conduct, as well as information about how to report violations. + +If you are requesting support from Mozilla to promote or assist with running your event, a code of conduct link is required. + +## More Information + +If you have additional questions about hosting events or conferences using Hubs, please get in touch by [filling out the Hubs event interest form](https://airtable.com/shrAtlBbxEKkLbMsd) or join the [Hubs Community Discord Server](https://discord.gg/wHmY4nd), and check out the #conferences channel. diff --git a/docs/fundamentals/hubs-features.md b/docs/fundamentals/hubs-features.md new file mode 100644 index 0000000..97e030b --- /dev/null +++ b/docs/fundamentals/hubs-features.md @@ -0,0 +1,128 @@ +--- +sidebar_position: 5 +--- + +# Hubs Features + +![Hubs User Interface](/img/hubs-user-interface.png) + +## User Interface + +1. **Invite:** Opens a dialog box with information on sharing the room with friends. More info is provided in the [Invite Menu](./hubs-features.html#invite-menu) section at the bottom of this page. + +2. **Mute:** Toggles your microphone on/off. + +3. **Share:** Enables you to share your desktop, webcam, or phone camera with room members. The shared media will appear like a video in the room. Click this button again or use the [object menu](./hubs-features.html#object-menu) to remove the media. + +4. **Place:** Opens a search tool to find media you can bring into the room. Select from 3D models, scenes, avatars and gifs, or provide a URL or file for an image, video, model or scene. Additional objects that you can place are listed below: + + - **Pen:** Lets you draw in 3D space. You can change the pen's size and color (see [Hubs Controls](./hubs-controls.html)), undo strokes, and generate 3D models from your drawing (see the [drawing menu](./hubs-features.html#drawing-menu)). + + - **Camera:** Creates a camera object that can take photos and videos of the room then add them to the room as objects. When you take a photo or video, a link also appears in the chat. Click the camera button again to remove the camera object. + +5. **React:** Opens a menu where you can select an emoji to spawn in the room. + +6. **Chat:** Enables you to communicate via text chat, create objects or enter commands. Commands include: + + /leave - Disconnect from the room.\ + /grow - Increase your avatar's size.\ + /shrink - Decrease your avatar's size.\ + /duck - Create a duck object.\ + /debug - Toggle physics debug rendering.\ + /vrstats - Toggle stats in VR.\ + /scene - Change the scene (moderators only).\ + /rename - Rename the room (moderators only).\ + /audiomode - Toggle left-right spatialization, but keep distance-based attenuation (experimental).\ + /audioNormalization - Equalize audio levels (experimental).\ + /fly - Toggle fly mode. + +7. **Leave:** Leave the current room that you are in + +8. **More:** Opens a panel to display additional commands that are available. From this menu, you can favorite a room, modify your user preferences, access help, and other settings. If you are the room owner, this menu will also include settings related to the room permissions and current scene. + +9. **Objects:** Displays a list of the media items that exist in the room. Click on the objects in the list for further options. + +10. **People:** Displays information on the people in the room and lobby. Shows the number of room members, their names, and their device type. You can also access advanced user controls from this list. + +## Menus + +Room objects and avatars have their own menus. To reveal them on desktop computers, hover your cursor on the object, and press the space bar (or tab). For VR devices, see the [Controls](./hubs-controls.html) section of the docs. + +### Object Menu + +![Hubs - Object Menu](/img/hubs-object-menu.jpeg) + +1. **Pin:** Makes the object stay in the room when you leave. By default, objects disappear when their creators exit. +2. **Target:** Opens a focused view of the object. This menu item is present for media objects. +3. **Resize:** Resizes the object. +4. **Open link:** Opens the URL of the object in a new browser tab. +5. **Trash:** Removes the object from the scene. +6. **Gravity:** Makes the object fall to the floor. +7. **Clone:** Makes a duplicate of the object. +8. **Rotate:** Rotates the object. +9. **Magnify:** Displays a view of object low in your view. This menu item (not shown) is present for media objects. +10. **Convert to drawing:** Converts the object back to a drawing. This menu item (not shown) is present if the object originated from a drawing. + +### Avatar Menu + +![Hubs - Avatar Menu](/img/hubs-avatar-menu.jpeg) + +1. **Volume:** Changes the volume of the user's audio. (Doesn't affect the volume for others in the room.) +2. **Hide:** Hides a user's avatar and audio from you. This only applies to the current session; once you refresh you will see them again. Other room members can still see and hear the user. +3. **Mute:** Mutes the user's microphone so that they are no longer heard by anyone in the room. (Moderators only.) +4. **Kick:** Temporarily kicks a user from the room. (Moderators only.) + +### Camera Menus + +![Hubs - Camera Menus](/img/hubs-camera-menu.jpeg) + +1. **Photo:** Takes a still image then adds it to the room as an object. +2. **Video:** Records a video then adds it to the room as an object. Use the arrows to adjust the recording length. Note that video recordings are temporarily saved to browser storage; a recording in progress may be lost if the browser runs out of space. If you wish to record an event we recommend using a screen recording tool such as [OBS](https://obsproject.com/). + + This feature is not available on Safari. + +3. **Mute Video:** Controls whether audio is included in the video. +4. **Recenter:** Reorients the camera to face you. +5. **Trash:** Removes the camera from the scene. +6. **Rotate:** Rotates the camera. +7. **Object Focus:** Reorients the camera to face the object or user. +8. **Object Track:** Makes the camera rotate to follow the object or user. + +### Drawing Menu + +![Hubs - Drawing Menu](/img/hubs-drawing-menu.jpeg) + +1. **Create:** Makes the drawing into a 3D object. +2. **Undo:** Removes the last stroke. +3. **Trash** Removes the drawing from the scene. + +## Video Controls + +Hover your cursor on a video to display its video controls. + +![Hubs - Video Media Controls](/img/hubs-media-controls.jpeg) + +1. **Screencapture:** Takes a screenshot of the video and then adds it to the room as an object. +2. **Volume:** Changes the volume of the audio playback for you. (Does not affect the volume for others in the room.) +3. **Play/Pause:** Plays/pauses the video. +4. **Time Controls:** Jumps forwards/backwards in the video. + +## Emoji Spawners + +A menu of emoji spawners is displayed when you display [object or avatar menus](./hubs-features.html#menus). + +![Hubs - Emoji Spawners Menu](/img/hubs-emoji-spawners.jpeg) + +The emoji menu lets you spawn a grabbable emoji that emits particles when shaken. The emoji is deleted a few seconds after you let go of it. + +## Invite Menu + +The "Invite" button opens a dialog with the information you need in order to share the room with others, so they can join you in the room. + +![Hubs - Invite Menu](/img/hubs-invite-dialogue.PNG) + +You can copy or share the hub.link URL or use the numeric code to share a link verbally. Note that numeric codes expire after 72 hours. + +The `iframe` HTML code (displayed if you have room permissions) lets you embed the room in a web page. + + diff --git a/docs/fundamentals/hubs-rooms.md b/docs/fundamentals/hubs-rooms.md new file mode 100644 index 0000000..01266e5 --- /dev/null +++ b/docs/fundamentals/hubs-rooms.md @@ -0,0 +1,73 @@ +--- +sidebar_position: 4 +--- + +# Create and Join Rooms + +## Create a New Room + +To create your own room, head to [Mozilla's Demo Hub](https://hubs.mozilla.com/demo) and click "Create a Room". Your new space is private; no one else can join until you invite them. + +## Join an Existing Room + +You can join an existing Hubs room using either a URL or a numeric code. If you have a URL, navigate to the URL in your browser. If you have a numeric code, visit [hubs.link](https://hubs.link) to use it. + +## Enter a Room + +Before entering a Hubs room you are in the room's lobby. You can see and hear what's going on in the room but you can only interact with the others using text chat. The process of entering a room is a bit different depending on your device. + +### On Desktop / Mobile + +Click "Enter Room" and follow the prompts to select a username/avatar and set up your mic. On the final prompt select "Enter on Screen", or "Enter on Phone" if on mobile. + + + +### On a Standalone VR Headset + +If you opened the URL on your desktop or smartphone, choose "Enter on Standalone VR" to create a code that makes it easy to open on your standalone headset (e.g., Oculus Quest, Oculus Go, Samsung Gear). + +Open the browser in your VR headset, navigate to [hubs.link](https://hubs.link) and enter the code. + + + +### On a Wired-in VR Headset + +We recommend [Mozilla Firefox](https://www.mozilla.org/en-US/firefox/new/) for wired-in headsets (e.g., Oculus Rift, Windows Mixed Reality, Vive). To use a desktop VR device with your headset, the Oculus app (Oculus Rift) or SteamVR (Windows Mixed Reality, Vive) must also be open. + +On your computer, click "Enter Room" and follow the prompts to select a username/avatar and set up your mic. On the final prompt before entering you should see an option to select "Connected VR Headset". + +For troubleshooting information visit Hubs [troubleshooting](./hubs-troubleshooting.html) page. + +## Supported Devices & Browsers + +Since Hubs runs in the browser, it works across many different platforms. + +### For 2D Experience + +Hubs works on most modern desktop browsers on Windows, Mac and Linux. It also works on most mobile browsers for Android, and Safari on iOS. + +Currently, Hubs is supported on the following browsers: +| Platform | Browsers | +| ------------- | ----------- | +| Windows | Firefox, Chrome, Edge (version 79+) | +| Mac OS | Firefox, Chrome, Safari | +| Linux | Firefox | +| Android | Firefox, Chrome | +| iOS | Safari | +| Standalone VR | Oculus Browser, Firefox Reality | + +### For VR Experience + +For Desktop VR (Oculus Rift, Windows Mixed Reality, or Vive) Hubs works when used with a WebVR compatible browser (e.g., Firefox). Users must also have either the Oculus app (Oculus Rift), or SteamVR installed (Windows Mixed Reality, Vive). + +For Standalone VR devices (Pico Neo 2, Oculus Quest and Oculus Go) Hubs works in the Mozilla Firefox Reality Browser or the Oculus Browser. + +Mobile phone powered VR systems, such as Samsung Gear and Google Cardboard, work using Google Chrome browser. + +Note that some features may be limited on low-powered devices such as mobile phones. diff --git a/docs/fundamentals/reskin-avatars.md b/docs/fundamentals/reskin-avatars.md new file mode 100644 index 0000000..db8ca7a --- /dev/null +++ b/docs/fundamentals/reskin-avatars.md @@ -0,0 +1,60 @@ +--- +sidebar_position: 12 +--- + +# Reskin Avatars + +Depending on how involved you'd like to get in the avatar creation process, you might choose to simply 're-skin' the existing robot avatar by painting your own texture maps, or create your own fully custom 3D model. + +## Making your own custom avatar skin + +A quick and easy way to create a custom avatar in Hubs is to create a custom skin using an image editor or texturing tool. We have a [Getting Started Tutorial](https://docs.google.com/document/d/1K1Eos1sjqN4N9lPlYQfvU53v8f1HxmdTZRjH4RLrGq8/edit) to help you create your first avatar skin. + +You can use the following resources: + +- [Quilt](https://tryquilt.io/) - A simple tool put together by the Hubs team for quickly re-skinning the default Hubs robot avatar. + +- [Photoshop PSD Templates](Photoshop) - Photoshop templates for a custom Hubs base color skin. You can also use Photoshop's 3D painting tools, using the [Robot OBJ/MAT file](https://github.com/j-conrad/hubs-avatar-pipelines/tree/master/Other%20model%20formats). + +- [Substaince Painter Project](Substance) - Full [Substance Painter](https://www.allegorithmic.com/products/substance-painter) projects for advanced custom skinning. You can also download and modify any of our [example texture sets](Exported%20Texture%20Sets). + +![UV Layout example](/img/UVLayout.jpg) + +The UV layout for the base robot avatar is purposefully symmetrical along the X (horizontal) axis. This makes it relatively easy to paint one half of the texture(s) and flip it to the other side. Some image editing applications such as Photoshop have built-in mirroring tools that allow you to paint both halves in real time. + +![Panda Bot example](/img/PandaBot.jpg) + +The simplest version of re-skinning the robot avatar would be to simply paint a 'baseColor' map. However, because Hubs uses glTF standards it supports many of the map types associated with [physically-based materials](https://www.allegorithmic.com/pbr-guide). +The default avatar is currently using: + +- Base Color +- Emissive +- Normal +- Ambient Occlusion +- Roughness (black = glossy, white = rough) +- Metallic (black = non-metal, white = fully metallic) + +**NOTE: Ambient Occlusion, Roughness, and Metallic must be combined in one singular image with each texture occupying the Red, Green, and Blue channels respectively.** This is sometimes referred to as an _'ORM'_ texture. + +**It is _highly_ recommended that texture resolution be kept at 1024x1024 or below.** This is mostly due to Hubs being a web-based application where large download times for bigger files can hurt performance, especially on mobile devices. _All textures MUST be powers of 2 (64, 128, 256, 512, etc.)_ + +## Making your own custom avatar model + +**IMPORTANT: If you are cloning this repo, _you MUST first install [GitLFS](https://git-lfs.github.com/)_ or else many of the files will not work.** + +We offer the following resources if you'd like to modify our Robot avatar: + +- [Blender Source Files](Blender/AvatarBot) are available of our Robot avatar. **For specific information about how to use these .blend files, be sure to check out the readme within the [Blender/AvatarBot](/Blender/AvatarBot) folder.** + +- [Exported GLBs](Exported%20GLB%20models)/[Exported OBJ](Other%20model%20formats) are available if you'd like to bring them into your editor of choice. + +We recommend using [Blender 2.8 beta](https://builder.blender.org/download/) for custom models since we have provided example files that you may use as a guide. (Typically, skeleton setup varies between modeling applications which can make importing/exporting skeletons a bit tricky due to unexpected changes in bone rotations, but it is still possible to use something other than Blender.) Note: the .blend files were created with [Blender 2.8 beta](https://builder.blender.org/download/) due to the built-in glTF exporter. The glTF importer/exporter for Blender is currently in development. Expect some bugs and [please report them!](https://github.com/KhronosGroup/glTF-Blender-IO/issues) + +Hubs avatars are meant for VR, which means that you should work in real world units. A typical avatar height is roughly 1.7 meters. Note: This is typically a 'standing height'. The lack of legs shown here is a part of that overall height. + +![avatar height diagram](/img/avatarHeight.jpg) + +Files with the suffix _\_base_ refer to the most barebones, basic robot avatar template that can be used as a reference when creating new avatar models. Typically, the Blender workflow would be to either 'Link' or 'Append' the objects from [AvatarBot_base_for_export.blend](/Blender/AvatarBot) in order to use the existing armature (skeleton) and any animations that go along with it, using them as a basis for your own model that you would attach to it. + +The armature is based largely upon the same hierarchy and naming conventions of the skeleton provided by [High Fidelity](https://docs.highfidelity.com/en/rc80/create/avatars/avatar-standards.html#skeleton). This also happens to have a similar structure to VRChat in terms of bone orientations. +However, in our current implementation in Hubs, we have eliminated some of the bones within the hierarchy, namely the lower body and arm joints since we are not using any sort of inverse kinematics (IK) at the moment. This may change in future iterations. diff --git a/docs/fundamentals/room-settings.md b/docs/fundamentals/room-settings.md new file mode 100644 index 0000000..b313649 --- /dev/null +++ b/docs/fundamentals/room-settings.md @@ -0,0 +1,69 @@ +--- +sidebar_position: 8 +--- + +# Room Info and Settings + +## Change the Scene + +There are lots of scenes to choose from in our featured scenes browser. You can also upload your own using our scene editor, [Spoke](./intro-spoke.html). If you are a room moderator, find the scene browser by opening the dropdown menu and selecting "Choose a Scene". + +Note that only featured scenes have been tested for performance across devices. For more information on how featured scenes are selected take a look at our [Featured Content Guidelines](./creators-content-guidelines.html). + + + +## Change Room Name + +To change the name of a room, room moderators can select "Room Settings" from the dropdown menu and enter a new name. + +## Room Access + +## Room Permissions + +By default, rooms are set to "Shared link" mode, where room links contain unique, random identifiers. Sharing this link will give anyone access to the room. You can also set the room to "Invite only" mode, which allows you to generate a link with an additional unique, random identifier. Visitors must then use this invite link to access the room, and the invite link can be revoked to deny future access to the room. When an invite link is revoked, a new one is generated in its place. Users who are already in the room will not be removed from it. + +Note: You can also switch from "Invite only" mode back to "Shared link" mode. Since "Shared link" mode is less restrictive, it will allow users with previously revoked invite links to access the room. If you want to prevent this, keep the room in "Invite only" mode. + +You can specify whether users in the room are able to create and move objects, create cameras, pin content, draw with the pen, create emojii, and fly. By default, all these features are enabled. To toggle them select "Room Settings" from the dropdown menu and set the permissions you want. + +## Promoting Room Moderators + +When in a room with other trusted users, the room owner can promote other users to also have moderation permissions. Promoted moderators have all of the same permissions as a room owner. It is important to ensure that users who are promoted to moderator are trusted parties, as they will have abilities to rename, change scenes, and close the room. + +To promote a user to moderator, select the user from the user list and click the "Promote" button. Users need to be signed in to be promoted. + +## Maximum Capacity + +Hubs rooms have a maximum capacity of 25 people in-room to ensure performance across devices. However, many more can watch from the lobby, even when the room is full. + +Users in the lobby can see and hear what's going on inside the room, and can interact with others through chat. If a room is full, we recommend turning on "Camera Mode" to broadcast a moderator's view to the lobby. + +## Camera Mode + +Camera mode broadcasts a moderator's view to the lobby. This allows users who haven't entered the room to see what's going on in the virtual space from the moderator's point of view. To turn on "Camera Mode" select it from the dropdown menu. + +Entering camera mode also reveals a button to hide the user interface. This can be helpful when doing screen recordings of an event. Press Esc to show the user interface again. + +## Kick Users + +To temporarily kick a user from the room, open the avatar menu and select "Kick." + +## Discord Authentication + +When you create a room in Hubs, it is private by default. Sharing the link or access code with other people allows them to enter that specific room, so generally, you want to be careful with who has the link. + +You can link a Hubs room to a channel in a Discord server and have your server members join with their Discord accounts. Banning a user from your server or removing them from the Discord channel will prevent them from being able to re-join the linked Hubs room, even if that user still has the link to the room. You can learn more about the Hubs Discord bot [here](./hubs-discord-bot.html). + +## Favorite Rooms + +Add a room to your list of favorites by opening up the 'More' menu and clicking 'Favorite Room'. Adding a room to your favorites makes it easier to find again by adding it to your home Hubs screen. + +To remove the room from your favorites, open the room, open the 'More' menu, and click 'Unfavorite Room'. + +## Close a Room + +When you leave a Hubs room, it remains accessible via its URL. You can choose to permanently close the room by selecting "Close Room" from the dropdown menu. Links and codes for the room will no longer work for anyone, including the room owner. diff --git a/docs/fundamentals/troubleshooting.md b/docs/fundamentals/troubleshooting.md new file mode 100644 index 0000000..3905163 --- /dev/null +++ b/docs/fundamentals/troubleshooting.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 10 +--- + +# Troubleshooting + +## Getting stuck on loading screen  + +Rooms may have complex 3D models or objects in them which can increase the load time, particularly on less powerful devices (i.e., mobile phones and standalone VR headsets). If you are getting stuck on the loading screen, try refreshing the page or loading the scene on another browser or device. + +## Audio sounds choppy + +Choppy sounding audio could indicate that your device/network is having trouble with the complexity of the room. This could be because of the complexity of objects in the scene, or the number of other room members present. If you are on a mobile phone, you may find audio quality and performance improves if you enter the room from a more powerful device, such as a computer. + +## I can't hear someone / someone can't hear me + +A connectivity issue may result in one person in the room being unable to hear one or more other participants in a space. We first recommend that you confirm that you can hear other sounds in the room (for example, the sound an object makes when you add it to the room, a video in the room, or the chat sound) and that your Hubs audio preferences aren't set to 0 volume. Also confirm that you are not muted and that you have allowed microphone permissions for Hubs. If you aren't getting any audio at all, try reconnecting to the room with a different audio output device. If you are willing, we also ask that you fill out [this form](https://forms.gle/o6tV9R2ujgDY7gpc8) with network connectivity logs, which will help us diagnose system issues related to audio and connectivity. + +## Wired-in headset is not working + +If your wired-in headset isn't connecting, we recommend checking the following: + +- Does your browser support WebVR? We recommend Firefox for wired-in WebVR experiences. See if your set-up works at https://webvr.info/samples/XX-vr-controllers.html. +- Is your browser up to date? +- Do you have SteamVR (Vive / Windows Mixed Reality) or Oculus App (Rift) installed and up to date? +- Does your VR headset require other supporting software (e.g., Windows Mixed Reality Portal)? Is this installed and up to date? +- If you are using Windows Mixed Reality, have you also installed the [Steam VR tooling](https://store.steampowered.com/app/719950/Windows_Mixed_Reality_for_SteamVR/) for WMR headsets? +- Is your browser using the same graphics card as the VR Headset? + +## There is echo in the room + +Echo may occur if a participant is not wearing headphones. You can ask participants to mute their mic when they are not speaking, or as a room moderator you can mute them yourself in their avatar menu. You can also reduce the volume of the user in their avatar menu. See [Hubs Features](./hubs-features.html) for more information. + +## I have generally bad performance in a room on an otherwise powerful computer + +Confirm that your browser has hardware acceleration enabled. This will allow your browser to utilize the graphics card, which is important for rendering Hubs with better performance. If you are on a laptop with a discrete GPU, you should also confirm that the browser is using the dedicated card in the computer settings. + +## "Unable to connect" error + +An error that says "unable to connect" is often caused by a firewall. At a minimum, Hubs needs your computer to connect to external ports 80 and 443, _both_ via TLS. Ideally, you should also open up ports 51610-65535 on UDP and TCP for Hubs on your router's firewall. + +Note that for self-hosted versions of Hubs you need to open ports 49152-60999 on UDP and TCP. You will also need to open port 19302 on UDP and TCP. + +## Hubs landing page is blank + +If you are using Internet Explorer, try opening the website on another browser. If it doesn't appear on other pages, try clearing your cache and cookies for that page. + +## Mic not working + +If no sound is being picked up from your voice, first check that your mic is properly plugged in and that you selected the right mic in the browser permissions (typically to the left of the address bar). If it is still not working, you may need to look in the privacy and security settings on your computer to ensure that mic permissions are not being blocked. If it still does not work, try in another browser. Hubs works best in Firefox and Chrome, but it also runs on Edge and desktop Safari. + +If the mic is picking up your voice but it sounds distorted. Check you aren't using a bluetooth headset mic, as these do not always work well with browser-based tools. + +## Screen sharing / webcam not working + +Similar to mic issues, if you can't get screen sharing or the webcam to work, first ensure that any required peripherals (webcam) are plugged in. Ensure they have the right permissions to run in your browser (typically to the left of the address bar). If it is still not working, you may need to look in the privacy and security settings on your computer to ensure that permissions are not being blocked. If it still does not work, try in another browser. Hubs works best in Firefox and Chrome, but it also runs on Edge and desktop Safari. + +## Objects disappear after leaving room + +By design, any objects you create in a room will disappear when you leave. This prevents the room from becoming cluttered and slow as things are left behind. If you do want an object to stay in the room, open the object's controls (hover your cursor over it and press the space bar on desktop), and select "pin". A pinned object will stay in the room until it is unpinned or deleted. + +## Objects appear as broken media link + +If you try to import an object and it loads as a broken link, it could be an unsupported file format, or the file might be too large. Hubs supports file uploads up to 150MB. + +## Images aren't displaying + +Some older systems have trouble rendering 2D objects in the scene. If you suspect this is happening, try reloading the page with the following flag at the end of the URL: **?disablebatching**. For example: + + https://hubs.mozilla.com/sgKNM3h/smart-magnificent-gala?disablebatching + +## YouTube is not working + +YouTube videos don't work reliably in Hubs. We recommend trying Vimeo or saving your video to Dropbox and streaming from there. + +## Need help with something else? + +If you can't find what you need in the rest of the documentation, see the [help page](./help.html) for ways to get in touch. diff --git a/docs/fundamentals/user-settings.md b/docs/fundamentals/user-settings.md new file mode 100644 index 0000000..e59ba0b --- /dev/null +++ b/docs/fundamentals/user-settings.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 7 +--- + +# User Settings + +## Changing Name and Avatar + +The first time you enter a Hubs room you will choose a name and an avatar. You can change them at any time by clicking the 'People' menu in the top left corner of the screen and selecting your own name from the list. + +Use one of our featured avatars or [upload your own](intro-avatars.html). + +### My Avatars + +For quick access to your favorite avatars, you can save them to "My Avatars" for quick access. Press the "Copy to my Avatars" icon associated with the avatar in the avatar selection screen. + +![Screenshot of avatar selection screen](/img/hubs-save-avatar.jpeg) + +## User Preferences + +Advanced user preferences (e.g., media volume, movement controls, graphics resolution, etc), can be found in the user preferences section of the dropdown menu. + +![Screenshot of avatar selection screen](/img/hubs-preference-menu.png) + +## User Accounts + +You don't need an account to use Hubs, but some features are only available if you sign in. These include: + +- Uploading custom avatars. +- Saving avatars to "My Avatars". +- Changing scenes. +- Uploading custom scenes. +- Pinning objects in a room. +- Using room moderation tools. +- Saving rooms to favorites. + +To set up an account, the only information we require is an email address. diff --git a/docs/introduction/_category_.json b/docs/introduction/_category_.json new file mode 100644 index 0000000..88b6d26 --- /dev/null +++ b/docs/introduction/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Introduction", + "position": 1, + "link": { + "type": "generated-index", + "description": "What is Mozilla Hubs?" + } +} diff --git a/docs/introduction/community.md b/docs/introduction/community.md new file mode 100644 index 0000000..884bb3a --- /dev/null +++ b/docs/introduction/community.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 3 +--- + +# Community + +Documentation coming soon... diff --git a/docs/introduction/getting-help.md b/docs/introduction/getting-help.md new file mode 100644 index 0000000..8802820 --- /dev/null +++ b/docs/introduction/getting-help.md @@ -0,0 +1,19 @@ +--- +sidebar_position: 4 +--- + +# Getting Help + +## YouTube + +Our [YouTube channel](https://youtube.com/@MozillaHubs) houses dozens of deep-dive explorations and tutorials on important Hubs topics, such as 3D-modeling, event moderation, and the Hubs codebase. + +Check out our [Discover Hubs playlist](https://youtube.com/playlist?list=PLCxaiaRxTL6_V88JFYb6tOPkHCKjnH2BK) to get started... +

+Discover hubs playlist + +## Blog + +Our blog, [Creator Labs](https://hubs.mozilla.com/labs/), is the perfect place to learn about the many different ways our community is pushing the boundaries of immersive content with Hubs. Explore the tutorials, creator spotlights, articles, and exciting initiatives we are working on. +

+Creator Labs preview diff --git a/docs/introduction/hubs-history.md b/docs/introduction/hubs-history.md new file mode 100644 index 0000000..f5af50d --- /dev/null +++ b/docs/introduction/hubs-history.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 2 +--- + +# Hubs History + +Documentation coming soon... diff --git a/docs/introduction/what-is-hubs.md b/docs/introduction/what-is-hubs.md new file mode 100644 index 0000000..8dc29e6 --- /dev/null +++ b/docs/introduction/what-is-hubs.md @@ -0,0 +1,29 @@ +--- +sidebar_position: 1 +--- + +# What is Hubs? + +Hubs is a virtual collaboration platform that runs in your browser. With Hubs you can create your own 3D spaces with a single click. Invite others to join using a URL. No installation or app store required. + +![Screencapture from an event in Hubs](/img/hubs-business.jpeg) + +## Who is Hubs for? + +Hubs is for anyone who wants to connect with others remotely! It's a great way to bring communities together in a shared virtual space. + +Host a conference, teach a class, showcase art, or just hang out with friends. Hubs makes it easy to connect and share images, videos, 3D models, and more. With Hubs' spatialized audio you can have conversations with everyone together or break out into smaller groups — just like you can in person. + +Hubs works across platforms. Got a VR headset? Awesome! If not, you can use your desktop computer, laptop, tablet, or mobile devices to explore in 2D (see supported browsers). + +![Screencapture from an event in Hubs](/img/hubs-scenes3.jpeg) + +## Customizing Hubs + +Hubs is open source and customizable. Upload personalized avatars or create unique environments using Spoke. + +Want more control over your Hubs interface? You can self-host your own version of the platform using Hubs Cloud. Add custom branding, use your own domain name, limit access to approved users, and build your own features and functionality. + +### What is Spoke? + +Spoke is the built-in scene editor for creating environments that can be used in Hubs rooms. The editor runs entirely in the browser and allows you to upload your own 3D models, images, and files to use in your projects. Spoke also contains building kits and integrations with content providers to help you build the perfect space! diff --git a/docs/subscription/_category_.json b/docs/subscription/_category_.json new file mode 100644 index 0000000..867623c --- /dev/null +++ b/docs/subscription/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Hubs Subscription", + "position": 2, + "link": { + "type": "generated-index" + } +} diff --git a/docs/subscription/choosing-subscription.md b/docs/subscription/choosing-subscription.md new file mode 100644 index 0000000..24b090c --- /dev/null +++ b/docs/subscription/choosing-subscription.md @@ -0,0 +1,66 @@ +--- +sidebar_position: 1 +--- + +# Choosing A Subscription + +_Hubs currently offers three managed subscription plans that allow users to customize the default behavior of their hub and manage content, such as virtual worlds and avatars, without the hassle of running their own server. If you are not ready to sign up for a plan, you can create a [default room](https://hubs.mozilla.com/) or [custom scene](https://hubs.mozilla.com/spoke) for free on Mozilla's Demo Hub._ + +**Table of Contents**\ +      [Supported Regions](#supported-regions)\ +      [Subscription Plans](#subscription-plans)\ +            [Hubs Starter Plan | Free](#hubs-starter-plan--freehttpshubsmozillacomsubscribe)\ +            [Hubs Personal Plan | $7 USD +tax / month](#hubs-personal-plan--7-usd-tax--monthhttpshubsmozillacomsubscribe)\ +            [Hubs Professional Plan | $79 USD +tax / month](#hubs-professional-plan--79-usd-tax--monthhttpshubsmozillacomsubscribe) + +--- + +## Supported Regions + +All Hubs Starter Subscriptions are available without geographic restrictions. + +Paid Hubs Subscriptions (Personal and Professional) are currently available in 33 countries: + +USA, Germany, UK, Canada, France, Luxembourg, Belgium, Austria, Switzerland, Italy, Spain, Netherlands, Ireland, New Zealand, Finland, Sweden, Malaysia, Singapore, Poland, Romania, Portugal, Denmark, Czech Republic, Hungary, Bulgaria, Croatia, Slovakia, Lithuania, Slovenia, Latvia, Estonia, Cyprus, Malta. + +We are working to expand our regional coverage and would love to hear where you would like to see Hubs released. The best way to let us know is in our [Discord Server](https://discord.com/channels/498741086295031808/1047462879076560926/1047537940047339570) or [via email](mailto:hubs-feedback@mozilla.com?subject=[New-Region-Request]). + +## Subscription Plans + +### [Hubs Starter Plan | Free](https://hubs.mozilla.com/#subscribe) + +Launched in May 2023, the Hubs Starter Plan is a great option for new users to get a taste of running your own Hub. The Starter Plan is quick and easy to set up, giving you access to the subscription dashboard, admin panel, and our scene editor Spoke, where you can manage the worlds and avatars on your hub. + +| Starter Plan Specifications | | +| --------------------------- | ------------------------------- | +| Worlds | Unlimited | +| Concurrent Users | 10 | +| Asset Storage | 500 MB | +| Server Auto-Pausing | After 12 hours with no activity | + +### [Hubs Personal Plan | $7 USD +tax / month](https://hubs.mozilla.com/#subscribe) + +Launched in July 2023, Hubs Personal makes it easier to fully customize your Hub without the hassle of configuring a server and database. Hubs Personal gives you access to the subscription dashboard with subdomain configuration, the scene editor, and the admin panel with branding, where you can easily manage the worlds, avatars, and default features of your Hub. Personal is perfect for creators, educators, and event hosts building experiences without access to technical resources, like a 3D developer. + +| Personal Plan Specifications | | +| ---------------------------- | ---------------------------------------- | +| Worlds | Unlimited | +| Concurrent Users | 20 | +| Asset Storage | 2 GB | +| Server Auto-Pausing | After 72 hours with no activity | +| Domain | Custom myhubs.net web address | +| Branding | Upload custom logos and theme-ing colors | + +### [Hubs Professional Plan | $79 USD +tax / month](https://hubs.mozilla.com/#subscribe) + +Launched in July 2023, Hubs Professional gives you event more control over your Hub without the hassle of configuring a server and database. With advanced tools and higher server capacity, educators and teams are able fully control the look and feel of their Hub while engaging more users. Custom Client deployment also allows you to build, test, and deploy custom code, allowing you to integrate the features and interactivity your visitors love. + +| Professional Plan Specifications | | +| -------------------------------- | -------------------------------------------------------------------------------------- | +| Worlds | Unlimited | +| Concurrent Users | 50 | +| Asset Storage | 25 GB | +| Server Auto-Pausing | Never | +| Domain | Custom myhubs.net web address or [Connect a Custom Domain](./setup-custom-domain.html) | +| Branding | Upload custom logos and theme-ing colors | +| Custom Code | Deploy a [custom version of the hubs frontend code](./setup-custom-client.html) | diff --git a/docs/subscription/creating-subscripton.md b/docs/subscription/creating-subscripton.md new file mode 100644 index 0000000..21f1e4f --- /dev/null +++ b/docs/subscription/creating-subscripton.md @@ -0,0 +1,116 @@ +--- +sidebar_position: 2 +--- + +# Creating Your Hub + +_This guide walks you through the steps of setting up your Hubs Subscription. If you experience unexpected results at any point of the process, please refer to [the support page](./setup-contact.html) for more information._ + +**Table of Contents**\ +      [How To Subscribe - Starter Plan](#how-to-subscribe---starter-plan)\ +      [How To Subscribe - Paid Plans](#how-to-subscribe---paid-plans)\ +      [Subscription Dashboard Overview](#subscription-dashboard-overview)\ +      [Customizing Your Subdomain - Paid Plans](#customizing-your-subdomain---paid-plans) + +--- + +## How To Subscribe - Starter Plan + +1. **Navigate to left column of [the subscription page](https://hubs.mozilla.com/#subscribe) and select "Create Free Hub".** + + +

+ +2. **Create or sign-in to an existing Mozilla account.** + + +

+ +3. **If you create a new Mozilla account, verify your email and reselect "Create Free Hub."** + + +

+ +4. **Access your subscription dasboard and wait for your Hub to be created. It may take up to 5 minutes for this process to complete.** + +Screenshot of the Scene Browser +

+ +## How To Subscribe - Paid Plans + +1. **Navigate to middle column of [the subscription page](https://hubs.mozilla.com/#subscribe), confirm that you are located in a supported region, and select "Subscribe".** + + +

+ +2. **If you already have a Mozilla account, select "Sign In" and complete the login process. If you do not have an account, enter your information into the corresponding boxes.** + + +

+ +3. **Select the check-box to authorize Mozilla to charge you and enter your desired payment information. Once complete, select "Subscribe Now".** + + +

+ +4. **Check your inbox for an email titled "Welcome to Hubs [Plan Name]". Choose the "Get Started" link in the email and follow the login process to access your Hubs Subscription Dashboard. It may take a few minutes while your Hub is getting set up.** + +Screenshot of the Scene Browser + +## Subscription Dashboard Overview + +The subscription dashboard +

+ +## Customizing Your Subdomain - Paid Plans + +1. **Select the three vertical dots on the upper right-hand corner of the dashboard's info panel and select "Edit Details" in the pop-up.** + + +

+ +2. **In the Hub Details editor, input your domain in the "Web Address" form and select "Update". The amount of url customization available to you will depend on your subscription plan.** + + +

+ +3. **Wait for your subdomain to be updated.** + + +

diff --git a/docs/subscription/custom-client.md b/docs/subscription/custom-client.md new file mode 100644 index 0000000..cd9339d --- /dev/null +++ b/docs/subscription/custom-client.md @@ -0,0 +1,92 @@ +--- +sidebar_position: 6 +--- + +# Custom Clients (Pro Plan) + +_This guide walks you through the steps of setting up and removing a custom client on your Hub for Professional plan subscribers._ + +**Table of Contents**\ +      [Introduction](#introduction)\ +      [Prerequisites](#prerequisites)\ +      [Part A: Set Up the Hubs Client](#part-a-set-up-the-hubs-client)\ +      [Part B: Prepare Your Custom Client Tarball](#part-b-prepare-your-custom-client-tarball)\ +      [Part C: Locate Your turkeyauthtoken](#part-c-locate-your-turkeyauthtoken)\ +      [Part D: Deploy Your Custom Client](#part-d-deploy-your-custom-client)\ +      [Removing Your Custom Client](#removing-your-custom-client) + +--- + +## Introduction + +Deploying a custom client to your Hub allows you to fully control the appearance and functionality of [the Hubs 3D engine and frontend code](https://github.com/mozilla/hubs). This feature is intended for subscribers with at least a beginner level of javascript development experience. Please be advised that deploying a custom client disables the automatic updates that the Hubs Team regularly deploys to subscription instances. You can follow our regular updates [here](https://github.com/mozilla/hubs/releases). + +If you need more assistance, we recommend following along with our [Custom Client Tutorial Video](https://www.youtube.com/watch?v=dJAy1gk5Ow0). + +## Prerequisites + +1. You must have a [Custom Domain](./setup-custom-domain.html) deployed on your Hub before you can upload a custom client. + +2. Make sure you have [docker](https://www.docker.com/) installed on your device. Testing for this feature utilized docker version `20.10.21`. + +## Part A: Set Up the Hubs Client + +1. Clone the [Hubs github repository](https://github.com/mozilla/hubs) onto your device. Users deploying custom clients to subscriptions should use the `master` branch of the repository. + +2. Install the project's node dependencies by running `npm ci`. Make sure you are using node version `16.16`. This process may take up to 30 minutes. + +3. Change directory into the folder of your project and run `npm run dev` to start a development server. Once the code has compiled, you will be able to access this development server at `localhost:8080` on your web browser. + +4. Add your customizations to the Hubs code. See the [For Developers](http://localhost:3000/docs/system-overview.html) section of these docs for information about how to get started with your customizations. + +   **Troubleshooting** + +- The backend dev server is configured with CORS to only accept connections from "hubs.local:8080", so you will need to access it from that host. To do this, you likely want to add "hubs.local" and "hubs-proxy.local" to the local "hosts" file on your computer: + +``` +127.0.0.1 hubs.local +127.0.0.1 hubs-proxy.local +``` + +## Part B: Prepare Your Custom Client Tarball + +1. Change directory to the main folder of your project, make sure you have docker opened, and run `bash retpack.sh` + +2. The code may take up to an hour to complete depending on the size of your customizations and processing power of your computer. Once complete, it will return the following message and your tarball will be located at `./.retpack/retpack.tar.gz`. + +``` +### done ### +-rw-r--r--@ 1 mozilla staff {timestamp} ./.retpack/retpack.tar.gz +``` + +   **Troubleshooting** + +- If `npm ci` fails during the build process, there are a couple of options to fix this. First, verify that you are using node version `16.16.0`. Second, if you are using a Mac computer with M1 silicon, run `export DOCKER_DEFAULT_PLATFORM=linux/amd64` before running `bash retpack.sh`. + +## Part C: Locate Your `turkeyauthtoken` + +1. Open the [developer tools](https://support.monday.com/hc/en-us/articles/360002197259-How-to-open-the-developer-console) in the subscription dashboard and navigate to the “Console” tab. + +2. Run the following code in the console to get your token: `console.log(RegExp("_turkeyauthtoken"+"=[^;]+").exec(document.cookie)[0].slice(17))` + +3. Copy the long string of characters to be used in Part D. **Please note that turkeyauthtokens are only valid for 12 hours.** + +## Part D: Deploy Your Custom Client + +_Deploying a custom client will disable the automatic updates that the Hubs Team regularly deploys to subscription instances. If you choose to use a custom client, you are responsible for keeping up with these regular updates to ensure your code is functional._ + +1. Open your terminal, and run the following command with the 3 parameters surrounded by `< >` populated with your specific information from previous steps:\ + `curl -X POST -F file='@' -H "turkeyauthtoken:" 'https:///api/ita/deploy?app=hubs'` + +2. The terminal command may take several minutes to complete depending on the quantity and nature of your customization. **Do not exit the terminal until the upload process has completed.** Once successfully complete, it will return `done, reqId: `. After a few minutes, you should see your customization on your Hub. + +3. After deploying, try to create a room to verify your customizations have taken place. If you are unable to see your customizations, email [hubs-feedback@mozilla.com](mailto:hubs-feedback@mozilla.com) with the subject line `Hubs Custom Client Deployment Troubleshooting` and a description of your problem. + +## Removing Your Custom Client + +_Removing a custom client will re-enable the automatic updates that the Hubs Team regularly deploys to subscription instances._ + +1. Open your terminal, and run the following command with the 2 parameters surrounded by `< >` populated with your specific information from previous steps:\ + `curl -X PATCH -H "turkeyauthtoken:" 'https:///api/ita/undeploy?app=hubs'` + +2. The terminal command should execute quickly and return the value `done`. After a few minutes, you should be able to access your Hub and should no longer see your customizations. diff --git a/docs/subscription/custom-domain.md b/docs/subscription/custom-domain.md new file mode 100644 index 0000000..aaff403 --- /dev/null +++ b/docs/subscription/custom-domain.md @@ -0,0 +1,73 @@ +--- +sidebar_position: 5 +--- + +# Custom Domains (Pro Plan) + +_This guide walks you through the steps of adding, updating, and removing a custom domain on your Hub. This feature is available on Professional plans._ + +**Table of Contents**\ +      [Introduction](#introduction)\ +      [Part A: Prepare Your Custom Domain](#part-a-prepare-your-custom-domain)\ +      [Part B: Locate Your turkeyauthtoken](#part-b-locate-your-turkeyauthtoken)\ +      [Part C: Connect Your Custom Domain](#part-c-connect-your-custom-domain)\ +      [Updating Your Custom Domain](#updating-your-custom-domain)\ +      [Removing Your Custom Domain](#removing-your-custom-domain) + +--- + +## Introduction + +Custom domains allow Professional Plan subscribers to improve the branding, analytics collection, and search optimization of their Hub. Be advised that, once connected, old room and scene urls may be inaccessisble. + +If you need more assistance, we recommend following along with our [Custom Domain Tutorial Video](https://youtu.be/yARtWNlmBz). + +## Part A: Prepare Your Custom Domain + +The custom domain preparation process will vary depending on the type of domain and hosting service you are using. We will update our documentation as we test the differences between services and domain types. + +**_With a CNAME Record_**\ +The easiest method to connect a custom domain to your Hub is to create a [cname](https://en.wikipedia.org/wiki/CNAME_record) record to point to `lb.`. You can identify your native host by looking at your instance's assigned url and removing the subdomain. For example, an instance assigned the url `1234567.us2.myhubs.net` would have a native host of `us2.myhubs.net` and would require a cname record point to `lb.us2.myhubs.net`. Before connecting the custom domain, you must register a cname record through your desired custom domain’s registrar, such as GoDaddy or Route53 (AWS), to point to `lb.`. We have documented this process using Route53 in [our tutorial video](https://youtu.be/0PTmHNKdZB0). + +## Part B: Locate Your `turkeyauthtoken` + +1. Open the [developer tools](https://support.monday.com/hc/en-us/articles/360002197259-How-to-open-the-developer-console) in the subscription dashboard and navigate to the “Console” tab. + +2. Run the following code in the console to get your token: `console.log(RegExp("_turkeyauthtoken"+"=[^;]+").exec(document.cookie)[0].slice(17))` + +3. Copy the long string of characters to be used in Part C. **Please note that turkeyauthtokens are only valid for 12 hours.** + +**You can alternatively go to the 'Customize your web address' section and click on the 'clipboard' icon to copy turkeyauthtoken to your clipboard** + +![image](https://github.com/MozillaReality/hubs-docs/assets/42163313/e07dfda0-bf80-4dc2-9658-e071f6d1fb95) + +## Part C: Connect Your Custom Domain + +1. Open a command terminal on your device and run the following command with the 3 parameters surrounded by `< >` replaced with your specific information from previous steps. Your Hub's native domain is the URL assigned upon creation (ex: 123456.us1.myhubs.net)\ + `curl -X PATCH -H "turkeyauthtoken:" 'https:///api/ita/custom-domain?to_domain='` + +2. The command should execute quickly and return the following message:\ + `done: [] -> []`\ + It will generally take a couple of minutes for the custom domain to be properly configured on the backend. + +## Updating Your Custom Domain + +1. In a command terminal on your device, run the following command with the 4 parameters surrounded by `< >` replaced with your specific information from previous steps:\ + `curl -X PATCH -H "turkeyauthtoken:" 'https:///api/ita/custom-domain?from_domain=&to_domain='`\ + \ + **^ Note how we have added the `from_domain` parameter to this command ^** + +2. The command should execute quickly and return the following message:\ + `done: [] -> []`\ + It will generally take a couple of minutes for the custom domain to be properly configured on the backend. + +## Removing Your Custom Domain + +1. In a command terminal on your device, run the following command with the 3 parameters surrounded by `< >` replaced with your specific information from previous steps:\ + `curl -X PATCH -H "turkeyauthtoken:" 'https:///api/ita/custom-domain?from_domain=&to_domain='`\ + \ + **^ Note how we have left the `to_domain` parameter empty in this command ^** + +2. The command should execute quickly and return the following message:\ + `done: [] -> []`\ + It will generally take a couple of minutes for the custom domain to be properly configured on the backend. diff --git a/docs/subscription/faq-subscription.md b/docs/subscription/faq-subscription.md new file mode 100644 index 0000000..39e99fc --- /dev/null +++ b/docs/subscription/faq-subscription.md @@ -0,0 +1,51 @@ +--- +sidebar_position: 7 +--- + +# Frequently Asked Questions + +### Can I have more than one Hub with my Mozilla account? + +There is currently a limit of one Hub per Mozilla account. + +### What happen's if I exceed my Hub's content storage limit? + +Your Hub's content storage limit is the total of all data associated with your Hub, largely composed of media uploaded via Spoke and the Admin Panel. You can see your cumulative storage on the subscription dashboard, which will display a warning if you exceed your subscription plan's limit. If you have exceed the storage limit, you will experience errors when attempting to upload additional media via Spoke and the Admin Panel. + +PLEASE NOTE: The data limit is not currently enforced for Hubs Personal and Professional Plan subscribers while we continue to refine tools for data management with feedback from our early adopters. + +The 503 error displayed when over ccu limit + +### I am trying to lower my content storage by deleting data, but the counter on the subscription dashboard is not updating. What am I doing wrong? + +It may take up to 3 days for your Hub to completely remove data you have manually deleted in Spoke or the Admin panel. We are also aware of bugs in the tools used to delete data, informing our decision to currently suspend enforcement of the data limit for Hubs Personal subscribers. If you experience persistent issues trying to manage or delete data, please contact us through [one of our support channels](./setup-contact.html). + +### What happens if I exceed my Hub's concurrent user limit? + +Hub servers are optimized according to the subscription plan you are subscribed to. Exceeding the optimal number of concurrent users will greatly affect the stability and performance of your hub. Most often, new users will receive a persistent 503 error when attempting to connect. + +The 503 error displayed when over ccu limit + +### What is the difference between a 'hub, a 'room', a 'space', and a 'scene'? + +A 'hub' refers to the instance of Hubs associated with your Mozilla account. It is composed of your server and the tools, rooms, worlds, and other media that exist on top of it. + +Understanding the difference between a 'room' and a 'scene' is a key concept for new users to learn while getting started with Hub. You can dive into these concepts in [this Creator Labs article](https://hubs.mozilla.com/labs/what-is-a-scene/). + +'Space' and 'scene' are used interchangably throughout our documentation. You can upload an unlimited number of spaces/scenes on your Hub, as long as your Hub's total content stays within the data limit of your subscription plan. + +### Can I downgrade from a Professional Plan to a Personal Plan? + +While it is possible to upgrade from a Personal to Professional Plan, you must cancel your Professional subscription and downgrade to a Starter plan before you can transition to a Personal Plan. + +### I know I can deploy a custom client with a professional plan. Can I also deploy a custom version of Spoke? + +While custom Spoke deployments are not currently supported, we hope to be able to enable them soon. However, we are using the [Hubs Blender Add-On](./creators-blender-components.html) to develop and expose new features for designing worlds in Hubs. We highly recommend moving your custom Spoke features to the Blender Add-On. + +### I am interested in deploying a custom client to my Hub. How can I keep up with the Hubs Team's regular releases? + +The best way to keep your custom client up to date is to follow our releases on the `master` branch of the [Hubs github repo](https://github.com/mozilla/hubs). + +### On Hubs Cloud I was able to add a google analytics key and extra CORS rules in the Admin Panel. Can I do this on the managed subscription? + +For now, it is not possible to adjust these server settings on your hubs managed subscription. diff --git a/docs/subscription/help-subscription.md b/docs/subscription/help-subscription.md new file mode 100644 index 0000000..d230669 --- /dev/null +++ b/docs/subscription/help-subscription.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 8 +--- + +# Subscription Help + +_These are the best ways to get in touch with us and the community if you need help or are interested in learning more about Hubs._ + +--- + +## Email Us + +For questions about using your account that you would prefer to discuss privately, please contact us at [hubs-feedback@mozilla.com](mailto:hubs-feedback@mozilla.com). + +## Account Support + +If you are experiencing issues with your subscription or Mozilla account, please [submit a support ticket with Mozilla Support](https://support.mozilla.org/en-US/products/hubs), Mozilla's account support channel. To submit a ticket, you should follow the blue "Get Support" buttons until you get to the support form. +

+Sumo support buttons + +## Message Us + +[Our Discord Server](https://discord.gg/hubs-498741086295031808) is the easiest place to get support with questions about using your subscription. After joining the server, you can message us in #Subscription-Help with questions about using your subscription. We also recommend posting your questions in our community channels. It is likely that other users have experience with your use-case and will be willing to help. + +Our discord server is also a fantastic place to learn more about the hubs community and to learn how to join one of our weekly public meetups! +

+Discord subscription help + +## Submit An Idea + +If you would like to share feature requests or thoughts about how to make Hubs better, please [submit an idea through Mozilla Connect](https://connect.mozilla.org/t5/ideas/idb-p/ideas/label-name/hubs). You will have to sign in to your Mozilla account and select the blue "Submit an idea" button to complete this process. +

+Mozilla Connect submit idea diff --git a/docs/subscription/managing-subscription.md b/docs/subscription/managing-subscription.md new file mode 100644 index 0000000..879823d --- /dev/null +++ b/docs/subscription/managing-subscription.md @@ -0,0 +1,282 @@ +--- +sidebar_position: 4 +--- + +# Managing Your Hub's Content + +_This page serves as a manual for many of the features that are available to Hubs subscribers to manage the content on their Hub._ + +**Table of Contents**\ +      [Introduction](#introduction)\ +      [Default Content](#default-content)\ +      [Importing and Migrating Content](#importing-and-migrating-content)\ +      [Managing Scenes and Avatars](#managing-scenes-and-avatars)\ +      [Managing Content Storage](#managing-content-storage)\ +      [Accounts and Identities](#accounts-and-identities)\ +      [Projects](#projects)\ +      [Logos and Brand Themeing | Paid Plans](#logos-and-brand-themeing--paid-plans)\ +      [App Settings](#app-settings) + +--- + +## Introduction + +This page references the two tools you can use to manage your hub's content: **The Admin Panel** and our scene editor, **Spoke**. Both can be accessed in the top-right corner of your subscription dashboard. + +Admin homepage + +**The Admin Panel** is a dashboard that allows you to control your hub's default appearance and features, as well as the discoverability of scenes and avatars uploaded to your server. When you create a new hub, the email associated with your subscription will be the only account with access to the admin panel. You can, however, allow others to access the admin panel using the [Accounts](#accounts-and-identities) tab. + +Admin homepage + +**Spoke** is our in-browser scene editor that allows you to upload media (3D models, videos, audio, images, etc.) and build custom environments that your hub's visitors can explore. By default, all users joining your server can use Spoke (and upload their own media), however you can modify this default behavior by using the [App Settings "Features" tab](#features) to toggle the "Scene Editor". + +Spoke homepage + +Together, the Admin Panel and Spoke allow you to fully control the content that users may encounter when joining your Hub. + +--- + +## Default Content + +Each new hub comes with a selection of logos, themes, scenes, and avatars that have been developed by the Mozilla Hubs team. In total, this default content consumes ~60mbs and ~220 mbs of data for the Starter and paid plans, respectively. To learn how to remove these default assets, see [Managing Data Limits](#managing-content-storage). + +**Download Paid Plan Default Assets: [Themes](/img/defaultTheme.json) | [Logos](/img/defaultLogos.zip) | [Scenes](/img/defaultScenes.pack) | [Avatars](/img/defaultAvatars.pack)** + +The default avatars +

+The default scenes + +--- + +## Importing and Migrating Content + +The Import Content tool on the Admin Panel makes it easy to share and rehost assets developed by Mozilla or other members of the Hubs community. + +Import content tab + +If you are interested in our recommended assets, please see [our asset pack suggestions](./hubs-cloud-asset-packs.html). It is also easy to find scenes and avatars on [Mozilla's Demo Hub](https://hubs.mozilla.com/Pvg5MMt/hubs-demo). While browsing scenes and avatars from the community in Mozilla's Demo Hub, you can copy the url of any shared assets and import them onto your server. + +Browsing for assets + +It is important to note that only a few url types are supported by the import tool... + +- Hosted Avatar Urls (ex. https://hubs.mozilla.com/avatars/4Ka33qb) +- Hosted Scene Urls (ex. https://hubs.mozilla.com/scenes/Rpt8DJS) +- Hosted .pack files (ex. https://raw.githubusercontent.com/mozilla/hubs-cloud/master/asset-packs/avatars-animals.pack) + +If you would like to upload .glb or .spoke files, please do so using Spoke or when creating an avatar in-world. Please note, there is a difference between a **scene URL** and a **room URL**. For more information, [see this guide](https://hubs.mozilla.com/labs/what-is-a-scene/). + +#### How to Use the "Import Content" Tool + + + +1. **Copy and paste the link(s) to the asset(s) you would like to import and select "Preview Import".** +2. **In the import preview, verify that the asset thumbnail looks correct and select any tags you would like to apply to the asset (for more on asset tags, see [Managing Scenes and Avatars - Asset Tags](#asset-tags)).** +3. **Select "Import" and wait for the assets to be rehosted.** + +--- + +## Managing Scenes and Avatars + +The Admin Panel is used to manage any scenes or avatars that have been uploaded to your hub. In the left-hand toolbar, you can see eight tabs corresponding to scenes and avatars... + +The default avatars + +Each of these tabs filters assets based on their state and tags. At the top of each tab, you can search by id or name to see if any assets are included in that category. + +The default avatars + +#### Asset State + +Asset State is the primary method of controlling a piece of media's discoverability. An asset can have any of four states... + +- Active - the asset will appear in "Approved" tab and be discoverable to users browsing in-world. +- Pending - the asset will appear in the "Pending" tab and cannot be discovered by any users. +- Delisted - the asset will only appear in "Scenes" or "Avatars" tab and cannot be discovered by any users other than the one who uploaded it. +- Removed - the asset is removed from the database and is not usable by anyone. + +An example of state + +By default, any assets uploaded by users who select "Allow Mozilla to promote my scene/avatar" in Spoke or in-world using the "Create Avatar" button will be assigned the "Pending" state and await admin approval in the "Pending" tab before being made discoverable. While "Pending", the user who uploaded the asset can still access it. + +An asset uploaded via spoke for approval + +Any assets uploaded via the admin panel are automatically assigned the "Active" state, including them in the "Approved" tab and making them discoverable to other users. + +#### Asset Tags + +Asset tags allow you to control how discoverable an "Active" asset is. To edit tags, an asset's state must be "Active", including the asset in the "Approved" tab of the admin panel. There are three tags you can add to an asset... + +- featured - The asset appears on the "Featured" tab of both the Admin Panel and when users are browsing scenes and avatars in world. +- default - A user joining as an avatar for the first time or creating a room using the "Create A Room" button will be the randomly choose from all assets with the "Default" tag. +- base (for Avatars only) - User can reskin this avatar asset with their own uploaded image. Re-skinned avatars uploaded as unique avatar assets, which can then be controlled in the admin panel. + +Asset tags are case-sensitive, so be sure to use the exact spelling and capitalization seen above. + +Examples of tags applied to avatars + +#### Asset Order + +Assets with the "Featured" tag can be given an order number to control the sequence in which they are displayed to users browsing for scenes and avatars. Order filters from low-to-high, meaning any asset with the order number "1" will be displayed first. Two assets can be given the same order number; if two assets have the same order number, the most recently uploaded asset will display first. + +Order control form + +#### Asset Description and Attribution + +To properly describe and credit creators of a certain asset, you can add in description and attribution details that will display whenever a user is encountering that asset. + +Description for assets. + +--- + +## Managing Content Storage + +As you upload content to your hub, you are adding more items to the server's database that contribute to the your hub's content storage limit. + +Content storage + +The largest contributors to content storage are media used to build environments in Spoke, as well as any avatars and scenes you have rehosted using the "import content" tool on the Admin Panel. Room urls, user accounts, and spoke projects also contribute to the usage limit, but to a lesser degree. + +In addition to regularly checking your usage limit, there are a number of features you can disable in [App Settings](#app-settings) to limit users' ability to upload files, decreasing the risk of unexpected data build-up. Specifically look at the [Features](#features) and [Room Settings](#rooms) + +You can also lower your content storage by removing unwanted assets in Spoke and the Admin Panel. PLEASE NOTE: When removing assets with the following methods, it may take up to 3-days for your subscription dashboard to update your content usage. + +#### Deleting Assets In Spoke + +Assets in Spoke are associated with individual email accounts (you will not be able to delete the assets of another user if you do not have access to their email account). + +1. **After signing-in to Spoke, go into any project and locate the assets interface in the bottom of the screen.** + +Spoke asset interface + +2. **Click on the "My Assets" tab in the lefthand toolbar. From here you can sort by asset type and right click on any asset you wish to delete. In the pop-up, click "Delete Asset" to remove it from the database.** + +Deleting assets in spoke + +#### Deleting Assets In The Admin Panel + +1. **Navigate to the "Scenes" or "Avatars" tabs in the left-hand toolbar.** +2. **Click "Edit" on any avatar or scene you wish to remove and set its State to "Removed".** + +After this is complete, you will see that the avatar has been grey-ed out and that it is no longer accessible by its avatar url. + +Deleting assets in spoke + +--- + +## Accounts and Identities + +The Accounts tab of the Admin Panel indexes all users who have signed-in to your hub with an email address. For privacy reasons, all emails are hashed to protect user data, however it is possible to search for specific email addresses to verify individual user accounts. When you edit a user's account, you have the option to make them an admin in order for them to have access to the Admin Panel. Making a user an Admin will NOT let them manage your Hubs Subscription. PLEASE NOTE: You should never remove the account using the email associated with your Mozilla account!!! + +Deleting assets in spoke + +#### Adding Admin Accounts + +If the account you wish to promote has not yet been created, use the create account form to create a new account with the user's email. + +Creating accounts by email + +If the account you wish to promote has already been created, use thefind account feature to search for the account of an individual email. + +Searching accounts by email + +1. **Select the edit button next to the account you wish to promote.** + +2. **In the pop-up, enable "is-admin" and save your settings.** + + +

+ +#### Identities + +_Identities is a deprecated method for associating an account with a username. This feature is functional, but should not be utilized._ + +--- + +## Projects + +The Projects tab allows you to moderate any Spoke projects that have been created on your server. When you expand the details of an individual project, you are also able to download a version of their .spoke file. You can also select the check-box next to a project and manually delete it. Please note that this will not delete any asset data included in the project, just the project information itself. + +Deleting assets in spoke + +--- + +## Logos and Brand Themeing | Paid Plans + +Depending on your subscription plan, your hub will allow you to customize the user interface's (UI) colors and logos. Under the "Setup" category in the Admin Panel, you can use the "Brand" tab to upload custom images. Supported file types are listed next to each logo type. + +Deleting assets in spoke + +In the "Themes" tab, you are able to upload your own JSON theme-ing object to fully customize the UI colors of your hub. For more information on updating your hub's theme, check out [this guide](./hubs-cloud-customizing-themes.html). + +Deleting assets in spoke + +--- + +## App Settings + +App Settings allow you to control the default behavior, settings, and permissions of your hub and its user interface. + +#### Translations + +| Setting | Description | +| ---------------- | --------------------------------------------------------------------------------------------------------------- | +| App Name | The application name visible on the magic link email and room sharing preview. | +| App Description | The description above the "Create Room" button on the homepage (ex. subdomain.myhubs.net/) . | +| App Tagline | The tagline underneath the company logo on scene urls. | +| Company Name | The name included in Spoke and the in-app avatar creation tool when allowing the app owner to promote an asset. | +| Share Hashtag | Hashtag included when sharing a scene to twitter. | +| Contact Email | The email listed on the static page displayed when a room owner closes the room. | +| Community Prompt | _This feature is deprecated and should not be utilized._ | + +#### Features + +| Setting | Description | +| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Account Creation | This feature prevents unpromoted users from creating accounts. This will prevent them from signing-in to Spoke and associating their email with any created rooms. | +| Terms of Use | Displays the link to the Terms of Use across the app. This includes the homepage, the Support section of the in-world settings panel, and the page displayed when a room is closed by a room owner. | +| Privacy Notice | Displays the link to the Privacy Notice on the homepage and under the Support section of the in-world settings panel. | +| Controls Links | Displays the link to Controls under the Support section of the in-world settings panel with a life-perserver logo. | +| Docs Links | Displays the link to Docs under the Support section of the in-world settings panel with a life-perserver logo and the name "Help". | +| Features Links | _This feature is deprecated and should not be utilized._ | +| Community Links | Displays the link to Community on the homepage and under the Support section of the in-world app with the Discord Logo. | +| Company Logo | Displays the Company Logo uploaded under the Brand tab on the homepage, loading screen, and in-world. | +| Issue Report Link | Displays the link to Issue Report under the search bar on the in-app scene/avatar browser and under the Support section of the in-world app with the 'i' logo. | +| Avatar Pipelines Link | Displays the link to Mozilla Hubs' avatar pipeline documentation in the in-app avatar creation tool. | +| Model Collection Link | Displays the link to Model Collection when a user attempts to upload a custom asset url in-world . | +| Powered By Hubs | Displays the "Powered By Hubs Cloud" tag on the homepage and loading screens. | +| Public Rooms | Allows non-administrators to set rooms to be public, featuring them on the homepage. | +| Homepage Room ID | Replaces the homepage with a individual room. | +| Scene Editor | Allows all users to create Spoke projects. This feature will not operate when account creation is disabled. This feature is an important method of managing data usage. | +| Lobby Ghosts | Allows users who choose "Spectate" when entering room to move throughout the space as an invisible listener. | +| Public API Access | Allows admins to create API tokens and submit requests to [the Hubs API](https://www.youtube.com/watch?v=1J84biwO_bk). | + +#### Rooms + +| Setting | Description | +| ------------------------ | --------------------------------------------------------------------------------------------------------------------------- | +| Permissive Rooms | Enables/disables all room member settings when a new room is created. | +| Room Creation | Allows non-administrators to create rooms. This can be an important feature to limit data buildup on your server. | +| Accounts for Room Access | Requires new users to sign-in before joining any room url. | +| Default Room Size | The default room size of newly created room urls. | +| Maximum Room Size | The maximum room size allowed across your application. This feature is an important tool to manage your server's CCU limit. | + +#### Links + +These URLs correspond to the links enabled in the "Features" tab of App Settings. + +#### Auth + +| Setting | Description | +| ------------------------ | ----------------------------------------------------------------- | +| Magic Link Email Subject | The subject line of magic link emails sent to users signing-in. | +| Custom Message | Customize the body of magic link emails sent to users signing-in. | diff --git a/docs/subscription/updating-subscription.md b/docs/subscription/updating-subscription.md new file mode 100644 index 0000000..f841056 --- /dev/null +++ b/docs/subscription/updating-subscription.md @@ -0,0 +1,43 @@ +--- +sidebar_position: 3 +--- + +# Updating/Cancelling Your Subscription + +_This guide walks you through the process of updating and cancelling your subscription. If you experience unexpected results at any point of the process, please refer to [the support page](./setup-contact.html) for more information._ + +**Table of Contents**\ +      [Upgrading Your Subscription](#upgrading-your-subscription)\ +      [Cancelling Your Subscription](#cancelling-your-subscription)\ +      [Requesting A Refund](#requesting-a-refund) + +--- + +## Upgrading Your Subscription + +You can easily upgrade your Starter Hub to a paid plan at any time. The easiest way is through the Upgrade button on the subscription dashboard, which will then follow the same process as [creating a new paid subscription](http://localhost:3000/docs/setup-creating.html#how-to-subscribe---paid-plans). + +The subscription dashboard + +## Cancelling Your Subscription + +You can cancel your paid Hubs subscription at any time. Cancelling your subscription will turn off auto-renew and your Hub will downgrade to [a Starter Plan](./setup-choosing.md#hubs-starter-plan--free) with a 500mb data limit when your current subscription period ends. Any data in excess of the Starter Plan limit will not be deleted, but you will not be able to upload any new media until the your storage falls below the limit. Cancelling your subscription will not delete your Mozilla account. + +1. **Visit your subscription settings on the [Mozilla accounts page](https://accounts.firefox.com/signin).** + +2. **Select "Cancel" next to your Hub's subscription information to prevent your subscription from renewing.** + +The subscription dashboard + +## Requesting A Refund + +Hubs paid subscriptions currently come with a 30-day money-back guarantee. + +1. **Please fill out [this support form](https://support.mozilla.org/en-US/users/auth?next=%2Fen-US%2Fquestions%2Fnew%2Fhubs%2Fform) to request a refund (you will need to log in with your Mozilla account to be able to submit the support form).** + +2. **Under "What do you need help with?", select "Payments & Billing".** + +3. **Enter "Refund Request" in the "Subject" and request your refund in the "Message" form. While not required, it can be helpful to include your invoice ID in this request.** + +4. **Submit the form. Expect your refund to be processed in 5-10 business days.** + The subscription dashboard diff --git a/docusaurus.config.js b/docusaurus.config.js new file mode 100644 index 0000000..57053d8 --- /dev/null +++ b/docusaurus.config.js @@ -0,0 +1,142 @@ +// @ts-check +// `@type` JSDoc annotations allow editor autocompletion and type checking +// (when paired with `@ts-check`). +// There are various equivalent ways to declare your Docusaurus config. +// See: https://docusaurus.io/docs/api/docusaurus-config + +import { themes as prismThemes } from "prism-react-renderer"; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: "Mozilla Hubs", + tagline: "Dinosaurs are cool", + favicon: "img/favicon.ico", + staticDirectories: ["static"], + // Set the production url of your site here + url: "https://your-docusaurus-site.example.com", + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: "/", + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: "facebook", // Usually your GitHub org/user name. + projectName: "docusaurus", // Usually your repo name. + + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: "en", + locales: ["en"], + }, + + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: "./sidebars.js", + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/", + }, + blog: { + showReadingTime: true, + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/", + }, + theme: { + customCss: "./src/css/custom.css", + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + // Replace with your project's social card + image: "img/docusaurus-social-card.jpg", + stylesheets: ["/css/custom.css"], + navbar: { + title: "", + logo: { + alt: "My Site Logo", + src: "img/logo-light.svg", + }, + items: [ + { + type: "docSidebar", + sidebarId: "documentation", + position: "left", + label: "Documentation", + }, + { to: "/changelog", label: "Changelog", position: "left" }, + { + href: "https://github.com/facebook/docusaurus", + label: "GitHub", + position: "right", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { + label: "Tutorial", + to: "/docs/intro", + }, + ], + }, + { + title: "Community", + items: [ + { + label: "Stack Overflow", + href: "https://stackoverflow.com/questions/tagged/docusaurus", + }, + { + label: "Discord", + href: "https://discordapp.com/invite/docusaurus", + }, + { + label: "Twitter", + href: "https://twitter.com/docusaurus", + }, + ], + }, + { + title: "More", + items: [ + { + label: "Blog", + to: "/blog", + }, + { + label: "GitHub", + href: "https://github.com/facebook/docusaurus", + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + }), +}; + +export default config; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..24e8a1c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14628 @@ +{ + "name": "hubs-docs-new", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hubs-docs-new", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/preset-classic": "3.1.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/types": "3.1.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "dependencies": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "dependencies": { + "@algolia/logger-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "dependencies": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/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/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/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/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "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.23.3", + "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.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "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-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "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.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "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.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "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.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", + "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", + "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@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-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@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-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.8.tgz", + "integrity": "sha512-2ZzmcDugdm0/YQKFVYsXiwUN7USPX8PM7cytpb4PFl87fM+qYPSvTZX//8tyeJB1j0YDmafBJEbl5f8NfLyuKw==", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==" + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.0.tgz", + "integrity": "sha512-GWudMGYA9v26ssbAWJNfgeDZk+lrudUTclLPRsmxiknEBk7UMp7Rglonhqbsf3IKHOyHkMU4Fr5jFyg5SBx9jQ==", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.5.1", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^4.2.2", + "cssnano": "^5.1.15", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.0.tgz", + "integrity": "sha512-ned7qsgCqSv/e7KyugFNroAfiszuxLwnvMW7gmT2Ywxb/Nyt61yIw7KHyAZCMKglOalrqnYA4gMhLUCK/mVePA==", + "dependencies": { + "cssnano-preset-advanced": "^5.3.10", + "postcss": "^8.4.26", + "postcss-sort-media-queries": "^4.4.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.0.tgz", + "integrity": "sha512-p740M+HCst1VnKKzL60Hru9xfG4EUYJDarjlEC4hHeBy9+afPmY3BNPoSHx9/8zxuYfUlv/psf7I9NvRVdmdvg==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.0.tgz", + "integrity": "sha512-D7onDz/3mgBonexWoQXPw3V2E5Bc4+jYRf9gGUUK+KoQwU8xMDaDkUUfsr7t6UBa/xox9p5+/3zwLuXOYMzGSg==", + "dependencies": { + "@babel/parser": "^7.22.7", + "@babel/traverse": "^7.22.8", + "@docusaurus/logger": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.0.tgz", + "integrity": "sha512-XUl7Z4PWlKg4l6KF05JQ3iDHQxnPxbQUqTNKvviHyuHdlalOFv6qeDAm7IbzyQPJD5VA6y4dpRbTWSqP9ClwPg==", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "3.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.0.tgz", + "integrity": "sha512-iMa6WBaaEdYuxckvJtLcq/HQdlA4oEbCXf/OFfsYJCCULcDX7GDZpKxLF3X1fLsax3sSm5bmsU+CA0WD+R1g3A==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.0.tgz", + "integrity": "sha512-el5GxhT8BLrsWD0qGa8Rq+Ttb/Ni6V3DGT2oAPio0qcs/mUAxeyXEAmihkvmLCnAgp6xD27Ce7dISZ5c6BXeqA==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.0.tgz", + "integrity": "sha512-9gntYQFpk+93+Xl7gYczJu8I9uWoyRLnRwS0+NUFcs9iZtHKsdqKWPRrONC9elfN3wJ9ORwTbcVzsTiB8jvYlg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.0.tgz", + "integrity": "sha512-AbvJwCVRbmQ8w9d8QXbF4Iq/ui0bjPZNYFIhtducGFnm2YQRN1mraK8mCEQb0Aq0T8SqRRvSfC/far4n/s531w==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.0.tgz", + "integrity": "sha512-zvUOMzu9Uhz0ciqnSbtnp/5i1zEYlzarQrOXG90P3Is3efQI43p2YLW/rzSGdLb5MfQo2HvKT6Q5+tioMO045Q==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.0.tgz", + "integrity": "sha512-0txshvaY8qIBdkk2UATdVcfiCLGq3KAUfuRQD2cRNgO39iIf4/ihQxH9NXcRTwKs4Q5d9yYHoix3xT6pFuEYOg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.0.tgz", + "integrity": "sha512-zOWPEi8kMyyPtwG0vhyXrdbLs8fIZmY5vlbi9lUU+v8VsroO5iHmfR2V3SMsrsfOanw5oV/ciWqbxezY00qEZg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.0.tgz", + "integrity": "sha512-TkR5vGBpUooEB9SoW42thahqqwKzfHrQQhkB+JrEGERsl4bKODSuJNle4aA4h6LSkg4IyfXOW8XOI0NIPWb9Cg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.0.tgz", + "integrity": "sha512-xGLQRFmmT9IinAGUDVRYZ54Ys28USNbA3OTXQXnSJLPr1rCY7CYnHI4XoOnKWrNnDiAI4ruMzunXWyaElUYCKQ==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/plugin-debug": "3.1.0", + "@docusaurus/plugin-google-analytics": "3.1.0", + "@docusaurus/plugin-google-gtag": "3.1.0", + "@docusaurus/plugin-google-tag-manager": "3.1.0", + "@docusaurus/plugin-sitemap": "3.1.0", + "@docusaurus/theme-classic": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-search-algolia": "3.1.0", + "@docusaurus/types": "3.1.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.0.tgz", + "integrity": "sha512-/+jMl2Z9O8QQxves5AtHdt91gWsEZFgOV3La/6eyKEd7QLqQUtM5fxEJ40rq9NKYjqCd1HzZ9egIMeJoWwillw==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-translations": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.0.tgz", + "integrity": "sha512-YGwEFALLIbF5ocW/Fy6Ae7tFWUOugEN3iwxTx8UkLAcLqYUboDSadesYtVBmRCEB4FVA2qoP7YaW3lu3apUPPw==", + "dependencies": { + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.0.tgz", + "integrity": "sha512-8cJH0ZhPsEDjq3jR3I+wHmWzVY2bXMQJ59v2QxUmsTZxbWA4u+IzccJMIJx4ooFl9J6iYynwYsFuHxyx/KUmfQ==", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-translations": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.0.tgz", + "integrity": "sha512-DApE4AbDI+WBajihxB54L4scWQhVGNZAochlC9fkbciPuFAgdRBD3NREb0rgfbKexDC/rioppu/WJA0u8tS+yA==", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-LgZfp0D+UBqAh7PZ//MUNSFBMavmAPku6Si9x8x3V+S318IGCNJ6hUr2O29UO0oLybEWUjD5Jnj9IUN6XyZeeg==", + "dependencies": { + "@docusaurus/logger": "3.1.0", + "@svgr/webpack": "^6.5.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.0.tgz", + "integrity": "sha512-SfvnRLHoZ9bwTw67knkSs7IcUR0GY2SaGkpdB/J9pChrDiGhwzKNUhcieoPyPYrOWGRPk3rVNYtoy+Bc7psPAw==", + "dependencies": { + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.0.tgz", + "integrity": "sha512-dFxhs1NLxPOSzmcTk/eeKxLY5R+U4cua22g9MsAMiRWcwFKStZ2W3/GDY0GmnJGqNS8QAQepJrxQoyxXkJNDeg==", + "dependencies": { + "@docusaurus/logger": "3.1.0", + "@docusaurus/utils": "3.1.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz", + "integrity": "sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.0.tgz", + "integrity": "sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "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/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz", + "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", + "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==" + }, + "node_modules/@types/hast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", + "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz", + "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.10.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.8.tgz", + "integrity": "sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prismjs": { + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", + "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/react": { + "version": "18.2.47", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.47.tgz", + "integrity": "sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz", + "integrity": "sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "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-polyfill-corejs2": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "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==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "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/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/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/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "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/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001576", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz", + "integrity": "sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/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/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/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/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/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/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/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/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/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/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "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/copy-webpack-plugin/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/core-js": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", + "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "dependencies": { + "browserslist": "^4.22.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.0.tgz", + "integrity": "sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-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.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.0.tgz", + "integrity": "sha512-3I5Nu4ytWlHvOP6zItjiHlefBNtrH+oehq8tnQa2kO305qpVyx9XNIT1CXIj5bgCJs7qICBCkgCYxQLKPANoLA==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.31", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.1.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/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/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/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/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.627", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.627.tgz", + "integrity": "sha512-BPFdHKPzyGxYQpgiCoIGnkzlMlps3bRdnjeh3qd/Q2pSacL0YW81i4llqsTY/wNbN/Ztw++7HNfp8v4Rm8VDuA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "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/emoticon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", + "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "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/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "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-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.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/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", + "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", + "dependencies": { + "@types/estree": "^1.0.0", + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "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/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/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/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "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": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "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==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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-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==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "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/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/file-loader/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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/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==" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.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/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/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/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/fork-ts-checker-webpack-plugin/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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "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/gray-matter/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/gray-matter/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/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "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/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", + "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", + "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", + "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", + "dependencies": { + "inline-style-parser": "0.2.2" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "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/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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/hpack.js/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/hpack.js/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/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "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/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "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/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "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/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.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": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "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-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "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-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "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/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "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/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", + "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", + "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "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/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", + "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz", + "integrity": "sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "engines": { + "node": ">=10" + } + }, + "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/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "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": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "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-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "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/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "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/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz", + "integrity": "sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "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-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "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/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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": "6.4.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", + "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "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-json-view-lite": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz", + "integrity": "sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "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": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz", + "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", + "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "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/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/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/renderkid/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/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "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-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "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/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "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/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" + }, + "node_modules/rtlcss": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", + "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.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.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "peer": true + }, + "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/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/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/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "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/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "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/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/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "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/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/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/svgo/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/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/terser-webpack-plugin/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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/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==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "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/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "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-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "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.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/url-loader/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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/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==" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "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/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", + "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/webpack/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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/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==" + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "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/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9e082d9 --- /dev/null +++ b/package.json @@ -0,0 +1,44 @@ +{ + "name": "hubs-docs-new", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/preset-classic": "3.1.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/types": "3.1.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/sidebars.js b/sidebars.js new file mode 100644 index 0000000..e08281b --- /dev/null +++ b/sidebars.js @@ -0,0 +1,83 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + //tutorialSidebar: [{ type: "autogenerated", dirName: "." }], + // But you can create a sidebar manually + documentation: [ + { + type: "category", + label: "Introduction", + items: [ + { + type: "autogenerated", + dirName: "introduction", + }, + ], + }, + { + type: "category", + label: "Hubs Subscription", + items: [ + { + type: "autogenerated", + dirName: "subscription", + }, + ], + }, + { + type: "category", + label: "Hubs Fundamentals", + items: [ + { + type: "autogenerated", + dirName: "fundamentals", + }, + ], + }, + { + type: "category", + label: "For Creators", + items: [ + { + type: "autogenerated", + dirName: "creators", + }, + ], + }, + { + type: "category", + label: "For Developers", + items: [ + { + type: "autogenerated", + dirName: "developers", + }, + ], + }, + { + type: "category", + label: "Documentation Archive", + items: [ + { + type: "autogenerated", + dirName: "archive", + }, + ], + }, + ], +}; + +export default sidebars; diff --git a/src/components/HomepageFeatures/index.js b/src/components/HomepageFeatures/index.js new file mode 100644 index 0000000..81aac2f --- /dev/null +++ b/src/components/HomepageFeatures/index.js @@ -0,0 +1,64 @@ +import clsx from "clsx"; +import Heading from "@theme/Heading"; +import styles from "./styles.module.css"; + +// const FeatureList = [ +// { +// title: 'Easy to Use', +// Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, +// description: ( +// <> +// Docusaurus was designed from the ground up to be easily installed and +// used to get your website up and running quickly. +// +// ), +// }, +// { +// title: 'Focus on What Matters', +// Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, +// description: ( +// <> +// Docusaurus lets you focus on your docs, and we'll do the chores. Go +// ahead and move your docs into the docs directory. +// +// ), +// }, +// { +// title: 'Powered by React', +// Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, +// description: ( +// <> +// Extend or customize your website layout by reusing React. Docusaurus can +// be extended while reusing the same header and footer. +// +// ), +// }, +// ]; + +function Feature({ Svg, title, description }) { + return ( +
+
+ +
+
+ {title} +

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 0000000..b248eb2 --- /dev/null +++ b/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 0000000..e304d46 --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,40 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #1700c7; + --ifm-color-primary-dark: #1500b3; + --ifm-color-primary-darker: #1400a9; + --ifm-color-primary-darkest: #10008b; + --ifm-color-primary-light: #1900db; + --ifm-color-primary-lighter: #1a00e5; + --ifm-color-primary-lightest: #2104ff; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #a299f7; + --ifm-color-primary-dark: #8074f4; + --ifm-color-primary-darker: #6f61f3; + --ifm-color-primary-darkest: #5e4ff1; + --ifm-color-primary-light: #c4befa; + --ifm-color-primary-lighter: #d5d1fb; + --ifm-color-primary-lightest: #ffffff; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} + +.navbar__brand img { + content: url('/img/logo-light.svg'); +} + +@media (prefers-color-scheme: dark) { + .navbar__brand img { + content: url('/img/logo-dark.svg'); + } +} \ No newline at end of file diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 0000000..a8c61f2 --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,43 @@ +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; + +import Heading from '@theme/Heading'; +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+ + {siteConfig.title} + +

{siteConfig.tagline}

+
+ + Docusaurus Tutorial - 5min ⏱️ + +
+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/src/pages/index.module.css b/src/pages/index.module.css new file mode 100644 index 0000000..9f71a5d --- /dev/null +++ b/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md new file mode 100644 index 0000000..9756c5b --- /dev/null +++ b/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/static/.nojekyll b/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/static/img/503-error.png b/static/img/503-error.png new file mode 100644 index 0000000..12841fc Binary files /dev/null and b/static/img/503-error.png differ diff --git a/static/img/BlenderAnimationStash.jpg b/static/img/BlenderAnimationStash.jpg new file mode 100644 index 0000000..87d0f49 Binary files /dev/null and b/static/img/BlenderAnimationStash.jpg differ diff --git a/static/img/BlenderShaderBackground.mp4 b/static/img/BlenderShaderBackground.mp4 new file mode 100644 index 0000000..e4363a3 Binary files /dev/null and b/static/img/BlenderShaderBackground.mp4 differ diff --git a/static/img/BlenderShaderBackground2.mp4 b/static/img/BlenderShaderBackground2.mp4 new file mode 100644 index 0000000..9ced489 Binary files /dev/null and b/static/img/BlenderShaderBackground2.mp4 differ diff --git a/static/img/BlenderSplash.jpg b/static/img/BlenderSplash.jpg new file mode 100644 index 0000000..70a8c65 Binary files /dev/null and b/static/img/BlenderSplash.jpg differ diff --git a/static/img/CoastalCliffHouseShot1.jpg b/static/img/CoastalCliffHouseShot1.jpg new file mode 100644 index 0000000..ad99c05 Binary files /dev/null and b/static/img/CoastalCliffHouseShot1.jpg differ diff --git a/static/img/CoastalCliffHouseShot2.jpg b/static/img/CoastalCliffHouseShot2.jpg new file mode 100644 index 0000000..6b6c81e Binary files /dev/null and b/static/img/CoastalCliffHouseShot2.jpg differ diff --git a/static/img/FloorPlan.png b/static/img/FloorPlan.png new file mode 100644 index 0000000..32d11b4 Binary files /dev/null and b/static/img/FloorPlan.png differ diff --git a/static/img/HelloWebXRscene.jpg b/static/img/HelloWebXRscene.jpg new file mode 100644 index 0000000..b09d48b Binary files /dev/null and b/static/img/HelloWebXRscene.jpg differ diff --git a/static/img/PandaBot.jpg b/static/img/PandaBot.jpg new file mode 100644 index 0000000..df68628 Binary files /dev/null and b/static/img/PandaBot.jpg differ diff --git a/static/img/UVLayout.jpg b/static/img/UVLayout.jpg new file mode 100644 index 0000000..94dc934 Binary files /dev/null and b/static/img/UVLayout.jpg differ diff --git a/static/img/access-dashboard.png b/static/img/access-dashboard.png new file mode 100644 index 0000000..d6033ba Binary files /dev/null and b/static/img/access-dashboard.png differ diff --git a/static/img/accounts-screen.png b/static/img/accounts-screen.png new file mode 100644 index 0000000..4dcb60b Binary files /dev/null and b/static/img/accounts-screen.png differ diff --git a/static/img/admin-tabs.png b/static/img/admin-tabs.png new file mode 100644 index 0000000..34e6c5f Binary files /dev/null and b/static/img/admin-tabs.png differ diff --git a/static/img/admin.png b/static/img/admin.png new file mode 100644 index 0000000..7152489 Binary files /dev/null and b/static/img/admin.png differ diff --git a/static/img/architecture-kit.mp4 b/static/img/architecture-kit.mp4 new file mode 100644 index 0000000..4f3cca0 Binary files /dev/null and b/static/img/architecture-kit.mp4 differ diff --git a/static/img/asset-description.png b/static/img/asset-description.png new file mode 100644 index 0000000..f089dc9 Binary files /dev/null and b/static/img/asset-description.png differ diff --git a/static/img/assetPacks_avatars_astronauts-dark_600x200.png b/static/img/assetPacks_avatars_astronauts-dark_600x200.png new file mode 100644 index 0000000..0e94981 Binary files /dev/null and b/static/img/assetPacks_avatars_astronauts-dark_600x200.png differ diff --git a/static/img/assetPacks_avatars_astronauts-light_600x200.png b/static/img/assetPacks_avatars_astronauts-light_600x200.png new file mode 100644 index 0000000..ad25a39 Binary files /dev/null and b/static/img/assetPacks_avatars_astronauts-light_600x200.png differ diff --git a/static/img/assetPacks_avatars_bobbleheads_600x200.png b/static/img/assetPacks_avatars_bobbleheads_600x200.png new file mode 100644 index 0000000..e592f79 Binary files /dev/null and b/static/img/assetPacks_avatars_bobbleheads_600x200.png differ diff --git a/static/img/assetPacks_avatars_boxbots_600x200.png b/static/img/assetPacks_avatars_boxbots_600x200.png new file mode 100644 index 0000000..b352f8e Binary files /dev/null and b/static/img/assetPacks_avatars_boxbots_600x200.png differ diff --git a/static/img/assetPacks_avatars_clothedRobots_600x200.png b/static/img/assetPacks_avatars_clothedRobots_600x200.png new file mode 100644 index 0000000..f075fbf Binary files /dev/null and b/static/img/assetPacks_avatars_clothedRobots_600x200.png differ diff --git a/static/img/assetPacks_avatars_colorRobots_600x200.png b/static/img/assetPacks_avatars_colorRobots_600x200.png new file mode 100644 index 0000000..40a6985 Binary files /dev/null and b/static/img/assetPacks_avatars_colorRobots_600x200.png differ diff --git a/static/img/assetPacks_avatars_graduationRobots_600x200.png b/static/img/assetPacks_avatars_graduationRobots_600x200.png new file mode 100644 index 0000000..2429c76 Binary files /dev/null and b/static/img/assetPacks_avatars_graduationRobots_600x200.png differ diff --git a/static/img/assetPacks_avatars_hackweek_600x200.png b/static/img/assetPacks_avatars_hackweek_600x200.png new file mode 100644 index 0000000..0716530 Binary files /dev/null and b/static/img/assetPacks_avatars_hackweek_600x200.png differ diff --git a/static/img/assetPacks_avatars_stylizedHumanGraduates_600x200.png b/static/img/assetPacks_avatars_stylizedHumanGraduates_600x200.png new file mode 100644 index 0000000..97e8ac9 Binary files /dev/null and b/static/img/assetPacks_avatars_stylizedHumanGraduates_600x200.png differ diff --git a/static/img/assetPacks_avatars_stylizedRobots_600x200.png b/static/img/assetPacks_avatars_stylizedRobots_600x200.png new file mode 100644 index 0000000..f95f3db Binary files /dev/null and b/static/img/assetPacks_avatars_stylizedRobots_600x200.png differ diff --git a/static/img/assetPacks_scenes_HAIR1Scenes_600x200.png b/static/img/assetPacks_scenes_HAIR1Scenes_600x200.png new file mode 100644 index 0000000..f7bdeb2 Binary files /dev/null and b/static/img/assetPacks_scenes_HAIR1Scenes_600x200.png differ diff --git a/static/img/assetPacks_scenes_eventScenes_600x200.png b/static/img/assetPacks_scenes_eventScenes_600x200.png new file mode 100644 index 0000000..b9ff10c Binary files /dev/null and b/static/img/assetPacks_scenes_eventScenes_600x200.png differ diff --git a/static/img/assetPacks_scenes_eventStarterPack_600x200.png b/static/img/assetPacks_scenes_eventStarterPack_600x200.png new file mode 100644 index 0000000..c86b366 Binary files /dev/null and b/static/img/assetPacks_scenes_eventStarterPack_600x200.png differ diff --git a/static/img/assetPacks_scenes_galleryScenes_600x200.png b/static/img/assetPacks_scenes_galleryScenes_600x200.png new file mode 100644 index 0000000..96de19a Binary files /dev/null and b/static/img/assetPacks_scenes_galleryScenes_600x200.png differ diff --git a/static/img/assetPacks_scenes_meetingScenes_600x200.png b/static/img/assetPacks_scenes_meetingScenes_600x200.png new file mode 100644 index 0000000..03fd1f4 Binary files /dev/null and b/static/img/assetPacks_scenes_meetingScenes_600x200.png differ diff --git a/static/img/assetPacks_scenes_scenicScenes_600x200.png b/static/img/assetPacks_scenes_scenicScenes_600x200.png new file mode 100644 index 0000000..d4242de Binary files /dev/null and b/static/img/assetPacks_scenes_scenicScenes_600x200.png differ diff --git a/static/img/assetPacks_scenes_socialHangoutScenes_600x200.png b/static/img/assetPacks_scenes_socialHangoutScenes_600x200.png new file mode 100644 index 0000000..886df7b Binary files /dev/null and b/static/img/assetPacks_scenes_socialHangoutScenes_600x200.png differ diff --git a/static/img/audio-zones-example-0.jpg b/static/img/audio-zones-example-0.jpg new file mode 100644 index 0000000..1531235 Binary files /dev/null and b/static/img/audio-zones-example-0.jpg differ diff --git a/static/img/audio-zones-example-1.jpg b/static/img/audio-zones-example-1.jpg new file mode 100644 index 0000000..cb9d6d5 Binary files /dev/null and b/static/img/audio-zones-example-1.jpg differ diff --git a/static/img/audio-zones-example-2.jpg b/static/img/audio-zones-example-2.jpg new file mode 100644 index 0000000..11787de Binary files /dev/null and b/static/img/audio-zones-example-2.jpg differ diff --git a/static/img/audio-zones-example-3.jpg b/static/img/audio-zones-example-3.jpg new file mode 100644 index 0000000..7fd55f3 Binary files /dev/null and b/static/img/audio-zones-example-3.jpg differ diff --git a/static/img/avatar-customization.jpeg b/static/img/avatar-customization.jpeg new file mode 100644 index 0000000..73b30da Binary files /dev/null and b/static/img/avatar-customization.jpeg differ diff --git a/static/img/avatarHeight.jpg b/static/img/avatarHeight.jpg new file mode 100644 index 0000000..513de4d Binary files /dev/null and b/static/img/avatarHeight.jpg differ diff --git a/static/img/avatars_animals_600x200.png b/static/img/avatars_animals_600x200.png new file mode 100644 index 0000000..1b5ade9 Binary files /dev/null and b/static/img/avatars_animals_600x200.png differ diff --git a/static/img/avatars_food_600x200.png b/static/img/avatars_food_600x200.png new file mode 100644 index 0000000..4e16347 Binary files /dev/null and b/static/img/avatars_food_600x200.png differ diff --git a/static/img/avatars_retroTech_600x200.png b/static/img/avatars_retroTech_600x200.png new file mode 100644 index 0000000..dbf4bcd Binary files /dev/null and b/static/img/avatars_retroTech_600x200.png differ diff --git a/static/img/avatars_telepresenceRobot1_colors_600x200.png b/static/img/avatars_telepresenceRobot1_colors_600x200.png new file mode 100644 index 0000000..24cb290 Binary files /dev/null and b/static/img/avatars_telepresenceRobot1_colors_600x200.png differ diff --git a/static/img/avatars_telepresenceRobot2_colors_600x200.png b/static/img/avatars_telepresenceRobot2_colors_600x200.png new file mode 100644 index 0000000..2987787 Binary files /dev/null and b/static/img/avatars_telepresenceRobot2_colors_600x200.png differ diff --git a/static/img/avatars_telepresenceRobot3_colors_600x200.png b/static/img/avatars_telepresenceRobot3_colors_600x200.png new file mode 100644 index 0000000..ce52460 Binary files /dev/null and b/static/img/avatars_telepresenceRobot3_colors_600x200.png differ diff --git a/static/img/box-bot-examples.jpeg b/static/img/box-bot-examples.jpeg new file mode 100644 index 0000000..d2bb268 Binary files /dev/null and b/static/img/box-bot-examples.jpeg differ diff --git a/static/img/browsing-assets.png b/static/img/browsing-assets.png new file mode 100644 index 0000000..f6df45f Binary files /dev/null and b/static/img/browsing-assets.png differ diff --git a/static/img/business.jpeg b/static/img/business.jpeg new file mode 100644 index 0000000..78afd3f Binary files /dev/null and b/static/img/business.jpeg differ diff --git a/static/img/change-the-scene.mp4 b/static/img/change-the-scene.mp4 new file mode 100644 index 0000000..8923c51 Binary files /dev/null and b/static/img/change-the-scene.mp4 differ diff --git a/static/img/click-subscribe-free.mp4 b/static/img/click-subscribe-free.mp4 new file mode 100644 index 0000000..bd6d55f Binary files /dev/null and b/static/img/click-subscribe-free.mp4 differ diff --git a/static/img/click-subscribe.mp4 b/static/img/click-subscribe.mp4 new file mode 100644 index 0000000..7f21a8c Binary files /dev/null and b/static/img/click-subscribe.mp4 differ diff --git a/static/img/components_UVscroll_01.gif b/static/img/components_UVscroll_01.gif new file mode 100644 index 0000000..5ee8fca Binary files /dev/null and b/static/img/components_UVscroll_01.gif differ diff --git a/static/img/components_UVscroll_02.gif b/static/img/components_UVscroll_02.gif new file mode 100644 index 0000000..758865f Binary files /dev/null and b/static/img/components_UVscroll_02.gif differ diff --git a/static/img/components_ambientLight_01.png b/static/img/components_ambientLight_01.png new file mode 100644 index 0000000..9baf960 Binary files /dev/null and b/static/img/components_ambientLight_01.png differ diff --git a/static/img/components_ammoShape_01.png b/static/img/components_ammoShape_01.png new file mode 100644 index 0000000..76dc315 Binary files /dev/null and b/static/img/components_ammoShape_01.png differ diff --git a/static/img/components_audioParams_01.png b/static/img/components_audioParams_01.png new file mode 100644 index 0000000..f5a24a0 Binary files /dev/null and b/static/img/components_audioParams_01.png differ diff --git a/static/img/components_audioSettings.png b/static/img/components_audioSettings.png new file mode 100644 index 0000000..ee38426 Binary files /dev/null and b/static/img/components_audioSettings.png differ diff --git a/static/img/components_audioSource_01.png b/static/img/components_audioSource_01.png new file mode 100644 index 0000000..56b61a2 Binary files /dev/null and b/static/img/components_audioSource_01.png differ diff --git a/static/img/components_audioSource_02.png b/static/img/components_audioSource_02.png new file mode 100644 index 0000000..aa6b325 Binary files /dev/null and b/static/img/components_audioSource_02.png differ diff --git a/static/img/components_audioTarget_01.png b/static/img/components_audioTarget_01.png new file mode 100644 index 0000000..93270ee Binary files /dev/null and b/static/img/components_audioTarget_01.png differ diff --git a/static/img/components_audioTarget_02.png b/static/img/components_audioTarget_02.png new file mode 100644 index 0000000..b59e975 Binary files /dev/null and b/static/img/components_audioTarget_02.png differ diff --git a/static/img/components_audio_01.png b/static/img/components_audio_01.png new file mode 100644 index 0000000..387e3bc Binary files /dev/null and b/static/img/components_audio_01.png differ diff --git a/static/img/components_billboard.gif b/static/img/components_billboard.gif new file mode 100644 index 0000000..fd97c35 Binary files /dev/null and b/static/img/components_billboard.gif differ diff --git a/static/img/components_billboard_only-Y.png b/static/img/components_billboard_only-Y.png new file mode 100644 index 0000000..5631d8d Binary files /dev/null and b/static/img/components_billboard_only-Y.png differ diff --git a/static/img/components_directionalLight_01.png b/static/img/components_directionalLight_01.png new file mode 100644 index 0000000..5a94b71 Binary files /dev/null and b/static/img/components_directionalLight_01.png differ diff --git a/static/img/components_directionalLight_02.png b/static/img/components_directionalLight_02.png new file mode 100644 index 0000000..354cce1 Binary files /dev/null and b/static/img/components_directionalLight_02.png differ diff --git a/static/img/components_environmentSettings_01.png b/static/img/components_environmentSettings_01.png new file mode 100644 index 0000000..3197f5d Binary files /dev/null and b/static/img/components_environmentSettings_01.png differ diff --git a/static/img/components_environmentSettings_02.png b/static/img/components_environmentSettings_02.png new file mode 100644 index 0000000..80c02d5 Binary files /dev/null and b/static/img/components_environmentSettings_02.png differ diff --git a/static/img/components_fog.png b/static/img/components_fog.png new file mode 100644 index 0000000..a3ae751 Binary files /dev/null and b/static/img/components_fog.png differ diff --git a/static/img/components_frustum_01.png b/static/img/components_frustum_01.png new file mode 100644 index 0000000..09f86ea Binary files /dev/null and b/static/img/components_frustum_01.png differ diff --git a/static/img/components_hemisphereLight_01.png b/static/img/components_hemisphereLight_01.png new file mode 100644 index 0000000..6431404 Binary files /dev/null and b/static/img/components_hemisphereLight_01.png differ diff --git a/static/img/components_image-spherical.gif b/static/img/components_image-spherical.gif new file mode 100644 index 0000000..d9e5de4 Binary files /dev/null and b/static/img/components_image-spherical.gif differ diff --git a/static/img/components_imageControls.png b/static/img/components_imageControls.png new file mode 100644 index 0000000..23a1c54 Binary files /dev/null and b/static/img/components_imageControls.png differ diff --git a/static/img/components_image_01.png b/static/img/components_image_01.png new file mode 100644 index 0000000..b97de9c Binary files /dev/null and b/static/img/components_image_01.png differ diff --git a/static/img/components_link_01.gif b/static/img/components_link_01.gif new file mode 100644 index 0000000..bdf3cbb Binary files /dev/null and b/static/img/components_link_01.gif differ diff --git a/static/img/components_link_02.png b/static/img/components_link_02.png new file mode 100644 index 0000000..9bcb77c Binary files /dev/null and b/static/img/components_link_02.png differ diff --git a/static/img/components_loopAnimation_01.gif b/static/img/components_loopAnimation_01.gif new file mode 100644 index 0000000..84969d3 Binary files /dev/null and b/static/img/components_loopAnimation_01.gif differ diff --git a/static/img/components_loopAnimation_02.gif b/static/img/components_loopAnimation_02.gif new file mode 100644 index 0000000..322ffff Binary files /dev/null and b/static/img/components_loopAnimation_02.gif differ diff --git a/static/img/components_mediaFrame.gif b/static/img/components_mediaFrame.gif new file mode 100644 index 0000000..40c9253 Binary files /dev/null and b/static/img/components_mediaFrame.gif differ diff --git a/static/img/components_mediaFrame_01.png b/static/img/components_mediaFrame_01.png new file mode 100644 index 0000000..7f2ba66 Binary files /dev/null and b/static/img/components_mediaFrame_01.png differ diff --git a/static/img/components_model.gif b/static/img/components_model.gif new file mode 100644 index 0000000..9c7044c Binary files /dev/null and b/static/img/components_model.gif differ diff --git a/static/img/components_morphAudioFeedback_01.png b/static/img/components_morphAudioFeedback_01.png new file mode 100644 index 0000000..c8d49ae Binary files /dev/null and b/static/img/components_morphAudioFeedback_01.png differ diff --git a/static/img/components_morphAudioFeedback_avatarExample.gif b/static/img/components_morphAudioFeedback_avatarExample.gif new file mode 100644 index 0000000..3c638ed Binary files /dev/null and b/static/img/components_morphAudioFeedback_avatarExample.gif differ diff --git a/static/img/components_morphAudioFeedback_scrub.gif b/static/img/components_morphAudioFeedback_scrub.gif new file mode 100644 index 0000000..78ab13d Binary files /dev/null and b/static/img/components_morphAudioFeedback_scrub.gif differ diff --git a/static/img/components_navigationMesh_01.png b/static/img/components_navigationMesh_01.png new file mode 100644 index 0000000..9a157e5 Binary files /dev/null and b/static/img/components_navigationMesh_01.png differ diff --git a/static/img/components_particleEmitter_01.gif b/static/img/components_particleEmitter_01.gif new file mode 100644 index 0000000..d9a172e Binary files /dev/null and b/static/img/components_particleEmitter_01.gif differ diff --git a/static/img/components_particleEmitter_02.png b/static/img/components_particleEmitter_02.png new file mode 100644 index 0000000..34200b2 Binary files /dev/null and b/static/img/components_particleEmitter_02.png differ diff --git a/static/img/components_particleEmitter_03.png b/static/img/components_particleEmitter_03.png new file mode 100644 index 0000000..5f2eab3 Binary files /dev/null and b/static/img/components_particleEmitter_03.png differ diff --git a/static/img/components_personalSpaceInvader_01.gif b/static/img/components_personalSpaceInvader_01.gif new file mode 100644 index 0000000..724ee80 Binary files /dev/null and b/static/img/components_personalSpaceInvader_01.gif differ diff --git a/static/img/components_pointLight_01.png b/static/img/components_pointLight_01.png new file mode 100644 index 0000000..007db42 Binary files /dev/null and b/static/img/components_pointLight_01.png differ diff --git a/static/img/components_pointLight_02.png b/static/img/components_pointLight_02.png new file mode 100644 index 0000000..fed10a4 Binary files /dev/null and b/static/img/components_pointLight_02.png differ diff --git a/static/img/components_reflectionProbe_01.png b/static/img/components_reflectionProbe_01.png new file mode 100644 index 0000000..43e9401 Binary files /dev/null and b/static/img/components_reflectionProbe_01.png differ diff --git a/static/img/components_scaleAudioFeedback_avatarExample.gif b/static/img/components_scaleAudioFeedback_avatarExample.gif new file mode 100644 index 0000000..402d21f Binary files /dev/null and b/static/img/components_scaleAudioFeedback_avatarExample.gif differ diff --git a/static/img/components_shadow.gif b/static/img/components_shadow.gif new file mode 100644 index 0000000..8720d71 Binary files /dev/null and b/static/img/components_shadow.gif differ diff --git a/static/img/components_simpleWater.png b/static/img/components_simpleWater.png new file mode 100644 index 0000000..3ca9a31 Binary files /dev/null and b/static/img/components_simpleWater.png differ diff --git a/static/img/components_simpleWater_02.gif b/static/img/components_simpleWater_02.gif new file mode 100644 index 0000000..fc5aa2c Binary files /dev/null and b/static/img/components_simpleWater_02.gif differ diff --git a/static/img/components_spawner2.gif b/static/img/components_spawner2.gif new file mode 100644 index 0000000..d7e5cb9 Binary files /dev/null and b/static/img/components_spawner2.gif differ diff --git a/static/img/components_spotLight_01.png b/static/img/components_spotLight_01.png new file mode 100644 index 0000000..6de0535 Binary files /dev/null and b/static/img/components_spotLight_01.png differ diff --git a/static/img/components_spotLight_02.png b/static/img/components_spotLight_02.png new file mode 100644 index 0000000..8665f97 Binary files /dev/null and b/static/img/components_spotLight_02.png differ diff --git a/static/img/components_text_01.png b/static/img/components_text_01.png new file mode 100644 index 0000000..69503e3 Binary files /dev/null and b/static/img/components_text_01.png differ diff --git a/static/img/components_text_02.png b/static/img/components_text_02.png new file mode 100644 index 0000000..be44751 Binary files /dev/null and b/static/img/components_text_02.png differ diff --git a/static/img/components_video.png b/static/img/components_video.png new file mode 100644 index 0000000..c67319e Binary files /dev/null and b/static/img/components_video.png differ diff --git a/static/img/components_videoAvatars_feature2.mp4 b/static/img/components_videoAvatars_feature2.mp4 new file mode 100644 index 0000000..7547b0f Binary files /dev/null and b/static/img/components_videoAvatars_feature2.mp4 differ diff --git "a/static/img/components_videoAvatars_feature2.mp4\357\200\272Zone.Identifier" "b/static/img/components_videoAvatars_feature2.mp4\357\200\272Zone.Identifier" new file mode 100644 index 0000000..920dce5 --- /dev/null +++ "b/static/img/components_videoAvatars_feature2.mp4\357\200\272Zone.Identifier" @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://cdn.discordapp.com/attachments/725805297393729586/1105947225353375835/VideoAvatars_Feature2.mp4 diff --git a/static/img/components_videoTextureSource_01.png b/static/img/components_videoTextureSource_01.png new file mode 100644 index 0000000..20ee358 Binary files /dev/null and b/static/img/components_videoTextureSource_01.png differ diff --git a/static/img/components_videoTextureTarget_01.gif b/static/img/components_videoTextureTarget_01.gif new file mode 100644 index 0000000..5e2601b Binary files /dev/null and b/static/img/components_videoTextureTarget_01.gif differ diff --git a/static/img/components_videoTextureTarget_01.png b/static/img/components_videoTextureTarget_01.png new file mode 100644 index 0000000..a94e4d5 Binary files /dev/null and b/static/img/components_videoTextureTarget_01.png differ diff --git a/static/img/components_videoTextureTarget_02.png b/static/img/components_videoTextureTarget_02.png new file mode 100644 index 0000000..0f8ba34 Binary files /dev/null and b/static/img/components_videoTextureTarget_02.png differ diff --git a/static/img/components_videoTextureTarget_videoThumbnail.png b/static/img/components_videoTextureTarget_videoThumbnail.png new file mode 100644 index 0000000..1a527a9 Binary files /dev/null and b/static/img/components_videoTextureTarget_videoThumbnail.png differ diff --git a/static/img/components_visible_01.png b/static/img/components_visible_01.png new file mode 100644 index 0000000..c65ce21 Binary files /dev/null and b/static/img/components_visible_01.png differ diff --git a/static/img/components_waypoint_01.png b/static/img/components_waypoint_01.png new file mode 100644 index 0000000..5ad2ff3 Binary files /dev/null and b/static/img/components_waypoint_01.png differ diff --git a/static/img/components_waypoint_02.png b/static/img/components_waypoint_02.png new file mode 100644 index 0000000..af92829 Binary files /dev/null and b/static/img/components_waypoint_02.png differ diff --git a/static/img/confirm-account.mp4 b/static/img/confirm-account.mp4 new file mode 100644 index 0000000..af9859e Binary files /dev/null and b/static/img/confirm-account.mp4 differ diff --git a/static/img/connect-button.png b/static/img/connect-button.png new file mode 100644 index 0000000..1c39d64 Binary files /dev/null and b/static/img/connect-button.png differ diff --git a/static/img/content-storage.png b/static/img/content-storage.png new file mode 100644 index 0000000..f8d3736 Binary files /dev/null and b/static/img/content-storage.png differ diff --git a/static/img/content-tools.png b/static/img/content-tools.png new file mode 100644 index 0000000..014d30d Binary files /dev/null and b/static/img/content-tools.png differ diff --git a/static/img/create-a-room.mp4 b/static/img/create-a-room.mp4 new file mode 100644 index 0000000..36a5790 Binary files /dev/null and b/static/img/create-a-room.mp4 differ diff --git a/static/img/create-account.png b/static/img/create-account.png new file mode 100644 index 0000000..7d94f34 Binary files /dev/null and b/static/img/create-account.png differ diff --git a/static/img/creator-labs.png b/static/img/creator-labs.png new file mode 100644 index 0000000..4d2282e Binary files /dev/null and b/static/img/creator-labs.png differ diff --git a/static/img/dash-overview.png b/static/img/dash-overview.png new file mode 100644 index 0000000..8f2f120 Binary files /dev/null and b/static/img/dash-overview.png differ diff --git a/static/img/dashboard-free.png b/static/img/dashboard-free.png new file mode 100644 index 0000000..2d29c7f Binary files /dev/null and b/static/img/dashboard-free.png differ diff --git a/static/img/defaultAvatars.pack b/static/img/defaultAvatars.pack new file mode 100644 index 0000000..c33fcd6 --- /dev/null +++ b/static/img/defaultAvatars.pack @@ -0,0 +1,12 @@ +https://hubs.mozilla.com/avatars/3vuHoJz/animals-moose +https://hubs.mozilla.com/avatars/2OWjKrl +https://hubs.mozilla.com/avatars/h1SOYws +https://hubs.mozilla.com/avatars/h6CxhKF/food-ramen +https://hubs.mozilla.com/avatars/3MZj5KV/food-popsicleBite +https://hubs.mozilla.com/avatars/zE6BYpU +https://hubs.mozilla.com/avatars/JnpJCeq/bot-classic-blue-a +https://hubs.mozilla.com/avatars/a0YSzRA +https://hubs.mozilla.com/avatars/F9seUw5/retroTech-music-player +https://hubs.mozilla.com/avatars/NrExd37 +https://hubs.mozilla.com/avatars/2BtycVC/webcam-astronaut +https://hubs.mozilla.com/avatars/PGnvD5h \ No newline at end of file diff --git a/static/img/defaultAvatars.png b/static/img/defaultAvatars.png new file mode 100644 index 0000000..03346f1 Binary files /dev/null and b/static/img/defaultAvatars.png differ diff --git a/static/img/defaultLogos.zip b/static/img/defaultLogos.zip new file mode 100644 index 0000000..3c0245c Binary files /dev/null and b/static/img/defaultLogos.zip differ diff --git a/static/img/defaultScenes.pack b/static/img/defaultScenes.pack new file mode 100644 index 0000000..7991d14 --- /dev/null +++ b/static/img/defaultScenes.pack @@ -0,0 +1,4 @@ +https://hubs.mozilla.com/scenes/MwuVijw/eventsconferencesunrise +https://hubs.mozilla.com/scenes/CJgoF7F/classic-theater +https://hubs.mozilla.com/scenes/wHaJP9g +https://hubs.mozilla.com/scenes/RKD7fSc/events-promenade-night diff --git a/static/img/defaultScenes.png b/static/img/defaultScenes.png new file mode 100644 index 0000000..380c4d2 Binary files /dev/null and b/static/img/defaultScenes.png differ diff --git a/static/img/defaultTheme.json b/static/img/defaultTheme.json new file mode 100644 index 0000000..a1098ab --- /dev/null +++ b/static/img/defaultTheme.json @@ -0,0 +1,181 @@ +[ + { + "id": "hubs-default", + "default": false, + "name": "Hubs Default", + "variables": { + "loading-screen-background": "radial-gradient(100% 160.26% at 100% 50%, #EBEBEB 0%, #FFFFFF 46.87%, #EBEBEB 100%)", + "primary-color": "#1700C7", + "primary-color-hover": "#170696", + "secondary-color": "#FFFFFF", + "secondary-color-hover": "#E7E7E7", + "secondary-color-pressed": "#E7E7E7", + "link-color": "#1700C7", + "accent1-color": "#F04F5F", + "accent1-color-hover": "#D43F57", + "accent1-color-pressed": "#D43F57", + "toolbar-label-accent1": "#FFFFFF", + "accent1-border-color": "#F04F5F", + "accent2-color": "#47D3CA", + "accent2-color-hover": "#42CAC1", + "accent2-color-pressed": "#42CAC1", + "toolbar-label-accent2": "#616161", + "accent2-border-color": "#47D3CA", + "accent3-color": "#92D147", + "accent3-color-hover": "#83C832", + "accent3-color-pressed": "#83C832", + "toolbar-label-accent3": "#FFFFFF", + "accent3-border-color": "#92D147", + "accent4-color": "#1700C7", + "accent4-color-hover": "#170696", + "accent4-color-pressed": "#170696", + "toolbar-label-accent4": "#FFFFFF", + "accent4-border-color": "#1700C7", + "accent5-color": "#FF806F", + "accent5-color-hover": "#F0705F", + "accent5-color-pressed": "#F0705F", + "toolbar-label-accent5": "#FFFFFF", + "accent5-border-color": "#FF806F", + "cancel": "#E1465F", + "accept-color": "#92D147", + "accept-color-hover": "#85C23C", + "accept-color-pressed": "#21242C", + "accept-border-color": "#7ED320", + "text1-color": "#000000", + "text1-color-hover": "#2C2C2C", + "text1-color-pressed": "#2C2C2C", + "text2-color": "#616161", + "text2-color-hover": "#616161", + "text2-color-pressed": "#616161", + "text3-color": "#BBBBBB", + "text3-color-hover": "#C7C7C7", + "text3-color-pressed": "#ADADAD", + "text4-color": "#868686", + "text5-color": "#FFFFFF", + "border1-color": "#E7E7E7", + "border2-color": "#5D646C", + "border3-color": "#5D646C", + "outline-color": "#3A4049", + "background1-color": "#FFFFFF", + "background2-color": "#F5F5F5", + "background3-color": "#E7E7E7", + "background4-color": "#5D646C", + "tip-text-color": "#FFFFFF", + "tip-bg-color": "#000000", + "tip-button-color-hover": "#E7E7E7", + "input-bg-color": "#FFFFFF", + "active-text-color": "#2B313B", + "active-color-hover": "#E8EFFD", + "active-color-pressed": "#D0DEFB", + "action-color": "#000000", + "action-color-highlight": "#149CE2", + "action-label-color": "#5634FF", + "notice-background-color": "#000000", + "admin-color": "#13A4ED", + "toolbar-basic-selected-icon-color": "#2B313B", + "toolbar-basic-icon-color": "#000000", + "toolbar-basic-color-hover": "#E7E7E7", + "toolbar-basic-border-color": "#E7E7E7", + "toolbar-icon-selected-bg": "#FFFFFF", + "basic-color": "#FFFFFF", + "basic-color-hover": "#E7E7E7", + "basic-color-pressed": "#E7E7E7", + "background-hover-color": "#E7E7E7", + "basic-border-color": "#E7E7E7", + "link-color-hover": "#1700C7", + "radio-bg-color": "#FFFFFF" + } + }, + { + "name": "Hubs Dark Mode", + "id": "hubs-dark-mode", + "default": true, + "variables": { + "loading-screen-background": " linear-gradient(110.71deg, #499CBE 0.79%, #1D11C6 32.83%, #6B30AF 67.96%, #E67577 100%);", + "primary-color": "#6E5BFF", + "primary-color-hover": "#7967FF", + "secondary-color": "#FFFFFF", + "secondary-color-hover": "#E7E7E7", + "secondary-color-pressed": "#E7E7E7", + "link-color": "#6E5BFF", + "link-color-hover": "#7967FF", + "link-color-pressed": "#7967FF", + "accent1-color": "#F04F5F", + "accent1-color-hover": "#D43F57", + "accent1-color-pressed": "#D43F57", + "toolbar-label-accent1": "#FFFFFF", + "accent1-border-color": "#F04F5F", + "accent2-color": "#47D3CA", + "accent2-color-hover": "#3CC6BD", + "accent2-color-pressed": "#42CAC1", + "toolbar-label-accent2": "#FFFFFF", + "accent2-border-color": "#47D3CA", + "accent3-color": "#92D147", + "accent3-color-hover": "#83C832", + "accent3-color-pressed": "#83C832", + "toolbar-label-accent3": "#FFFFFF", + "accent3-border-color": "#92D147", + "accent4-color": "#6E5BFF", + "accent4-color-hover": "#5C4ADF", + "accent4-color-pressed": "#5C4ADF", + "toolbar-label-accent4": "#FFFFFF", + "accent4-border-color": "#6E5BFF", + "accent5-color": "#FF806F", + "accent5-color-hover": "#F0705F", + "accent5-color-pressed": "#F0705F", + "toolbar-label-accent5": "#FFFFFF", + "accent5-border-color": "#FF806F", + "cancel": "#E1465F", + "accept-color": "#92D147", + "accept-color-hover": "#7FBF33", + "accept-color-pressed": "#7FBF33", + "accept-border-color": "#92D147", + "text1-color": "#EAEAEA", + "text1-color-hover": "#EAEAEA", + "text1-color-pressed": "#EAEAEA", + "text2-color": "#E7E7E7", + "text2-color-hover": "#E7E7E7", + "text2-color-pressed": "#E7E7E7", + "text3-color": "#BBBBBB", + "text3-color-hover": "#C7C7C7", + "text3-color-pressed": "#ADADAD", + "text4-color": "#FFFFFF", + "text5-color": "#FFFFFF", + "border1-color": "#463F78", + "border2-color": "#433C75", + "border3-color": "#3B346D", + "outline-color": "#3A4049", + "background1-color": "#28244B", + "background2-color": "#302B52", + "background3-color": "#352F5F", + "background4-color": "#383267", + "tip-text-color": "#FFFFFF", + "tip-bg-color": "#000000", + "tip-button-color-hover": "#E7E7E7", + "input-bg-color": "#5D646C", + "active-text-color": "#EAEAEA", + "active-color": "#7967FF", + "active-color-hover": "#6E5BFF", + "active-color-pressed": "#6E5BFF", + "action-color": "#000000", + "action-color-highlight": "#6E5BFF", + "action-label-color": "#5634FF", + "notice-background-color": "#000000", + "admin-color": "#70D9DE", + "toolbar-basic-selected-icon-color": "#2B313B", + "toolbar-basic-icon-color": "#EAEAEA", + "toolbar-basic-color-hover": "#FFFFFF", + "toolbar-basic-border-color": "#6E5BFF", + "toolbar-icon-selected-bg": "#FFFFFF", + "toggle-button-color": "#6E5BFF", + "basic-color": "#2B2560", + "basic-color-hover": "#362E79", + "basic-color-pressed": "#362E79", + "background-hover-color": "#E7E7E7", + "basic-border-color": "#E7E7E7", + "tile-bg-color": "#3B346D", + "tile-bg-color-hover": "#362E79", + "tile-bg-color-pressed": "#362E79" + } + } + ] \ No newline at end of file diff --git a/static/img/delete-asset.png b/static/img/delete-asset.png new file mode 100644 index 0000000..6992ab6 Binary files /dev/null and b/static/img/delete-asset.png differ diff --git a/static/img/discord-add-bot.jpeg b/static/img/discord-add-bot.jpeg new file mode 100644 index 0000000..d9e9dc6 Binary files /dev/null and b/static/img/discord-add-bot.jpeg differ diff --git a/static/img/discord-admin-configs.jpeg b/static/img/discord-admin-configs.jpeg new file mode 100644 index 0000000..0a01e76 Binary files /dev/null and b/static/img/discord-admin-configs.jpeg differ diff --git a/static/img/discord-bot-invite-permissions.jpeg b/static/img/discord-bot-invite-permissions.jpeg new file mode 100644 index 0000000..3a7f17f Binary files /dev/null and b/static/img/discord-bot-invite-permissions.jpeg differ diff --git a/static/img/discord-bot-token.jpeg b/static/img/discord-bot-token.jpeg new file mode 100644 index 0000000..6cd0ba0 Binary files /dev/null and b/static/img/discord-bot-token.jpeg differ diff --git a/static/img/discord-bot.jpeg b/static/img/discord-bot.jpeg new file mode 100644 index 0000000..ee1ce50 Binary files /dev/null and b/static/img/discord-bot.jpeg differ diff --git a/static/img/discord-client-keys.jpeg b/static/img/discord-client-keys.jpeg new file mode 100644 index 0000000..f522aa6 Binary files /dev/null and b/static/img/discord-client-keys.jpeg differ diff --git a/static/img/discord-create-app.jpeg b/static/img/discord-create-app.jpeg new file mode 100644 index 0000000..38c0fa6 Binary files /dev/null and b/static/img/discord-create-app.jpeg differ diff --git a/static/img/discord-oauth-redirect.jpeg b/static/img/discord-oauth-redirect.jpeg new file mode 100644 index 0000000..ef08d90 Binary files /dev/null and b/static/img/discord-oauth-redirect.jpeg differ diff --git a/static/img/discord-public-bot.jpeg b/static/img/discord-public-bot.jpeg new file mode 100644 index 0000000..8312f87 Binary files /dev/null and b/static/img/discord-public-bot.jpeg differ diff --git a/static/img/discord-support.png b/static/img/discord-support.png new file mode 100644 index 0000000..e35612e Binary files /dev/null and b/static/img/discord-support.png differ diff --git a/static/img/discover-hubs.png b/static/img/discover-hubs.png new file mode 100644 index 0000000..69c4fc0 Binary files /dev/null and b/static/img/discover-hubs.png differ diff --git a/static/img/docusaurus-social-card.jpg b/static/img/docusaurus-social-card.jpg new file mode 100644 index 0000000..ffcb448 Binary files /dev/null and b/static/img/docusaurus-social-card.jpg differ diff --git a/static/img/docusaurus.png b/static/img/docusaurus.png new file mode 100644 index 0000000..f458149 Binary files /dev/null and b/static/img/docusaurus.png differ diff --git a/static/img/email-preview.png b/static/img/email-preview.png new file mode 100644 index 0000000..016154b Binary files /dev/null and b/static/img/email-preview.png differ diff --git a/static/img/enter-email.mp4 b/static/img/enter-email.mp4 new file mode 100644 index 0000000..57707d8 Binary files /dev/null and b/static/img/enter-email.mp4 differ diff --git a/static/img/enter-payment.mp4 b/static/img/enter-payment.mp4 new file mode 100644 index 0000000..faf6ce4 Binary files /dev/null and b/static/img/enter-payment.mp4 differ diff --git a/static/img/favicon copy.ico b/static/img/favicon copy.ico new file mode 100644 index 0000000..42eaddc Binary files /dev/null and b/static/img/favicon copy.ico differ diff --git a/static/img/favicon.ico b/static/img/favicon.ico new file mode 100644 index 0000000..42eaddc Binary files /dev/null and b/static/img/favicon.ico differ diff --git a/static/img/how-to-promote.mp4 b/static/img/how-to-promote.mp4 new file mode 100644 index 0000000..4db3782 Binary files /dev/null and b/static/img/how-to-promote.mp4 differ diff --git a/static/img/hub-over-limit.png b/static/img/hub-over-limit.png new file mode 100644 index 0000000..eb0ebf8 Binary files /dev/null and b/static/img/hub-over-limit.png differ diff --git a/static/img/hubs-avatar-menu.jpeg b/static/img/hubs-avatar-menu.jpeg new file mode 100644 index 0000000..4709c8d Binary files /dev/null and b/static/img/hubs-avatar-menu.jpeg differ diff --git a/static/img/hubs-avatars.jpeg b/static/img/hubs-avatars.jpeg new file mode 100644 index 0000000..8ed25a1 Binary files /dev/null and b/static/img/hubs-avatars.jpeg differ diff --git a/static/img/hubs-business.jpeg b/static/img/hubs-business.jpeg new file mode 100644 index 0000000..c126450 Binary files /dev/null and b/static/img/hubs-business.jpeg differ diff --git a/static/img/hubs-camera-menu.jpeg b/static/img/hubs-camera-menu.jpeg new file mode 100644 index 0000000..9faffc6 Binary files /dev/null and b/static/img/hubs-camera-menu.jpeg differ diff --git a/static/img/hubs-camera-menu2.jpeg b/static/img/hubs-camera-menu2.jpeg new file mode 100644 index 0000000..de52d44 Binary files /dev/null and b/static/img/hubs-camera-menu2.jpeg differ diff --git a/static/img/hubs-cloud-accounts.jpeg b/static/img/hubs-cloud-accounts.jpeg new file mode 100644 index 0000000..969e035 Binary files /dev/null and b/static/img/hubs-cloud-accounts.jpeg differ diff --git a/static/img/hubs-cloud-admin-bar.jpeg b/static/img/hubs-cloud-admin-bar.jpeg new file mode 100644 index 0000000..05d2fc2 Binary files /dev/null and b/static/img/hubs-cloud-admin-bar.jpeg differ diff --git a/static/img/hubs-cloud-admin-landing.jpeg b/static/img/hubs-cloud-admin-landing.jpeg new file mode 100644 index 0000000..0d00766 Binary files /dev/null and b/static/img/hubs-cloud-admin-landing.jpeg differ diff --git a/static/img/hubs-cloud-app-settings.jpeg b/static/img/hubs-cloud-app-settings.jpeg new file mode 100644 index 0000000..7c799fb Binary files /dev/null and b/static/img/hubs-cloud-app-settings.jpeg differ diff --git a/static/img/hubs-cloud-approved-scene-controls.jpeg b/static/img/hubs-cloud-approved-scene-controls.jpeg new file mode 100644 index 0000000..b9b9429 Binary files /dev/null and b/static/img/hubs-cloud-approved-scene-controls.jpeg differ diff --git a/static/img/hubs-cloud-approved-scene.jpeg b/static/img/hubs-cloud-approved-scene.jpeg new file mode 100644 index 0000000..26d8cbc Binary files /dev/null and b/static/img/hubs-cloud-approved-scene.jpeg differ diff --git a/static/img/hubs-cloud-aws-architecture.jpeg b/static/img/hubs-cloud-aws-architecture.jpeg new file mode 100644 index 0000000..e605ae1 Binary files /dev/null and b/static/img/hubs-cloud-aws-architecture.jpeg differ diff --git a/static/img/hubs-cloud-aws-stack-setup.jpeg b/static/img/hubs-cloud-aws-stack-setup.jpeg new file mode 100644 index 0000000..688e586 Binary files /dev/null and b/static/img/hubs-cloud-aws-stack-setup.jpeg differ diff --git a/static/img/hubs-cloud-color-legend.jpeg b/static/img/hubs-cloud-color-legend.jpeg new file mode 100644 index 0000000..3cae2b7 Binary files /dev/null and b/static/img/hubs-cloud-color-legend.jpeg differ diff --git a/static/img/hubs-cloud-create-room.jpeg b/static/img/hubs-cloud-create-room.jpeg new file mode 100644 index 0000000..7848e9f Binary files /dev/null and b/static/img/hubs-cloud-create-room.jpeg differ diff --git a/static/img/hubs-cloud-custom-branding.png b/static/img/hubs-cloud-custom-branding.png new file mode 100644 index 0000000..9c004d7 Binary files /dev/null and b/static/img/hubs-cloud-custom-branding.png differ diff --git a/static/img/hubs-cloud-edit-scene.jpeg b/static/img/hubs-cloud-edit-scene.jpeg new file mode 100644 index 0000000..0c3c174 Binary files /dev/null and b/static/img/hubs-cloud-edit-scene.jpeg differ diff --git a/static/img/hubs-cloud-featured.jpeg b/static/img/hubs-cloud-featured.jpeg new file mode 100644 index 0000000..37139d4 Binary files /dev/null and b/static/img/hubs-cloud-featured.jpeg differ diff --git a/static/img/hubs-cloud-find-account.jpeg b/static/img/hubs-cloud-find-account.jpeg new file mode 100644 index 0000000..902dfc0 Binary files /dev/null and b/static/img/hubs-cloud-find-account.jpeg differ diff --git a/static/img/hubs-cloud-image-settings.jpeg b/static/img/hubs-cloud-image-settings.jpeg new file mode 100644 index 0000000..aa0d5a3 Binary files /dev/null and b/static/img/hubs-cloud-image-settings.jpeg differ diff --git a/static/img/hubs-cloud-import-content-url.jpeg b/static/img/hubs-cloud-import-content-url.jpeg new file mode 100644 index 0000000..455ac00 Binary files /dev/null and b/static/img/hubs-cloud-import-content-url.jpeg differ diff --git a/static/img/hubs-cloud-import-content.jpeg b/static/img/hubs-cloud-import-content.jpeg new file mode 100644 index 0000000..7734c0c Binary files /dev/null and b/static/img/hubs-cloud-import-content.jpeg differ diff --git a/static/img/hubs-cloud-import-ui.jpeg b/static/img/hubs-cloud-import-ui.jpeg new file mode 100644 index 0000000..ad91a59 Binary files /dev/null and b/static/img/hubs-cloud-import-ui.jpeg differ diff --git a/static/img/hubs-cloud-logo.jpeg b/static/img/hubs-cloud-logo.jpeg new file mode 100644 index 0000000..8bcee4d Binary files /dev/null and b/static/img/hubs-cloud-logo.jpeg differ diff --git a/static/img/hubs-cloud-media-browser.jpeg b/static/img/hubs-cloud-media-browser.jpeg new file mode 100644 index 0000000..36451d3 Binary files /dev/null and b/static/img/hubs-cloud-media-browser.jpeg differ diff --git a/static/img/hubs-cloud-opaque.png b/static/img/hubs-cloud-opaque.png new file mode 100644 index 0000000..b59617c Binary files /dev/null and b/static/img/hubs-cloud-opaque.png differ diff --git a/static/img/hubs-cloud-pending-queue-menu.jpeg b/static/img/hubs-cloud-pending-queue-menu.jpeg new file mode 100644 index 0000000..f19948a Binary files /dev/null and b/static/img/hubs-cloud-pending-queue-menu.jpeg differ diff --git a/static/img/hubs-cloud-pending-scene-controls.jpeg b/static/img/hubs-cloud-pending-scene-controls.jpeg new file mode 100644 index 0000000..06f22c3 Binary files /dev/null and b/static/img/hubs-cloud-pending-scene-controls.jpeg differ diff --git a/static/img/hubs-cloud-pending-scene.jpeg b/static/img/hubs-cloud-pending-scene.jpeg new file mode 100644 index 0000000..c4a0bcf Binary files /dev/null and b/static/img/hubs-cloud-pending-scene.jpeg differ diff --git a/static/img/hubs-cloud-permissive-rooms.jpeg b/static/img/hubs-cloud-permissive-rooms.jpeg new file mode 100644 index 0000000..5ffa8e1 Binary files /dev/null and b/static/img/hubs-cloud-permissive-rooms.jpeg differ diff --git a/static/img/hubs-cloud-select-admin.jpeg b/static/img/hubs-cloud-select-admin.jpeg new file mode 100644 index 0000000..d7e26ad Binary files /dev/null and b/static/img/hubs-cloud-select-admin.jpeg differ diff --git a/static/img/hubs-cloud-server-settings.jpeg b/static/img/hubs-cloud-server-settings.jpeg new file mode 100644 index 0000000..eee153d Binary files /dev/null and b/static/img/hubs-cloud-server-settings.jpeg differ diff --git a/static/img/hubs-cloud-smtp-settings.jpeg b/static/img/hubs-cloud-smtp-settings.jpeg new file mode 100644 index 0000000..01758eb Binary files /dev/null and b/static/img/hubs-cloud-smtp-settings.jpeg differ diff --git a/static/img/hubs-cloud-theme-settings.jpeg b/static/img/hubs-cloud-theme-settings.jpeg new file mode 100644 index 0000000..58b4f61 Binary files /dev/null and b/static/img/hubs-cloud-theme-settings.jpeg differ diff --git a/static/img/hubs-cloud-transparent.png b/static/img/hubs-cloud-transparent.png new file mode 100644 index 0000000..1fa4493 Binary files /dev/null and b/static/img/hubs-cloud-transparent.png differ diff --git a/static/img/hubs-dark-logo.png b/static/img/hubs-dark-logo.png new file mode 100644 index 0000000..8a31f6d Binary files /dev/null and b/static/img/hubs-dark-logo.png differ diff --git a/static/img/hubs-dark-stacked-logo.png b/static/img/hubs-dark-stacked-logo.png new file mode 100644 index 0000000..9a1e850 Binary files /dev/null and b/static/img/hubs-dark-stacked-logo.png differ diff --git a/static/img/hubs-drawing-menu.jpeg b/static/img/hubs-drawing-menu.jpeg new file mode 100644 index 0000000..9788a1c Binary files /dev/null and b/static/img/hubs-drawing-menu.jpeg differ diff --git a/static/img/hubs-dressing-room.png b/static/img/hubs-dressing-room.png new file mode 100644 index 0000000..fd30c44 Binary files /dev/null and b/static/img/hubs-dressing-room.png differ diff --git a/static/img/hubs-emoji-spawners.jpeg b/static/img/hubs-emoji-spawners.jpeg new file mode 100644 index 0000000..5d35d18 Binary files /dev/null and b/static/img/hubs-emoji-spawners.jpeg differ diff --git a/static/img/hubs-enter-connected-vr.jpeg b/static/img/hubs-enter-connected-vr.jpeg new file mode 100644 index 0000000..9ef1600 Binary files /dev/null and b/static/img/hubs-enter-connected-vr.jpeg differ diff --git a/static/img/hubs-enter-room.mp4 b/static/img/hubs-enter-room.mp4 new file mode 100644 index 0000000..0eb6d8f Binary files /dev/null and b/static/img/hubs-enter-room.mp4 differ diff --git a/static/img/hubs-enter-standalone-vr.mp4 b/static/img/hubs-enter-standalone-vr.mp4 new file mode 100644 index 0000000..5b5e79a Binary files /dev/null and b/static/img/hubs-enter-standalone-vr.mp4 differ diff --git a/static/img/hubs-event-image-min.jpeg b/static/img/hubs-event-image-min.jpeg new file mode 100644 index 0000000..a4bdaf2 Binary files /dev/null and b/static/img/hubs-event-image-min.jpeg differ diff --git a/static/img/hubs-exclusive-avatars.png b/static/img/hubs-exclusive-avatars.png new file mode 100644 index 0000000..f75d4ab Binary files /dev/null and b/static/img/hubs-exclusive-avatars.png differ diff --git a/static/img/hubs-invite-dialogue.PNG b/static/img/hubs-invite-dialogue.PNG new file mode 100644 index 0000000..8a4b886 Binary files /dev/null and b/static/img/hubs-invite-dialogue.PNG differ diff --git a/static/img/hubs-light-logo.png b/static/img/hubs-light-logo.png new file mode 100644 index 0000000..95d3975 Binary files /dev/null and b/static/img/hubs-light-logo.png differ diff --git a/static/img/hubs-light-stacked-logo.png b/static/img/hubs-light-stacked-logo.png new file mode 100644 index 0000000..019861d Binary files /dev/null and b/static/img/hubs-light-stacked-logo.png differ diff --git a/static/img/hubs-lobby.jpeg b/static/img/hubs-lobby.jpeg new file mode 100644 index 0000000..5007ab5 Binary files /dev/null and b/static/img/hubs-lobby.jpeg differ diff --git a/static/img/hubs-media-controls.jpeg b/static/img/hubs-media-controls.jpeg new file mode 100644 index 0000000..2b43bcb Binary files /dev/null and b/static/img/hubs-media-controls.jpeg differ diff --git a/static/img/hubs-name-and-avatar.jpeg b/static/img/hubs-name-and-avatar.jpeg new file mode 100644 index 0000000..11c03ae Binary files /dev/null and b/static/img/hubs-name-and-avatar.jpeg differ diff --git a/static/img/hubs-name-avatar.jpeg b/static/img/hubs-name-avatar.jpeg new file mode 100644 index 0000000..e510859 Binary files /dev/null and b/static/img/hubs-name-avatar.jpeg differ diff --git a/static/img/hubs-object-menu.jpeg b/static/img/hubs-object-menu.jpeg new file mode 100644 index 0000000..763f695 Binary files /dev/null and b/static/img/hubs-object-menu.jpeg differ diff --git a/static/img/hubs-preference-menu.PNG b/static/img/hubs-preference-menu.PNG new file mode 100644 index 0000000..575e636 Binary files /dev/null and b/static/img/hubs-preference-menu.PNG differ diff --git a/static/img/hubs-reskin-avatar.mp4 b/static/img/hubs-reskin-avatar.mp4 new file mode 100644 index 0000000..57a1ba8 Binary files /dev/null and b/static/img/hubs-reskin-avatar.mp4 differ diff --git a/static/img/hubs-save-avatar.jpeg b/static/img/hubs-save-avatar.jpeg new file mode 100644 index 0000000..8ed25a1 Binary files /dev/null and b/static/img/hubs-save-avatar.jpeg differ diff --git a/static/img/hubs-scene-remix.mp4 b/static/img/hubs-scene-remix.mp4 new file mode 100644 index 0000000..a0ac62d Binary files /dev/null and b/static/img/hubs-scene-remix.mp4 differ diff --git a/static/img/hubs-scenes.jpeg b/static/img/hubs-scenes.jpeg new file mode 100644 index 0000000..713a583 Binary files /dev/null and b/static/img/hubs-scenes.jpeg differ diff --git a/static/img/hubs-scenes2.jpeg b/static/img/hubs-scenes2.jpeg new file mode 100644 index 0000000..4bb3021 Binary files /dev/null and b/static/img/hubs-scenes2.jpeg differ diff --git a/static/img/hubs-scenes3.jpeg b/static/img/hubs-scenes3.jpeg new file mode 100644 index 0000000..56529a4 Binary files /dev/null and b/static/img/hubs-scenes3.jpeg differ diff --git a/static/img/hubs-user-interface.png b/static/img/hubs-user-interface.png new file mode 100644 index 0000000..104c69e Binary files /dev/null and b/static/img/hubs-user-interface.png differ diff --git a/static/img/hubs-user-name-avatar.jpeg b/static/img/hubs-user-name-avatar.jpeg new file mode 100644 index 0000000..e7998e9 Binary files /dev/null and b/static/img/hubs-user-name-avatar.jpeg differ diff --git a/static/img/import-content.mp4 b/static/img/import-content.mp4 new file mode 100644 index 0000000..9bc3512 Binary files /dev/null and b/static/img/import-content.mp4 differ diff --git a/static/img/import-content.png b/static/img/import-content.png new file mode 100644 index 0000000..45b0af6 Binary files /dev/null and b/static/img/import-content.png differ diff --git a/static/img/import-video-from-browser.mp4 b/static/img/import-video-from-browser.mp4 new file mode 100644 index 0000000..bb44f25 Binary files /dev/null and b/static/img/import-video-from-browser.mp4 differ diff --git a/static/img/intro-avatars-image-min.jpeg b/static/img/intro-avatars-image-min.jpeg new file mode 100644 index 0000000..a70312e Binary files /dev/null and b/static/img/intro-avatars-image-min.jpeg differ diff --git a/static/img/intro-custom-avatar.jpeg b/static/img/intro-custom-avatar.jpeg new file mode 100644 index 0000000..fb90c7b Binary files /dev/null and b/static/img/intro-custom-avatar.jpeg differ diff --git a/static/img/intro-hubs-avatar-menu-min.jpeg b/static/img/intro-hubs-avatar-menu-min.jpeg new file mode 100644 index 0000000..ae65b02 Binary files /dev/null and b/static/img/intro-hubs-avatar-menu-min.jpeg differ diff --git a/static/img/intro-hubs-create-room-min.jpeg b/static/img/intro-hubs-create-room-min.jpeg new file mode 100644 index 0000000..5213c23 Binary files /dev/null and b/static/img/intro-hubs-create-room-min.jpeg differ diff --git a/static/img/intro-hubs-enter-room-min.PNG b/static/img/intro-hubs-enter-room-min.PNG new file mode 100644 index 0000000..5c3c319 Binary files /dev/null and b/static/img/intro-hubs-enter-room-min.PNG differ diff --git a/static/img/intro-hubs-media-browser-min.jpeg b/static/img/intro-hubs-media-browser-min.jpeg new file mode 100644 index 0000000..2011af3 Binary files /dev/null and b/static/img/intro-hubs-media-browser-min.jpeg differ diff --git a/static/img/intro-hubs-object-menu-min.jpeg b/static/img/intro-hubs-object-menu-min.jpeg new file mode 100644 index 0000000..b3c34a2 Binary files /dev/null and b/static/img/intro-hubs-object-menu-min.jpeg differ diff --git a/static/img/intro-hubs-scene-browser-min.jpeg b/static/img/intro-hubs-scene-browser-min.jpeg new file mode 100644 index 0000000..32ee7bc Binary files /dev/null and b/static/img/intro-hubs-scene-browser-min.jpeg differ diff --git a/static/img/intro-hubs-share-popup-min.jpeg b/static/img/intro-hubs-share-popup-min.jpeg new file mode 100644 index 0000000..ed16a22 Binary files /dev/null and b/static/img/intro-hubs-share-popup-min.jpeg differ diff --git a/static/img/intro-hubs-tryquilt.jpeg b/static/img/intro-hubs-tryquilt.jpeg new file mode 100644 index 0000000..c5f4c57 Binary files /dev/null and b/static/img/intro-hubs-tryquilt.jpeg differ diff --git a/static/img/intro-spoke-screenshot-min.jpeg b/static/img/intro-spoke-screenshot-min.jpeg new file mode 100644 index 0000000..4389c7f Binary files /dev/null and b/static/img/intro-spoke-screenshot-min.jpeg differ diff --git a/static/img/logo-dark.svg b/static/img/logo-dark.svg new file mode 100644 index 0000000..e7e2f29 --- /dev/null +++ b/static/img/logo-dark.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/logo-light.svg b/static/img/logo-light.svg new file mode 100644 index 0000000..8c7493b --- /dev/null +++ b/static/img/logo-light.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/logos-tab.png b/static/img/logos-tab.png new file mode 100644 index 0000000..c3ba3a8 Binary files /dev/null and b/static/img/logos-tab.png differ diff --git a/static/img/manage-subscription.png b/static/img/manage-subscription.png new file mode 100644 index 0000000..e9d0ac0 Binary files /dev/null and b/static/img/manage-subscription.png differ diff --git a/static/img/media-browser.jpeg b/static/img/media-browser.jpeg new file mode 100644 index 0000000..d8031bc Binary files /dev/null and b/static/img/media-browser.jpeg differ diff --git a/static/img/media-frame-demo.mp4 b/static/img/media-frame-demo.mp4 new file mode 100644 index 0000000..64ff832 Binary files /dev/null and b/static/img/media-frame-demo.mp4 differ diff --git a/static/img/media-frame-demo.png b/static/img/media-frame-demo.png new file mode 100644 index 0000000..885a14c Binary files /dev/null and b/static/img/media-frame-demo.png differ diff --git a/static/img/media-frames-use-demo.gif b/static/img/media-frames-use-demo.gif new file mode 100644 index 0000000..931ab27 Binary files /dev/null and b/static/img/media-frames-use-demo.gif differ diff --git a/static/img/mozilla-hubs.png b/static/img/mozilla-hubs.png new file mode 100644 index 0000000..2f13f2c Binary files /dev/null and b/static/img/mozilla-hubs.png differ diff --git a/static/img/object-creation.mp4 b/static/img/object-creation.mp4 new file mode 100644 index 0000000..9ef1e5d Binary files /dev/null and b/static/img/object-creation.mp4 differ diff --git a/static/img/object-menu.jpeg b/static/img/object-menu.jpeg new file mode 100644 index 0000000..eb6e074 Binary files /dev/null and b/static/img/object-menu.jpeg differ diff --git a/static/img/open-domain-editor.mp4 b/static/img/open-domain-editor.mp4 new file mode 100644 index 0000000..24c66fe Binary files /dev/null and b/static/img/open-domain-editor.mp4 differ diff --git a/static/img/order-example.png b/static/img/order-example.png new file mode 100644 index 0000000..588e43f Binary files /dev/null and b/static/img/order-example.png differ diff --git a/static/img/oss_logo.jpeg b/static/img/oss_logo.jpeg new file mode 100644 index 0000000..5ba1d77 Binary files /dev/null and b/static/img/oss_logo.jpeg differ diff --git a/static/img/placeholder.jpeg b/static/img/placeholder.jpeg new file mode 100644 index 0000000..d6e7587 Binary files /dev/null and b/static/img/placeholder.jpeg differ diff --git a/static/img/projects-tab.png b/static/img/projects-tab.png new file mode 100644 index 0000000..dd8df31 Binary files /dev/null and b/static/img/projects-tab.png differ diff --git a/static/img/refund-form.png b/static/img/refund-form.png new file mode 100644 index 0000000..168a1a9 Binary files /dev/null and b/static/img/refund-form.png differ diff --git a/static/img/removing-asset.png b/static/img/removing-asset.png new file mode 100644 index 0000000..974f2c9 Binary files /dev/null and b/static/img/removing-asset.png differ diff --git a/static/img/robot-examples.jpeg b/static/img/robot-examples.jpeg new file mode 100644 index 0000000..fbc84f3 Binary files /dev/null and b/static/img/robot-examples.jpeg differ diff --git a/static/img/scene-browser.jpeg b/static/img/scene-browser.jpeg new file mode 100644 index 0000000..9b8df20 Binary files /dev/null and b/static/img/scene-browser.jpeg differ diff --git a/static/img/search-account.png b/static/img/search-account.png new file mode 100644 index 0000000..6cd7d37 Binary files /dev/null and b/static/img/search-account.png differ diff --git a/static/img/search-bar.png b/static/img/search-bar.png new file mode 100644 index 0000000..06e38a5 Binary files /dev/null and b/static/img/search-bar.png differ diff --git a/static/img/share.jpeg b/static/img/share.jpeg new file mode 100644 index 0000000..e74401b Binary files /dev/null and b/static/img/share.jpeg differ diff --git a/static/img/spoke-3d-model.jpeg b/static/img/spoke-3d-model.jpeg new file mode 100644 index 0000000..33d1e25 Binary files /dev/null and b/static/img/spoke-3d-model.jpeg differ diff --git a/static/img/spoke-3d-models.jpeg b/static/img/spoke-3d-models.jpeg new file mode 100644 index 0000000..6ce78d0 Binary files /dev/null and b/static/img/spoke-3d-models.jpeg differ diff --git a/static/img/spoke-architecture-kit-asset-panel.png b/static/img/spoke-architecture-kit-asset-panel.png new file mode 100644 index 0000000..abac2c8 Binary files /dev/null and b/static/img/spoke-architecture-kit-asset-panel.png differ diff --git a/static/img/spoke-architecture-kit-properties-panel.png b/static/img/spoke-architecture-kit-properties-panel.png new file mode 100644 index 0000000..647fe62 Binary files /dev/null and b/static/img/spoke-architecture-kit-properties-panel.png differ diff --git a/static/img/spoke-architecture-kit-trim.png b/static/img/spoke-architecture-kit-trim.png new file mode 100644 index 0000000..841237a Binary files /dev/null and b/static/img/spoke-architecture-kit-trim.png differ diff --git a/static/img/spoke-asset-interface.png b/static/img/spoke-asset-interface.png new file mode 100644 index 0000000..f28720d Binary files /dev/null and b/static/img/spoke-asset-interface.png differ diff --git a/static/img/spoke-assets-panel.jpeg b/static/img/spoke-assets-panel.jpeg new file mode 100644 index 0000000..06e5d4c Binary files /dev/null and b/static/img/spoke-assets-panel.jpeg differ diff --git a/static/img/spoke-experimental-features.jpeg b/static/img/spoke-experimental-features.jpeg new file mode 100644 index 0000000..901b1ed Binary files /dev/null and b/static/img/spoke-experimental-features.jpeg differ diff --git a/static/img/spoke-grid-toggle.png b/static/img/spoke-grid-toggle.png new file mode 100644 index 0000000..9cedf13 Binary files /dev/null and b/static/img/spoke-grid-toggle.png differ diff --git a/static/img/spoke-grid.png b/static/img/spoke-grid.png new file mode 100644 index 0000000..99c79bb Binary files /dev/null and b/static/img/spoke-grid.png differ diff --git a/static/img/spoke-hierarchy-panel.jpeg b/static/img/spoke-hierarchy-panel.jpeg new file mode 100644 index 0000000..a1755a8 Binary files /dev/null and b/static/img/spoke-hierarchy-panel.jpeg differ diff --git a/static/img/spoke-images.jpeg b/static/img/spoke-images.jpeg new file mode 100644 index 0000000..4ec649e Binary files /dev/null and b/static/img/spoke-images.jpeg differ diff --git a/static/img/spoke-increment-grid-height.png b/static/img/spoke-increment-grid-height.png new file mode 100644 index 0000000..221f1f3 Binary files /dev/null and b/static/img/spoke-increment-grid-height.png differ diff --git a/static/img/spoke-interface.jpeg b/static/img/spoke-interface.jpeg new file mode 100644 index 0000000..41dfd1e Binary files /dev/null and b/static/img/spoke-interface.jpeg differ diff --git a/static/img/spoke-landing-page.jpeg b/static/img/spoke-landing-page.jpeg new file mode 100644 index 0000000..48ac3cf Binary files /dev/null and b/static/img/spoke-landing-page.jpeg differ diff --git a/static/img/spoke-new-project.jpeg b/static/img/spoke-new-project.jpeg new file mode 100644 index 0000000..fb0354b Binary files /dev/null and b/static/img/spoke-new-project.jpeg differ diff --git a/static/img/spoke-particle-emitter.jpeg b/static/img/spoke-particle-emitter.jpeg new file mode 100644 index 0000000..ba472fc Binary files /dev/null and b/static/img/spoke-particle-emitter.jpeg differ diff --git a/static/img/spoke-projects-page-welcome.jpeg b/static/img/spoke-projects-page-welcome.jpeg new file mode 100644 index 0000000..033b7fb Binary files /dev/null and b/static/img/spoke-projects-page-welcome.jpeg differ diff --git a/static/img/spoke-properties-panel.jpeg b/static/img/spoke-properties-panel.jpeg new file mode 100644 index 0000000..0c58c5c Binary files /dev/null and b/static/img/spoke-properties-panel.jpeg differ diff --git a/static/img/spoke-rock-kit.mp4 b/static/img/spoke-rock-kit.mp4 new file mode 100644 index 0000000..4b48e77 Binary files /dev/null and b/static/img/spoke-rock-kit.mp4 differ diff --git a/static/img/spoke-scene-remixing copy.jpeg b/static/img/spoke-scene-remixing copy.jpeg new file mode 100644 index 0000000..d7ca0c5 Binary files /dev/null and b/static/img/spoke-scene-remixing copy.jpeg differ diff --git a/static/img/spoke-scene-remixing.jpeg b/static/img/spoke-scene-remixing.jpeg new file mode 100644 index 0000000..4ae80e3 Binary files /dev/null and b/static/img/spoke-scene-remixing.jpeg differ diff --git a/static/img/spoke-skybox-360.png b/static/img/spoke-skybox-360.png new file mode 100644 index 0000000..2b0adfe Binary files /dev/null and b/static/img/spoke-skybox-360.png differ diff --git a/static/img/spoke-skybox-properties.png b/static/img/spoke-skybox-properties.png new file mode 100644 index 0000000..866a9a5 Binary files /dev/null and b/static/img/spoke-skybox-properties.png differ diff --git a/static/img/spoke-skybox.png b/static/img/spoke-skybox.png new file mode 100644 index 0000000..355ae2d Binary files /dev/null and b/static/img/spoke-skybox.png differ diff --git a/static/img/spoke-snap-toggle.png b/static/img/spoke-snap-toggle.png new file mode 100644 index 0000000..816457d Binary files /dev/null and b/static/img/spoke-snap-toggle.png differ diff --git a/static/img/spoke-spawner.jpeg b/static/img/spoke-spawner.jpeg new file mode 100644 index 0000000..8109322 Binary files /dev/null and b/static/img/spoke-spawner.jpeg differ diff --git a/static/img/spoke-template.jpeg b/static/img/spoke-template.jpeg new file mode 100644 index 0000000..85e826f Binary files /dev/null and b/static/img/spoke-template.jpeg differ diff --git a/static/img/spoke-toolbar.jpeg b/static/img/spoke-toolbar.jpeg new file mode 100644 index 0000000..38773c2 Binary files /dev/null and b/static/img/spoke-toolbar.jpeg differ diff --git a/static/img/spoke-user-interface copy 2.jpeg b/static/img/spoke-user-interface copy 2.jpeg new file mode 100644 index 0000000..68882d7 Binary files /dev/null and b/static/img/spoke-user-interface copy 2.jpeg differ diff --git a/static/img/spoke-user-interface copy 4.jpeg b/static/img/spoke-user-interface copy 4.jpeg new file mode 100644 index 0000000..68882d7 Binary files /dev/null and b/static/img/spoke-user-interface copy 4.jpeg differ diff --git a/static/img/spoke-user-interface copy 5.jpeg b/static/img/spoke-user-interface copy 5.jpeg new file mode 100644 index 0000000..68882d7 Binary files /dev/null and b/static/img/spoke-user-interface copy 5.jpeg differ diff --git a/static/img/spoke-user-interface copy 6.jpeg b/static/img/spoke-user-interface copy 6.jpeg new file mode 100644 index 0000000..68882d7 Binary files /dev/null and b/static/img/spoke-user-interface copy 6.jpeg differ diff --git a/static/img/spoke-user-interface.jpeg b/static/img/spoke-user-interface.jpeg new file mode 100644 index 0000000..68882d7 Binary files /dev/null and b/static/img/spoke-user-interface.jpeg differ diff --git a/static/img/spoke-viewport-panel.jpeg b/static/img/spoke-viewport-panel.jpeg new file mode 100644 index 0000000..dd6d9b4 Binary files /dev/null and b/static/img/spoke-viewport-panel.jpeg differ diff --git a/static/img/spoke-viewport.jpeg b/static/img/spoke-viewport.jpeg new file mode 100644 index 0000000..77a7d0f Binary files /dev/null and b/static/img/spoke-viewport.jpeg differ diff --git a/static/img/spoke.png b/static/img/spoke.png new file mode 100644 index 0000000..38d5643 Binary files /dev/null and b/static/img/spoke.png differ diff --git a/static/img/state-example.png b/static/img/state-example.png new file mode 100644 index 0000000..dfd81c6 Binary files /dev/null and b/static/img/state-example.png differ diff --git a/static/img/sumo-support.png b/static/img/sumo-support.png new file mode 100644 index 0000000..43f2fd9 Binary files /dev/null and b/static/img/sumo-support.png differ diff --git a/static/img/tags-examples.png b/static/img/tags-examples.png new file mode 100644 index 0000000..350de7d Binary files /dev/null and b/static/img/tags-examples.png differ diff --git a/static/img/theme-entry-screen.png b/static/img/theme-entry-screen.png new file mode 100644 index 0000000..cf0317f Binary files /dev/null and b/static/img/theme-entry-screen.png differ diff --git a/static/img/theme-menus.png b/static/img/theme-menus.png new file mode 100644 index 0000000..56cefea Binary files /dev/null and b/static/img/theme-menus.png differ diff --git a/static/img/theme-toolbar.png b/static/img/theme-toolbar.png new file mode 100644 index 0000000..498fb5b Binary files /dev/null and b/static/img/theme-toolbar.png differ diff --git a/static/img/themes-diagram-accept-cancel.jpg b/static/img/themes-diagram-accept-cancel.jpg new file mode 100644 index 0000000..a2f8588 Binary files /dev/null and b/static/img/themes-diagram-accept-cancel.jpg differ diff --git a/static/img/themes-diagram-more-menu.jpg b/static/img/themes-diagram-more-menu.jpg new file mode 100644 index 0000000..3e61de8 Binary files /dev/null and b/static/img/themes-diagram-more-menu.jpg differ diff --git a/static/img/themes-diagram-toolbar.jpeg b/static/img/themes-diagram-toolbar.jpeg new file mode 100644 index 0000000..1138915 Binary files /dev/null and b/static/img/themes-diagram-toolbar.jpeg differ diff --git a/static/img/themes-tab.png b/static/img/themes-tab.png new file mode 100644 index 0000000..9f451a0 Binary files /dev/null and b/static/img/themes-tab.png differ diff --git a/static/img/ui-image.jpg b/static/img/ui-image.jpg new file mode 100644 index 0000000..bce246a Binary files /dev/null and b/static/img/ui-image.jpg differ diff --git a/static/img/update-domain.mp4 b/static/img/update-domain.mp4 new file mode 100644 index 0000000..5360b8f Binary files /dev/null and b/static/img/update-domain.mp4 differ diff --git a/static/img/upgrade-button.png b/static/img/upgrade-button.png new file mode 100644 index 0000000..9d52dc6 Binary files /dev/null and b/static/img/upgrade-button.png differ diff --git a/static/img/upload-pending.png b/static/img/upload-pending.png new file mode 100644 index 0000000..cda35a3 Binary files /dev/null and b/static/img/upload-pending.png differ diff --git a/static/img/user_interface.jpeg b/static/img/user_interface.jpeg new file mode 100644 index 0000000..2626fc7 Binary files /dev/null and b/static/img/user_interface.jpeg differ diff --git a/static/img/user_interface_placeholder.jpeg b/static/img/user_interface_placeholder.jpeg new file mode 100644 index 0000000..3b047e1 Binary files /dev/null and b/static/img/user_interface_placeholder.jpeg differ diff --git a/static/img/verify-account.mp4 b/static/img/verify-account.mp4 new file mode 100644 index 0000000..421114d Binary files /dev/null and b/static/img/verify-account.mp4 differ diff --git a/static/img/wait-for-subdomain.mp4 b/static/img/wait-for-subdomain.mp4 new file mode 100644 index 0000000..1fa3aec Binary files /dev/null and b/static/img/wait-for-subdomain.mp4 differ