diff --git a/.codecov.yml b/.codecov.yml deleted file mode 100644 index a3a8cc4a..00000000 --- a/.codecov.yml +++ /dev/null @@ -1,29 +0,0 @@ -# Docs: - -github_checks: # https://docs.codecov.com/docs/github-checks#disabling-github-checks-patch-annotations-via-yaml - annotations: false - -coverage: - # coverage lower than 50 is red, higher than 90 green - range: 30..80 - - status: - project: - default: - # Choose a minimum coverage ratio that the commit must meet to be considered a success. - # - # `auto` will use the coverage from the base commit (pull request base or parent commit) coverage to compare - # against. - target: auto - - # Allow the coverage to drop by X%, and posting a success status. - threshold: 5% - - # Resulting status will pass no matter what the coverage is or what other settings are specified. - informational: true - - patch: - default: - target: auto - threshold: 5% - informational: true diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..ce1994e4 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json", + "name": "RUA dev-container", + "image": "node:21-bookworm", + "features": { + "ghcr.io/devcontainers/features/github-cli:1": {}, + "ghcr.io/devcontainers/features/sshd:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "streetsidesoftware.code-spell-checker" + ] + } + }, + "postCreateCommand": "npm install" +} diff --git a/.editorconfig b/.editorconfig index d99392eb..2aa43ba1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,5 +10,9 @@ indent_style = space indent_size = 2 trim_trailing_whitespace = true +[{*.yml,*.yaml}] +ij_any_spaces_within_braces = false +ij_any_spaces_within_brackets = false + [Makefile] indent_style = tab diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f143ac12..5ca591d0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,8 +1,3 @@ -# @link +# docs: https://help.github.com/en/articles/about-code-owners * @tarampampam -/public/_locales/zh_CN/ @yfdyh000 -/public/_locales/pt_BR/ @inkhorn-ptbr -/public/_locales/de/ @Xenorio -/public/_locales/fr/ @maxgfr -/public/_locales/id/ @tustoz diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index e1121acd..47fe74df 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -1,4 +1,5 @@ -# Docs: +# yaml-language-server: $schema=https://json.schemastore.org/github-issue-forms.json +# docs: https://git.io/JR5E4 name: ๐Ÿž Bug report description: File a bug/issue @@ -47,10 +48,9 @@ body: id: version attributes: label: Extension version - placeholder: 3.x.x + placeholder: 4.x.x - type: textarea attributes: label: Anything else? description: Links? References? Anything that will give us more context about the issue you are encountering! - placeholder: You can attach images or log files by clicking this area to highlight it and then dragging files in diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 0283b5e3..29b6064a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,5 @@ -# Docs: +# yaml-language-server: $schema=https://json.schemastore.org/github-issue-config.json +# docs: https://git.io/JP3tm blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index 27111a69..b8d0ea5b 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -1,4 +1,5 @@ -# Docs: +# yaml-language-server: $schema=https://json.schemastore.org/github-issue-forms.json +# docs: https://git.io/JR5E4 name: ๐Ÿ’ก Feature request description: Suggest an idea for this browser extension diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 183b33a4..4d70af5a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,4 +1,5 @@ -# Docs: +# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json +# docs: https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/customizing-dependency-updates version: 2 @@ -7,14 +8,12 @@ updates: directory: / open-pull-requests-limit: 15 groups: - production: {dependency-type: production, update-types: [minor, patch]} - development: {dependency-type: development, update-types: [minor, patch]} + npm-production: {dependency-type: production, update-types: [minor, patch]} + npm-development: {dependency-type: development, update-types: [minor, patch]} schedule: {interval: monthly} - assignees: [tarampampam] - package-ecosystem: github-actions directory: / groups: - any: {patterns: ['*']} + github-actions: {patterns: ['*']} schedule: {interval: monthly} - assignees: [tarampampam] diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index bd6ba4fa..00000000 --- a/.github/renovate.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "github>tarampampam/.github//renovate/default", - ":rebaseStalePrs" - ] -} diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml index d09c2c69..53955f6f 100644 --- a/.github/workflows/dependabot.yml +++ b/.github/workflows/dependabot.yml @@ -1,4 +1,7 @@ -name: dependabot +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json +# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions + +name: ๐Ÿค– Dependabot on: pull_request: {} @@ -9,17 +12,16 @@ permissions: jobs: dependabot: # https://tinyurl.com/e69djmen + name: Enable auto-merge for Dependabot PRs runs-on: ubuntu-latest if: ${{ github.actor == 'dependabot[bot]' }} steps: - - uses: dependabot/fetch-metadata@v1 + - uses: dependabot/fetch-metadata@v2 id: metadata with: {github-token: "${{ secrets.GITHUB_TOKEN }}"} - - name: Enable auto-merge for Dependabot PRs - if: ${{ contains(fromJSON('["version-update:semver-minor", "version-update:semver-patch"]'), steps.metadata.outputs.update-type) }} + - if: ${{ contains(fromJSON('["version-update:semver-minor", "version-update:semver-patch"]'), steps.metadata.outputs.update-type) }} run: gh pr merge --auto --merge "$PR_URL" - continue-on-error: true env: PR_URL: ${{ github.event.pull_request.html_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/deploy-website-cf-challenge-test.yml b/.github/workflows/deploy-website-cf-challenge-test.yml new file mode 100644 index 00000000..f278661f --- /dev/null +++ b/.github/workflows/deploy-website-cf-challenge-test.yml @@ -0,0 +1,36 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json +# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions + +name: ๐Ÿš€ Deploy the CF challenge test website + +on: + workflow_dispatch: {} + push: + branches: [rewrite] #[master, main] # TODO: change this + tags-ignore: ['**'] + paths: [website/cf-challenge-test/**, .github/workflows/deploy-website-cf-challenge-test.yml] + +concurrency: + group: ${{ github.ref }}-cf-challenge-test-website + cancel-in-progress: true + +jobs: + publish: + name: Publish the site + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: cloudflare/wrangler-action@v3 + env: + PROJECT_NAME: random-user-agent-cf-challenge-test + DIST_DIR: ./website/cf-challenge-test + CF_BRANCH_NAME: main # to deploy as "Production" environment on Cloudflare Pages + with: + apiToken: ${{ secrets.CLOUDFLARE_PAGES_DEPLOY_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: + pages deploy ${{ env.DIST_DIR }} + --project-name=${{ env.PROJECT_NAME }} + --branch ${{ env.CF_BRANCH_NAME }} + --commit-dirty=true diff --git a/.github/workflows/deploy-website-index.yml b/.github/workflows/deploy-website-index.yml new file mode 100644 index 00000000..708524d3 --- /dev/null +++ b/.github/workflows/deploy-website-index.yml @@ -0,0 +1,36 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json +# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions + +name: ๐Ÿš€ Deploy the website index + +on: + workflow_dispatch: {} + push: + branches: [rewrite] #[master, main] # TODO: change this + tags-ignore: ['**'] + paths: [website/index/**, .github/workflows/deploy-website-index.yml] + +concurrency: + group: ${{ github.ref }}-website-index + cancel-in-progress: true + +jobs: + publish: + name: Publish the site + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: cloudflare/wrangler-action@v3 + env: + PROJECT_NAME: random-user-agent-index + DIST_DIR: ./website/index + CF_BRANCH_NAME: main # to deploy as "Production" environment on Cloudflare Pages + with: + apiToken: ${{ secrets.CLOUDFLARE_PAGES_DEPLOY_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: + pages deploy ${{ env.DIST_DIR }} + --project-name=${{ env.PROJECT_NAME }} + --branch ${{ env.CF_BRANCH_NAME }} + --commit-dirty=true diff --git a/.github/workflows/deploy-website-sandbox.yml b/.github/workflows/deploy-website-sandbox.yml new file mode 100644 index 00000000..f958f129 --- /dev/null +++ b/.github/workflows/deploy-website-sandbox.yml @@ -0,0 +1,36 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json +# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions + +name: ๐Ÿš€ Deploy the sandbox website + +on: + workflow_dispatch: {} + push: + branches: [rewrite] #[master, main] # TODO: change this + tags-ignore: ['**'] + paths: [website/sandbox/**, .github/workflows/deploy-website-sandbox.yml] + +concurrency: + group: ${{ github.ref }}-sandbox-website + cancel-in-progress: true + +jobs: + publish: + name: Publish the site + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: cloudflare/wrangler-action@v3 + env: + PROJECT_NAME: random-user-agent-ua-test-sandbox + DIST_DIR: ./website/sandbox + CF_BRANCH_NAME: main # to deploy as "Production" environment on Cloudflare Pages + with: + apiToken: ${{ secrets.CLOUDFLARE_PAGES_DEPLOY_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: + pages deploy ${{ env.DIST_DIR }} + --project-name=${{ env.PROJECT_NAME }} + --branch ${{ env.CF_BRANCH_NAME }} + --commit-dirty=true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e2b0a9c7..86cf10df 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,7 @@ -name: release +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json +# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions + +name: ๐Ÿš€ Release on: release: # Docs: @@ -10,31 +13,22 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - - uses: gacts/github-slug@v1 - id: slug - - - uses: actions/setup-node@v4 - with: {node-version: '20'} - - - uses: actions/cache@v4 - id: yarn-cache + - {uses: gacts/github-slug@v1, id: slug} + - {uses: gacts/setup-node-with-cache@v1, with: {node-version: 21}} + - run: npm install + - run: > + npm version --no-git-tag-version + "${{ steps.slug.outputs.version-major }}.${{ steps.slug.outputs.version-minor }}.${{ steps.slug.outputs.version-patch }}" + - run: npm run build + - uses: svenstaro/upload-release-action@v2 with: - path: '**/node_modules' - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: ${{ runner.os }}-yarn- - - - if: steps.yarn-cache.outputs.cache-hit != 'true' - run: yarn install --frozen-lockfile --no-progress --non-interactive - - - name: Set the extension version - run: yarn version --no-git-tag-version --no-commit-hooks --new-version "${{ steps.slug.outputs.version-semantic }}" - - - run: yarn build - + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ./dist/chrome.zip + asset_name: random-user-agent-chrome.zip + tag: ${{ github.ref }} - uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: dist.zip - asset_name: random-user-agent.zip + file: ./dist/firefox.zip + asset_name: random-user-agent-firefox.zip tag: ${{ github.ref }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index e7c2ce0a..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: tests - -on: - push: - branches: [master, main] - tags-ignore: ['**'] - paths-ignore: ['**.md'] - pull_request: - paths-ignore: ['**.md'] - -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - gitleaks: - name: Gitleaks - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: {fetch-depth: 0} - - - name: Check for GitLeaks - uses: gacts/gitleaks@v1 # Action page: - - tests: - name: Run unit tests - runs-on: ubuntu-latest - env: {FORCE_COLOR: 'true'} - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: {node-version: '20'} - - - uses: actions/cache@v4 - id: yarn-cache - with: - path: '**/node_modules' - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: ${{ runner.os }}-yarn- - - - if: steps.yarn-cache.outputs.cache-hit != 'true' - run: yarn install --frozen-lockfile --no-progress --non-interactive - - - run: yarn test --verbose --coverage - - - uses: codecov/codecov-action@v4 # Docs: - with: - token: ${{ secrets.CODECOV_TOKEN }} - file: ./coverage/clover.xml - fail_ci_if_error: false - - build: - name: Try to build - runs-on: ubuntu-latest - env: {FORCE_COLOR: 'true'} - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: {node-version: '20'} - - - uses: actions/cache@v4 - id: yarn-cache - with: - path: '**/node_modules' - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: ${{ runner.os }}-yarn- - - - if: steps.yarn-cache.outputs.cache-hit != 'true' - run: yarn install --frozen-lockfile --no-progress --non-interactive - - - run: yarn build - - - uses: actions/upload-artifact@v4 - with: - name: extension-dist - path: dist.zip - if-no-files-found: error - retention-days: 1 - - addons-linter: - name: Run addon linter (mozilla) - runs-on: ubuntu-latest - needs: [build] - env: {FORCE_COLOR: 'true'} - steps: - - uses: actions/checkout@v4 - - - uses: actions/download-artifact@v4 - with: - name: extension-dist - path: dist - - - uses: actions/setup-node@v4 - with: {node-version: '20'} - - - run: yarn global add addons-linter - - - run: addons-linter ./dist/dist.zip diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..37a9dd68 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,68 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json +# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions + +name: ๐Ÿงช Tests + +on: + workflow_dispatch: {} + push: + branches: [master, main] + tags-ignore: ['**'] + paths-ignore: ['**.md', 'website/**', 'static/**'] + pull_request: + paths-ignore: ['**.md', 'website/**', 'static/**'] + +concurrency: + group: ${{ github.ref }}-tests + cancel-in-progress: true + +env: {FORCE_COLOR: 'true'} + +jobs: + gitleaks: + name: Check for GitLeaks + runs-on: ubuntu-latest + steps: + - {uses: actions/checkout@v4, with: {fetch-depth: 0}} + - uses: gacts/gitleaks@v1 + + unit-tests: + name: Run unit tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - {uses: gacts/setup-node-with-cache@v1, with: {node-version: 21}} + - run: npm install + - run: npm run test + + eslint: + name: Run code linter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - {uses: gacts/setup-node-with-cache@v1, with: {node-version: 21}} + - run: npm install + - run: npm run lint + + build: + name: Build extension + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - {uses: gacts/setup-node-with-cache@v1, with: {node-version: 21}} + - run: npm install + - run: npm run build + - uses: actions/upload-artifact@v4 + with: {name: chrome.zip, path: ./dist/chrome.zip, if-no-files-found: error, retention-days: 30} + - uses: actions/upload-artifact@v4 + with: {name: firefox.zip, path: ./dist/firefox.zip, if-no-files-found: error, retention-days: 30} + + addons-linter: + name: Run addon linter (mozilla) + runs-on: ubuntu-latest + needs: [build] + steps: + - {uses: actions/download-artifact@v4, with: {name: firefox.zip, path: dist}} + - {uses: actions/setup-node@v4, with: {node-version: 21}} + - run: npm install -g addons-linter + - run: addons-linter ./dist/firefox.zip diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml deleted file mode 100644 index f2a82840..00000000 --- a/.github/workflows/website.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: website - -on: - workflow_dispatch: {} - push: - branches: [master, main] - paths: ['**.md', .github/workflows/website.yml] - -concurrency: - group: ${{ github.ref }}-website - cancel-in-progress: true - -jobs: - update: - permissions: - pages: write - id-token: write - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Create jekyll config file - env: {config: ./_config.yml} - run: | - echo "remote_theme: pages-themes/minimal@v0.2.0" > $config - echo "plugins: [jekyll-remote-theme]" >> $config - echo "title: Random User-Agent and Switcher" >> $config - echo "baseurl: ''" >> $config - echo "google_site_verification: RcsUxl5kqZdDhG-BU5VHhZXqwyuC6vU7PEDmMFSnbao" >> $config - - - uses: actions/configure-pages@v4 - - - uses: actions/jekyll-build-pages@v1 - - - uses: actions/upload-pages-artifact@v3 - - - {uses: actions/deploy-pages@v4, id: deployment} diff --git a/.gitignore b/.gitignore index 4bcbd68e..f842bc5b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,18 +2,17 @@ /.vscode /.idea -## Build +## dependencies +/node_modules + +## build /*.zip /crx /dist* -## Temp files & dirs +## etc +/coverage /temp /tmp -/coverage - -## Vendor -/node_modules - -## Use yarn, not npm -/package-lock.json +.vite +*.log diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 7d72c0a6..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,608 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog][keepachangelog] and this project adheres to [Semantic Versioning][semver]. - -## v3.19.0 - -### Changed - -- Update of user agent versions - -## v3.18.0 - -### Changed - -- Update of user agent versions - -## v3.17.0 - -### Changed - -- Update of user agent versions - -### Added - -- ๐Ÿ‡บ๐Ÿ‡ฆ Ukrainian localization by [@Yctftcyfc](https://github.com/Yctftcyfc) -- ๐Ÿ‡ต๐Ÿ‡ฑ Polish localization by [@Yctftcyfc](https://github.com/Yctftcyfc) -- ๐Ÿ‡ฏ๐Ÿ‡ต Japanese localization by [@webact1](https://github.com/webact1) -- ๐Ÿ‡น๐Ÿ‡ท Turkish localization by [@webact1](https://github.com/webact1) -- ๐Ÿ‡ช๐Ÿ‡ธ Spanish localization by [@webact1](https://github.com/webact1) - -## v3.16.2 - -### Changed - -- Update of user agent versions - -## v3.16.1 - -### Changed - -- Update of user agent versions - -### Fixed - -- Indonesian localization [#379] - -[379]:https://github.com/tarampampam/random-user-agent/pull/379 - -## v3.16.0 - -### Added - -- ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesian localization by [@tustoz](https://github.com/tustoz) [#377] - -[#377]:https://github.com/tarampampam/random-user-agent/pull/377 - -## v3.15.1 - -### Fixed - -- Hover icon title text [#370] - -[#370]:https://github.com/tarampampam/random-user-agent/issues/370 - -## v3.15.0 - -### Added - -- Displaying current user-agent on extension icon hover [#364] - -### Changed - -- The whitelist/blacklist modes toggle was redesigned [#369] - -### Fixed - -- Settings toggle for Black\White-List logic [#367] - -[#364]:https://github.com/tarampampam/random-user-agent/issues/364 -[#367]:https://github.com/tarampampam/random-user-agent/issues/367 -[#369]:https://github.com/tarampampam/random-user-agent/pull/369 - -## v3.14.2 - -### Fixed - -- War hint offsets (popup window scrolling) -- Icons size of quick generator switcher - -## v3.14.1 - -### Fixed - -- Quick generator switcher behavior - -## v3.14.0 - -### Added - -- Quick generator switcher in the popup window [#354] -- "Rate this addon" button (displayed until it is clicked once) [#356] -- ๐Ÿ‡ซ๐Ÿ‡ท French localization by [@maxgfr](https://github.com/maxgfr) [#355] - -### Changed - -- Extension name `Random User-Agent` → `Random User-Agent (Switcher)` [#354] -- Default generator type settings (for new users) [#356] - -### Fixed - -- Browser detection method (for internal usage only; [reason](https://bugzilla.mozilla.org/show_bug.cgi?id=1754441)) [#356] - -[#354]:https://github.com/tarampampam/random-user-agent/pull/354 -[#356]:https://github.com/tarampampam/random-user-agent/pull/356 -[#355]:https://github.com/tarampampam/random-user-agent/pull/355 - -## v3.13.1 - -### Fixed - -- Required locale for displaying the war hint - -## v3.13.0 - -### Changed - -- Extension icon reverted - -### Added - -- A war hint for Russian users - -### Removed - -- "Previous settings" tab from the options page - -## v3.12.0 - -### Added - -- Keyboard shortcut to user-agent renewal (`Ctrl+Shift+U` by default) [#289], [#352] - -[#289]:https://github.com/tarampampam/random-user-agent/issues/289 -[#352]:https://github.com/tarampampam/random-user-agent/pull/352 - -## v3.11.0 - -### Added - -- Additional HTTP header (`Sec-CH-UA-Full-Version`, header is [deprecated](https://mzl.la/3g1NzEI)) faking [#351] -- HTTP header `Sec-CH-UA-Platform-Version` replacing with empty value [#351] -- [`navigator.userAgentData`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData) object faking [#350], [#351] - -### Changed - -- Better **custom** user agents _(including remote)_ OS/engine/browser determination (is needed for more accurate masking of the browser) [#351] - -[#350]:https://github.com/tarampampam/random-user-agent/issues/350 -[#351]:https://github.com/tarampampam/random-user-agent/pull/351 - -## v3.10.0 - -### Added - -- Additional HTTP headers (`Sec-CH-UA`, `Sec-CH-UA-Full-Version-List`, `Sec-CH-UA-Platform`, `Sec-CH-UA-Mobile`) faking [#348] - -[#348]:https://github.com/tarampampam/random-user-agent/issues/348 - -## v3.9.0 - -### Changed - -- Versions of the generated user-agents - -## v3.8.0 - -### Changed - -- Versions of the generated user-agents - -## v3.7.0 - -### Changed - -- Versions of the generated user-agents - -## v3.6.0 - -### Changed - -- Versions of the generated user-agents - -## v3.5.0 - -### Added - -- Generator for "Edge on Mac" [#222] - -[#222]:https://github.com/tarampampam/random-user-agent/issues/222 - -## v3.4.0 - -### Added - -- German `de` localization (thanks to [@Xenorio](https://github.com/Xenorio)) - -### Changed - -- Versions of the generated user-agents - -### Fixed - -- Portuguese translation - -## v3.3.1 - -### Fixed - -- Navigator `oscpu` leaking [#191] - -[#191]:https://github.com/tarampampam/random-user-agent/issues/191 - -## v3.3.0 - -### Added - -- Chinese `zh_CN` localization (thanks to [@yfdyh000](https://github.com/yfdyh000)) -- Portuguese `pt_BR` localization (thanks to [@inkhorn-ptbr](https://github.com/inkhorn-ptbr)) -- "Save changes" button on the options page -- Possibility to use the remote User-Agents list [#190], [#175] - -### Changed - -- Custom user-agent list on the settings page now limited (maximal `4096` symbols are allowed, [the reason is QUOTA_BYTES_PER_ITEM](https://developer.chrome.com/docs/extensions/reference/storage/#property-sync)) -- New options page [#189] - -### Fixed - -- `extraHeaders` options bug for `onHeadersReceived` hook in FireFox -- Colors in the popup window when chrome uses the "Force Dark" feature [#184] - -[#175]:https://github.com/tarampampam/random-user-agent/issues/175 -[#190]:https://github.com/tarampampam/random-user-agent/pull/190 -[#189]:https://github.com/tarampampam/random-user-agent/pull/189 -[#184]:https://github.com/tarampampam/random-user-agent/issues/184 - -## v3.2.0 - -### Added - -- Watching for the dynamically created iframes and pathing them - -### Fixed - -- Aggressive User-Agent detection (now even the inline scripts cannot detect the real User-Agent; thanks to [@neroux](https://github.com/neroux) for the idea) [#26], [#36] -- Navigator `platform` and `vendor` leaking [#7], [#144] - -[#144]:https://github.com/tarampampam/random-user-agent/issues/144 -[#7]:https://github.com/tarampampam/random-user-agent/issues/7 -[#26]:https://github.com/tarampampam/random-user-agent/issues/26 -[#36]:https://github.com/tarampampam/random-user-agent/issues/36 - -## v3.1.1 - -### Fixed - -- User agent detection inside iframes [#142], [#36] - -[#142]:https://github.com/tarampampam/random-user-agent/issues/142 -[#36]:https://github.com/tarampampam/random-user-agent/issues/36 - -## v3.1.0 - -### Added - -- Vietnamese (`vi`) localization, translated by the robots -- Dark theme for the popup window (Firefox only) - -### Changed - -- `i18n` function calls in Vue files now with fallbacks - -## v3.0.0 - -### Changed - -- **The extension has been completely rewritten on TypeScript** -- The new settings format is not compatible with the previous version (you should migrate them manually - use the settings page to watch previous settings) -- Improved User-Agent's generator - -### Removed - -- Locales `uk` and `zh_CH` :( - -## v2.2.13 - -### Changed - -- Update of user agent versions -- Console message with faked user-agent is disabled - -## v2.2.12 - -### Changed - -- Update of user agent versions - -## v2.2.11 - -### Changed - -- Update of user agent versions -- Update of underlying regular expression library - -## v2.2.10 - -### Removed (Firefox-only) - -- Removed on Firefox the JavaScript preference as well as the script overriding the user agent ([f04e149](https://github.com/tarampampam/random-user-agent/commit/f04e149fed0adc9caa7cf70f4cbf22254fcf2cdb) and [2569b90](https://github.com/tarampampam/random-user-agent/commit/2569b90e2ff63d9d6ec26bf9e9465f777997b7a3)). - This addresses #60 and fixes #59 and #98 - -## v2.2.9 - -### Changed - -- Fix for an incomplete Chrome user agent - [0265aa3](https://github.com/tarampampam/random-user-agent/commit/0265aa3058a97953e38f253e22e262cb8285e87e) - -## v2.2.8 - -### Changed - -- Update of user agent versions - -## v2.2.7 - -### Changed - -- Update of user agent versions -- Legacy code removed - -## v2.2.6 - -### Changed - -- Updated browser versions - -## v2.2.5 - -### Changed - -- Updated Chrome, Firefox, and Edge versions - -### Added - -- Support for Firefox on Android - -## v2.2.4 - -### Fixed - -- Fixes for [#12] and [#56] - -## v2.2.3 - -### Changed - -- [cf1446f](https://github.com/tarampampam/random-user-agent/commit/cf1446f6bfdcba7b7f505a9fe653bf98a8a1bea2) and [a865956](https://github.com/tarampampam/random-user-agent/commit/a86595668389b764ac5402a602826ed7c1546832) - -## v2.2.2 - -### Changed - -- Major user agent update - -## v2.2.1 - -### Fixed - -- Fixed options windows height in Chrome 65 - -## v2.2.0 - -### Changed - -- [Added support for more than one custom user agent (chosen at random as well)](https://github.com/tarampampam/random-user-agent/commit/4aed6f999a378f0e676349ada2e57e13a0a0ece9) and [Edge 52 support](https://github.com/tarampampam/random-user-agent/commit/cd260fdd3781df169f5b83439e1c24e11ff45f9c) - -## v2.1.11 - -### Changed - -- Issue fixed where non-keyboard input of option values was ignored [#40] -- [Update of Chrome versions](https://github.com/tarampampam/random-user-agent/commit/a6dd025cc60755f54e760317fd1014eb2699d25a) - -## v2.1.10 - -### Changed - -- Added `zh_CN` localization (thx to [@yfdyh000](https://github.com/yfdyh000)) - -## v2.1.9 - -### Changed - -- Safari version update, preparations for Firefox version -- Regex fixes and JavaScript support enabled by default (88be3bd, 64f9eba, e2812b9, e34ba2d, ea9b9ba, 5f53fe3) - -## v2.1.8 - -### Fixes - -- Fixes by [@neroux](https://github.com/neroux) - -## v2.1.7 - -### Changed - -- Small UA generator fixes - -## v2.1.6 - -### Changed - -- Small UA generator fixes - -## v2.1.5 - -### Fixed - -- Issue fix [#15] - -## v2.1.4 - -### Changed - -- Text adjustments - -## v2.1.3 - -### Changed - -- Up generated browsers versions - -## v2.1.2 - -### Added - -- Gulp & bower supports -- Donation link - -### Changed - -- Refactoring - -## v2.1.1 - -### Changed - -- Up generated browsers versions - -### Fixed - -- JS-protection method [#10] - -## v2.1.0.1 - -### Fixed - -- Fix translation error - -## v2.1.0 - -### Changed - -- All tests passed, stable release - -## v2.0.5 - -### Added - -- Added Ukrainian localization - -### Removed - -- Font 'Roboto', font 'Material Icons' replaced with 'Flaticon' costom icons set - -## v2.0.4 - -### Fixed - -- Fixed manifest file error - -## v2.0.3.1 - -### Fixed - -- Small fixes - -## v2.0.3 - -### Changed - -- Fixed synchronization event - -## v2.0.2 - -### Added - -- JS-protection - -### Changed - -- Icons - -### Added - -- Russian localization - -### Fixed - -- Small fixes - -## v2.0.1 - -### Changed - -- Extension totally re-writed, repository re-created - -## v1.5.5 - -### Changed - -- Updated User-Agent strings (updated the extension to use more "current" browsers) - -## v1.5.4 - -### Fixed - -- Fixed issue where auto-refresh interval wouldn't change - -## v1.5.3 - -### Changed - -- Minor syntax amendments related to `'use strict'` - -## v1.5.2 - -### Fixed - -- A bug with loading settings (caused by the previous version update =) ) - -## v1.5.1 - -### Fixed - -- A bug with loading settings (default only after restarting the browser) - -## v1.5 - -### Added - -- Added exclusion (exception) list - -### Changed - -- Default settings -- Excluded files "content.js" - -### Fixed - -- Minor bug fixes - -## v1.4.1 - -### Changed - -- Updated language packs, minor improvements - -## v1.4 - -### Changed - -- Redesigned User-agent's algorithm change - no longer selects from one preset option, it now generates fully - have `randexp.js` to thank for it - -### Removed - -- Field "Description" as it was not correct - -### Fixed - -- A large number of small improvements - -## v1.3 - -### Added - -- Added German (de) localization, fixed bugs in the absence of initialization - -## v1.2 - -### Changed - -- First release on Github - -[keepachangelog]:https://keepachangelog.com/en/1.0.0/ -[semver]:https://semver.org/spec/v2.0.0.html diff --git a/Makefile b/Makefile index 7572c730..437bc1f7 100644 --- a/Makefile +++ b/Makefile @@ -1,32 +1,37 @@ #!/usr/bin/make # Makefile readme: -SHELL = /bin/sh -NODE_IMAGE = node:20-alpine -RUN_ARGS = --rm -v "$(shell pwd):/src:rw" --workdir "/src" -u "$(shell id -u):$(shell id -g)" -t $(NODE_IMAGE) +.DEFAULT_GOAL := build +.MAIN := build -.PHONY : help install shell build watch test clean -.DEFAULT_GOAL : help - -# This will output the help for each task. thanks to https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html -help: ## Show this help - @printf "\033[33m%s:\033[0m\n" 'Available commands' - @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[32m%-13s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) +NODE_IMAGE = node:21-alpine +RUN_ARGS = --rm -v "$(shell pwd):/src:rw" \ + -t --workdir "/src" \ + -u "$(shell id -u):$(shell id -g)" \ + -e "NPM_CONFIG_UPDATE_NOTIFIER=false" \ + -e PATH="$$PATH:/src/node_modules/.bin" $(NODE_IMAGE) +.PHONY: install install: ## Install all dependencies - docker run $(RUN_ARGS) yarn install + docker run $(RUN_ARGS) npm install +.PHONY: shell shell: ## Start shell into a container with node docker run -e "PS1=\[\033[1;34m\]\w\[\033[0;35m\] \[\033[1;36m\]# \[\033[0m\]" -i $(RUN_ARGS) sh -build: ## Build the extension (for the production) - docker run -i $(RUN_ARGS) yarn build +.PHONY: build +build: install ## Build the extension and pack it into a zip file + docker run $(RUN_ARGS) npm run build -watch: ## Watch for source changes - docker run -i $(RUN_ARGS) yarn watch +.PHONY: fmt +fmt: ## Run prettier + docker run $(RUN_ARGS) npm run fmt -test: ## Run the tests - docker run -i $(RUN_ARGS) yarn test +.PHONY: test +test: ## Run lint and tests + docker run $(RUN_ARGS) npm run lint + docker run $(RUN_ARGS) npm run test -clean: ## Make some clean - -rm -R ./dist* ./coverage +.PHONY: watch +watch: ## Start watch mode + docker run $(RUN_ARGS) npm run watch diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md index d9db914a..be5324e8 100644 --- a/PRIVACY_POLICY.md +++ b/PRIVACY_POLICY.md @@ -1,17 +1,20 @@ # Privacy Policy -Last updated: October 29, 2021 +Last updated: April 18, 2024 ## Personal data -Random User-Agent had never collected and will never collect any personal data, browsing history etc. +Random User-Agent respects your privacy and is committed to protecting any information you share with us. We do not +collect any personal data or browsing history. -In future Random User-Agent may collect browser version, platform name and some kinds of user's settings (except -blacklist/whitelist rules or any other data which can help identify user). This information is needed for decision on -implementing new features, removing unused features or suggesting default settings for new users. It will happen only -with your permission. +In the future, Random User-Agent may collect anonymized user information, such as the version of the extension +installed, whether the extension is enabled, and similar data. This information is used solely to understand how +users interact with the extension and to improve its features. Rest assured that this data cannot be used to +identify individual users or track them in any way. + +Any collection of data will occur only with your explicit consent. ## Third party services -Random User-Agent uses Chrome (Chromium) or WebExtensions Storage Sync API for storing user's settings and browser's Web -Storage API (localStorage) for storing user's Developer Tools fixes. +Random User-Agent utilizes Chrome (Chromium) or WebExtensions Storage Sync API for storing user settings and the +browser's Web Storage API (localStorage) for storing Developer Tools fixes. diff --git a/README.md b/README.md index 5f140e00..cc8ec94b 100644 --- a/README.md +++ b/README.md @@ -11,17 +11,27 @@ ## ๐Ÿ”ฅ Features list -- Incredibly lightweight (`~100KiB` archived) +- Incredibly lightweight (`~140KiB` archived) - Available in the official stores ([chrome][link-chrome-store], [firefox][link-ff-store], [edge][link-edge-store], [opera][link-opera-store]) - Can automatically change the User-Agent after a specified period of time - Change User-Agent on browser startup - Replaces `User-Agent` HTTP header - Protect against detection by JavaScript - User-Agent randomization can be customized by the user (what browsers and OS are spoofed, etc.) -- Exceptions list (blacklist/whitelist) available with option of wildcards +- Exceptions list (blacklist/whitelist) available - Allows using the remote User-Agents list - Doesn't need initial setup - just install and forget about the real user-agent leaking +[link-chrome-store]:https://chrome.google.com/webstore/detail/random-hide-user-agent/einpaelgookohagofgnnkcfjbkkgepnp +[link-ff-store]:https://addons.mozilla.org/firefox/addon/random_user_agent/ +[link-edge-store]:https://microsoftedge.microsoft.com/addons/detail/random-useragent/addfjgllfhpnacoahmmcafmaacjloded +[link-opera-store]:https://addons.opera.com/en/extensions/details/random-user-agent/ + +> [!NOTE] +> Readme file will be updated soon. + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 00000000..2fec239c --- /dev/null +++ b/manifest.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://json.schemastore.org/chrome-manifest.json", + "$docs": "https://developer.chrome.com/docs/extensions/reference/manifest", + "manifest_version": 3, + "version": "0.0.0", + "name": "__MSG_manifest_name__", + "description": "__MSG_manifest_description__", + "author": "https://github.com/tarampampam", + "homepage_url": "https://random-user-agent.com/", + "default_locale": "en", + "icons": { + "16": "assets/icons/16.png", + "32": "assets/icons/32.png", + "48": "assets/icons/48.png", + "128": "assets/icons/128.png" + }, + "options_ui": { + "page": "options/index.html", + "open_in_tab": true + }, + "background": { + "service_worker": "background.js", + "type": "module" + }, + "action": { + "default_popup": "popup/index.html", + "default_icon": { + "16": "assets/icons/16.png", + "32": "assets/icons/32.png", + "48": "assets/icons/48.png", + "128": "assets/icons/128.png" + }, + "default_title": "__MSG_manifest_action_default_title__" + }, + "commands": { + "renew-useragent": { + "description": "__MSG_manifest_command_renew_useragent__", + "suggested_key": { + "default": "Ctrl+Shift+U" + } + } + }, + "host_permissions": [ + "" + ], + "permissions": [ + "tabs", + "alarms", + "storage", + "scripting", + "declarativeNetRequest" + ], + "$what_the_specified_permissions_are_for": { + "tabs": "Obtaining the current tab URL to verify if the extension is enabled for the specific URL in the popup", + "alarms": "Scheduling user-agent renewal and other periodic tasks", + "storage": "Managing and synchronizing user settings across browser sessions", + "scripting": "Injecting user-agent modification code into web pages", + "declarativeNetRequest": "Modifying HTTP headers" + }, + "incognito": "spanning", + "minimum_chrome_version": "120" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..750598e0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10564 @@ +{ + "name": "random-user-agent", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "random-user-agent", + "version": "0.0.0", + "license": "MIT", + "dependencies": { + "@ungap/structured-clone": "^1.2.0", + "punycode": "^2.3.1", + "randexp": "^0.5.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", + "ua-parser-js": "^1.0.37" + }, + "devDependencies": { + "@types/archiver": "^6.0.2", + "@types/chrome": "^0.0.263", + "@types/node": "^20.11.30", + "@types/randomstring": "^1.1.12", + "@types/react": "^18.2.69", + "@types/react-dom": "^18.2.22", + "@types/ua-parser-js": "^0.7.39", + "@types/ungap__structured-clone": "^1.2.0", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", + "@vitejs/plugin-react": "^4.2.1", + "@vitest/coverage-v8": "^1.4.0", + "archiver": "^7.0.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "jest-environment-jsdom": "^29.7.0", + "npm": "^10.5.0", + "prettier": "^3.2.5", + "randomstring": "^1.3.0", + "sass": "^1.72.0", + "typescript": "^5.4.3", + "user-agent-data-types": "^0.4.2", + "vite": "^5.2.4", + "vitest": "^1.4.0" + }, + "engines": { + "node": ">=21" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "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==", + "dev": true, + "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-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@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.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "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/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "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==", + "dev": true, + "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/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/archiver": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.2.tgz", + "integrity": "sha512-KmROQqbQzKGuaAbmK+ZcytkJ51+YqDa7NmbXjmtC5YBLSyQYo21YaUnQ3HbaPFKL1ooo6RQ6OPYPIDyxfpDDXw==", + "dev": true, + "dependencies": { + "@types/readdir-glob": "*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/chrome": { + "version": "0.0.263", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.263.tgz", + "integrity": "sha512-As0vzv99ov3M6ZR7R6VzhMWFZXkPMrFrCEXXVrMN576Cm70fTkj7Df2CF+qEo170JepX50pd11cX6O4DSAtl2Q==", + "dev": true, + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/@types/filesystem": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz", + "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", + "dev": true, + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", + "dev": true + }, + "node_modules/@types/har-format": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.15.tgz", + "integrity": "sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/randomstring": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@types/randomstring/-/randomstring-1.1.12.tgz", + "integrity": "sha512-uLAv8k5CVgTIfBsVZ7Sx3y2V7H0Jm8ofnZguqC9WrQ8HeoEgTtRZMwi4gyda3xuqBq2/9OgI2JwcZa+x48ABxA==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.69", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.69.tgz", + "integrity": "sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", + "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/readdir-glob": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", + "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "node_modules/@types/ua-parser-js": { + "version": "0.7.39", + "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz", + "integrity": "sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==", + "dev": true + }, + "node_modules/@types/ungap__structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/ungap__structured-clone/-/ungap__structured-clone-1.2.0.tgz", + "integrity": "sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz", + "integrity": "sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/type-utils": "7.3.1", + "@typescript-eslint/utils": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.3.1.tgz", + "integrity": "sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz", + "integrity": "sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz", + "integrity": "sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/utils": "7.3.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz", + "integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz", + "integrity": "sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.3.1.tgz", + "integrity": "sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", + "semver": "^7.5.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz", + "integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.3.1", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "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/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.4.0.tgz", + "integrity": "sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.4.0" + } + }, + "node_modules/@vitest/expect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", + "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", + "dev": true, + "dependencies": { + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", + "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", + "dev": true, + "dependencies": { + "@vitest/utils": "1.4.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/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==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", + "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", + "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", + "dev": true, + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "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==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dev": true, + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dev": true, + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", + "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", + "dev": true, + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "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.30001587", + "electron-to-chromium": "^1.4.668", + "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": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "dev": true, + "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/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.715", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz", + "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", + "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz", + "integrity": "sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "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/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.4.tgz", + "integrity": "sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", + "dev": true, + "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-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/lazystream/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==", + "dev": true, + "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/lazystream/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==", + "dev": true + }, + "node_modules/lazystream/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "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==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "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/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/magicast": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.3.tgz", + "integrity": "sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "source-map-js": "^1.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "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==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.5.2.tgz", + "integrity": "sha512-cHVG7QEJwJdZyOrK0dKX5uf3R5Fd0E8AcmSES1jLtO52UT1enUKZ96Onw/xwq4CbrTZEnDuu2Vf9kCQh/Sd12w==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.2.1", + "@npmcli/config": "^8.0.2", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.6", + "@npmcli/package-json": "^5.0.2", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/redact": "^1.1.0", + "@npmcli/run-script": "^7.0.4", + "@sigstore/tuf": "^2.3.2", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.2", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.4", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.3.12", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.1", + "ini": "^4.1.2", + "init-package-json": "^6.0.2", + "is-cidr": "^5.0.5", + "json-parse-even-better-errors": "^3.0.1", + "libnpmaccess": "^8.0.1", + "libnpmdiff": "^6.0.3", + "libnpmexec": "^7.0.4", + "libnpmfund": "^5.0.1", + "libnpmhook": "^10.0.0", + "libnpmorg": "^6.0.1", + "libnpmpack": "^6.0.3", + "libnpmpublish": "^9.0.2", + "libnpmsearch": "^7.0.0", + "libnpmteam": "^6.0.0", + "libnpmversion": "^5.0.1", + "make-fetch-happen": "^13.0.0", + "minimatch": "^9.0.4", + "minipass": "^7.0.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.1.0", + "nopt": "^7.2.0", + "normalize-package-data": "^6.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-profile": "^9.0.0", + "npm-registry-fetch": "^16.2.0", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^17.0.6", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^3.0.1", + "semver": "^7.6.0", + "spdx-expression-parse": "^4.0.0", + "ssri": "^10.0.5", + "supports-color": "^9.4.0", + "tar": "^6.2.1", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "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/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.4.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^1.1.0", + "@npmcli/run-script": "^7.0.2", + "bin-links": "^4.0.1", + "cacache": "^18.0.0", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.4", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.2.0", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.5", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^4.0.0", + "ini": "^4.1.2", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^17.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "7.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.3.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.3.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "18.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.0.5", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/diff": { + "version": "5.2.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/gauge": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.3.12", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hasown": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^5.0.0", + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^3.0.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.0.5", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^4.0.4" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.0.9", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.3.0", + "diff": "^5.1.0", + "minimatch": "^9.0.4", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4", + "tar": "^6.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "7.0.10", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.1", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "proc-log": "^3.0.0", + "read": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "6.0.9", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.0", + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.2.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "5.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.3", + "@npmcli/run-script": "^7.0.2", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "10.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "9.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "16.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^1.1.0", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "17.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.10.2", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.16", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.6.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.1", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.1", + "@sigstore/sign": "^2.3.0", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.17", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "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/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "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/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "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.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/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==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "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/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "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==", + "dev": true, + "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/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "dev": true + }, + "node_modules/randomstring": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.3.0.tgz", + "integrity": "sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg==", + "dev": true, + "dependencies": { + "randombytes": "2.0.3" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, + "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-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-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "dependencies": { + "@remix-run/router": "1.15.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "dependencies": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "fsevents": "~2.3.2" + } + }, + "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==", + "dev": true, + "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-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "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/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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-cjs": { + "name": "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", + "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", + "dev": true, + "dependencies": { + "js-tokens": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", + "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "dev": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/tinybench": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", + "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", + "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "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==", + "dev": true, + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/user-agent-data-types": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz", + "integrity": "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", + "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", + "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", + "dev": true, + "dependencies": { + "@vitest/expect": "1.4.0", + "@vitest/runner": "1.4.0", + "@vitest/snapshot": "1.4.0", + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.4.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.4.0", + "@vitest/ui": "1.4.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "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/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/package.json b/package.json index 29cbf048..fcbe0d83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "random-user-agent", "version": "0.0.0", + "type": "module", "author": { "name": "paramtamtam", "url": "https://github.com/tarampampam" @@ -15,58 +16,96 @@ }, "homepage": "https://github.com/tarampampam/random-user-agent#readme", "scripts": { - "watch": "webpack --config webpack/webpack.dev.js --watch", - "build": "webpack --config webpack/webpack.prod.js", - "test": "jest" + "fmt": "prettier --config package.json --write ./src ./*.ts && npm run lint:es -- --fix", + "lint": "npm run lint:ts && npm run lint:es", + "lint:ts": "tsc --noEmit", + "lint:es": "eslint --config package.json ./src/**/*.{ts,tsx}", + "test": "vitest --run --logHeapUsage --dir ./src", + "test:cover": "vitest --run --dir ./src --coverage --coverage.provider=v8 --coverage.reporter=clover --coverage.reporter=text-summary", + "watch": "vite build --watch --minify=false", + "build": "tsc --noEmit && vite build" }, "dependencies": { + "@ungap/structured-clone": "^1.2.0", + "punycode": "^2.3.1", "randexp": "^0.5.3", - "ua-parser-js": "^1.0.37", - "vue": "^3.4.26", - "vuex": "^4.1.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", + "ua-parser-js": "^1.0.37" }, "devDependencies": { - "@types/chrome": "^0.0.267", - "@types/jest": "^27.4.1", + "@types/archiver": "^6.0.2", + "@types/chrome": "^0.0.263", + "@types/node": "^20.11.30", + "@types/randomstring": "^1.1.12", + "@types/react": "^18.2.69", + "@types/react-dom": "^18.2.22", "@types/ua-parser-js": "^0.7.39", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.1", - "filemanager-webpack-plugin": "^8.0.0", - "jest": "^27.5.1", - "json-minimizer-webpack-plugin": "^4.0.0", + "@types/ungap__structured-clone": "^1.2.0", + "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/parser": "^7.3.1", + "@vitejs/plugin-react": "^4.2.1", + "@vitest/coverage-v8": "^1.4.0", + "archiver": "^7.0.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "jest-environment-jsdom": "^29.7.0", + "npm": "^10.5.0", + "prettier": "^3.2.5", "randomstring": "^1.3.0", - "sass": "^1.76.0", - "sass-loader": "^14.2.1", - "terser-webpack-plugin": "^5.3.10", - "ts-jest": "^27.1.4", - "ts-loader": "^9.5.1", - "type-fest": "^4.18.1", - "typescript": "^4.9.5", + "sass": "^1.72.0", + "typescript": "^5.4.3", "user-agent-data-types": "^0.4.2", - "vue-loader": "^17.4.2", - "vue-style-loader": "^4.1.3", - "webpack": "^5.91.0", - "webpack-cli": "^5.1.4", - "webpack-merge": "^5.10.0" + "vite": "^5.2.4", + "vitest": "^1.4.0" }, - "engines": { - "node": ">=20" - }, - "jest": { - "roots": [ - "src" - ], - "collectCoverageFrom": [ - "src/**/*.{js,ts}" + "eslintConfig": { + "root": true, + "env": { + "browser": true, + "es6": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended", + "plugin:react-hooks/recommended" ], - "coverageReporters": [ - "clover", - "json", - "text" + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022, + "sourceType": "module", + "project": true + }, + "plugins": [ + "@typescript-eslint", + "react-refresh", + "react" ], - "testEnvironment": "jsdom", - "transform": { - "^.+\\.ts$": "ts-jest" - } + "settings": { + "react": { + "version": "detect" + } + }, + "rules": { + "react/react-in-jsx-scope": "off", + "no-case-declarations": "off" + }, + "ignorePatterns": [ + "dist/*" + ] + }, + "prettier": { + "semi": false, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 120, + "trailingComma": "es5" + }, + "engines": { + "node": ">=21" } } diff --git a/public/_locales/de/full_description.txt b/public/_locales/de/full_description.txt deleted file mode 100644 index e07764c9..00000000 --- a/public/_locales/de/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - eine Zeichenfolge die an jede Webseite die du besuchst gesendet wird. Er ist eine Art Fingerabdruck deines Browsers und beinhaltet: - -โญ๏ธ Den Namen und die Version deines Browsers -โญ๏ธ Den Namen deines Betriebssystems (Mac, Windows, Linux, usw.) und dessen Version -โญ๏ธ Informationen รผber manche installierte Plugins -โญ๏ธ Andere Informationen, welche dich indentifizieren - -๐Ÿš€ Diese erweiterung wurde erstellt um Datenlecks zu stoppen. - -Sie verรคndert den User-Agent nach einer bestimmten Zeitspanne automatisch zu einem zufรคllig ausgesuchten. User-Agents kรถnnen auch manuell gesetzt werden. Die Erweiterung ist unglaublich leichtgewichtig, sie benutzt nur sehr wenige Ressourcen. Die User-Agent zufallsgenerierung kann vom Benutzer angepasst werden (welche Browser und Betriebssysteme ausgewรคhlt werden, usw.). Eine Ausnahmeliste mit optionalen Wildcards ist verfรผgbar. Schรผtzt vor JavaScript Schwachstellen um deine Identitรคt zu verstecken und deine Anonymitรคt zu schรผtzen. - -Vรถllig kostenlos und ohne Werbung. - -Made with โค๏ธ Quellcode: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json deleted file mode 100644 index a1fbb5be..00000000 --- a/public/_locales/de/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "ร„ndere den User-Agent automatisch nach einer bestimmten Zeitspanne, was deinen echten User-Agent versteckt" - }, - "manifest_action_default_title": { - "message": "Randomisiere deinen User-Agent" - }, - "manifest_command_renew_useragent": {"message": "Neuen Agent anfordern"}, - - "active_user_agent": {"message": "Aktiver User-Agent"}, - "pause_switcher": {"message": "Switcher pausieren"}, - "unpause_switcher": {"message": "Switcher fortsetzen"}, - "enable_switcher": {"message": "Switcher aktivieren"}, - "enabled_on_this_domain": {"message": "Auf dieser Domain aktiviert"}, - "get_new_agent": {"message": "Neuen Agent anfordern"}, - "open_settings": {"message": "Einstellungen รถffnen"}, - "make_donation": {"message": "Spenden"}, - "bug_report": {"message": "Fehler melden"}, - - "general_settings": {"message": "Generelle Einstellungen"}, - "general_settings_hint": {"message": "ร„ndere das Verhalten des Switchers, um ihn deinen Anforderungen anzupassen"}, - "auto_renew": {"message": "ร„ndere den User-Agent nach einer bestimmten Zeitspanne automatisch"}, - "auto_renew_interval": {"message": "Zeit (in Sekunden) um den User-Agenten zu aktualisieren (z.B. 1 Stunde = 3600)"}, - "auto_renew_on_startup": {"message": "ร„ndere den User-Agent beim Starten des Browsers"}, - "js_protection": {"message": "Schรผtze vor Erkennung durch JavaScript"}, - "custom_useragent": {"message": "Benutze eigene User-Agenten statt der generierten"}, - "custom_useragent_list": {"message": "Benutzerdefinierte User-Agenten (setze einen spezifischen User-Agent, einer pro Zeile)"}, - "generator_settings": {"message": "Generator Einstellungen"}, - "generator_settings_hint": {"message": "Hier kannst du das Verhalten des Switchers anpassen"}, - "blacklist_settings": {"message": "Blacklist Einstellungen"}, - "blacklist_settings_hint": {"message": "Blacklist Modus - wechseln รผberall aktiviert, auรŸer die definierten Domains & Regeln. Whitelist - andersherum, รผberall deaktiviert auรŸer die definierten Domains & Regeln"}, - "blacklist_mode": {"message": "Blacklist Modus"}, - "whitelist_mode": {"message": "Whitelist Modus"}, - "blacklist_domains": {"message": "Domainnamen Liste (eine pro Zeile)"}, - "blacklist_custom_rules": {"message": "Benutzerdefinierte Regeln (eine pro Zeile)"}, - "blacklist_custom_rules_hint": {"message": "Du kannst Wildcards wie * und ? benutzen. * reprรคsentiert eine beliebige Menge an Zeichen (z.B. *google.com reprรคsentiert google.com, www.google.com, mail.google.com, usw.), ? reprรคsentiert nur ein einziges Zeichen (z.B. www.?oogle.com reprรคsentiert www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, usw.)"}, - "remove": {"message": "Entfernen"}, - "save_changes": {"message": "ร„nderungen speichern"}, - "error_occurred": {"message": "Ein Fehler ist aufgetreten"}, - "like_this_extension": {"message": "Gefรคllt dir diese Erweiterung?"}, - "give_a_star_on_github": {"message": "Gib uns einen Stern auf GitHub!"}, - "remote_useragent_list": {"message": "Benutze einen der (in zufรคlliger Reihenfolge) User-Agenten aus der Liste bei der folgenden URL"}, - "remote_useragent_list_hint": {"message": "Die Erweiterung wird sie periodisch herunterladen um sie aktuell zu halten"}, - "remote_useragent_updating_interval": {"message": "Aktualisierungs Intervall (in Sekunden; z.B. alle 3 Stunden = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Jetzt aktualisieren"}, - "please_rate_extension": {"message": "Bitte bewerten Sie dieses Addon!"}, - - "edge_win": {"message": "Edge auf Windows"}, - "edge_mac": {"message": "Edge auf Mac"}, - "chrome_win": {"message": "Chrome auf Windows"}, - "chrome_mac": {"message": "Chrome auf Mac"}, - "chrome_linux": {"message": "Chrome auf Linux"}, - "chrome_android": {"message": "Chrome auf Android"}, - "firefox_win": {"message": "Firefox auf Windows"}, - "firefox_mac": {"message": "Firefox auf Mac"}, - "firefox_linux": {"message": "Firefox auf Linux"}, - "firefox_android": {"message": "Firefox auf Android"}, - "opera_win": {"message": "Opera auf Windows"}, - "opera_mac": {"message": "Opera auf Mac"}, - "safari_iphone": {"message": "Safari auf iPhone"}, - "safari_mac": {"message": "Safari auf Mac"} -} diff --git a/public/_locales/en/full_description.txt b/public/_locales/en/full_description.txt deleted file mode 100644 index a94f4b12..00000000 --- a/public/_locales/en/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - a string that is sent along to any website you visit. This is a sort of "fingerprint" your browser leaves behind which contains: - -โญ๏ธ The name and version of your browser -โญ๏ธ The name of the operating system (Mac, Windows, Linux, etc.) and its version -โญ๏ธ Information about some plugins installed on the browser -โญ๏ธ Other information that identifies and exposes you - -๐Ÿš€ This extension has been created to stop data leakage and emulate different devices in the simplest way! - -It automatically replaces User-Agent strings after a specified period of time with a randomized one. User-Agent strings can also be set manually. The extension is incredibly lightweight, using very few resources. User-Agent randomization can be customized by the user (what browsers and OS are spoofed, etc.). Exceptions list available with the option of wildcards. Protects against Javascript exploits to hide your identity and protect your anonymity. - -Completely free and with no ads. - -Made with โค๏ธ Source code: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json deleted file mode 100644 index f21e4f20..00000000 --- a/public/_locales/en/messages.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)", - "description": "Maximum of 45 characters" - }, - "manifest_description": { - "message": "Automatically change the user agent after specified period of time to a randomly selected one, thus hiding your real user agent", - "description": "No HTML or other formatting; no more than 132 characters" - }, - "manifest_action_default_title": { - "message": "Randomize your User-Agent", - "description": "The tooltip, or title, appears when the user hovers the mouse on the extension's icon in the toolbar" - }, - "manifest_command_renew_useragent": {"message": "Get new agent"}, - - "active_user_agent": {"message": "Active User-Agent"}, - "pause_switcher": {"message": "Pause Switcher"}, - "unpause_switcher": {"message": "Resume Switcher"}, - "enable_switcher": {"message": "Enable Switcher"}, - "enabled_on_this_domain": {"message": "Enabled on this domain"}, - "get_new_agent": {"message": "Get new agent"}, - "open_settings": {"message": "Open settings"}, - "make_donation": {"message": "Donate"}, - "bug_report": {"message": "Bug report"}, - - "general_settings": {"message": "General settings"}, - "general_settings_hint": {"message": "Change the behavior of the switcher to best fit your needs"}, - "auto_renew": {"message": "Automatically change the User-Agent after specified period of time"}, - "auto_renew_interval": {"message": "Time (in seconds) to automatically update the User-Agent (e.g. 1 hour = 3600)"}, - "auto_renew_on_startup": {"message": "Change User-Agent on browser startup"}, - "js_protection": {"message": "Protect against detection by JavaScript"}, - "custom_useragent": {"message": "Use one of (in the randomized order) custom User-Agent instead generated"}, - "custom_useragent_list": {"message": "Custom User-Agents (set a specific User-Agents, one per line)"}, - "generator_settings": {"message": "Generator settings"}, - "generator_settings_hint": {"message": "Here you can change the agent switching behavior"}, - "blacklist_settings": {"message": "Blacklist settings"}, - "blacklist_settings_hint": {"message": "Blacklist mode - switching enabled everywhere, except the defined domains & rules. Whitelist - on the contrary, disabled everywhere except the specified domains & rules"}, - "blacklist_mode": {"message": "Blacklist mode"}, - "whitelist_mode": {"message": "Whitelist mode"}, - "blacklist_domains": {"message": "Domain names list (one per line)"}, - "blacklist_custom_rules": {"message": "Custom rules (one per line)"}, - "blacklist_custom_rules_hint": {"message": "You can use wildcards such as * and ?. * will match any length of characters (e.g. *google.com will match google.com, www.google.com, mail.google.com, etc.), ? will match only a single character (e.g. www.?oogle.com will match www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, etc.)"}, - "remove": {"message": "Remove"}, - "save_changes": {"message": "Save changes"}, - "error_occurred": {"message": "Error occurred"}, - "like_this_extension": {"message": "Do you like this extension?"}, - "give_a_star_on_github": {"message": "Give us a star on GitHub!"}, - "remote_useragent_list": {"message": "Use one of (in the randomized order) the User-Agents from the list by the following URL"}, - "remote_useragent_list_hint": {"message": "The extension will periodically download it to keep it up to date"}, - "remote_useragent_updating_interval": {"message": "Updating interval (in seconds; e.g. every 3 hours = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Update now"}, - "please_rate_extension": {"message": "Please, rate this addon!"}, - - "edge_win": {"message": "Edge on Windows"}, - "edge_mac": {"message": "Edge on Mac" }, - "chrome_win": {"message": "Chrome on Windows"}, - "chrome_mac": {"message": "Chrome on Mac"}, - "chrome_linux": {"message": "Chrome on Linux"}, - "chrome_android": {"message": "Chrome on Android"}, - "firefox_win": {"message": "FireFox on Windows"}, - "firefox_mac": {"message": "FireFox on Mac"}, - "firefox_linux": {"message": "FireFox on Linux"}, - "firefox_android": {"message": "Firefox on Android"}, - "opera_win": {"message": "Opera on Windows"}, - "opera_mac": {"message": "Opera on Mac"}, - "safari_iphone": {"message": "Safari on iPhone"}, - "safari_mac": {"message": "Safari on Mac"} -} diff --git a/public/_locales/es/full_description.txt b/public/_locales/es/full_description.txt deleted file mode 100644 index 7379a473..00000000 --- a/public/_locales/es/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent: cadena que se envรญa a cualquier sitio web que visite. Se trata de una especie de "huella digital" que deja su navegador y que contiene: - -โญ๏ธ El nombre y la versiรณn de su navegador -โญ๏ธ El nombre del sistema operativo (Mac, Windows, Linux, etc.) y su versiรณn -โญ๏ธ Informaciรณn sobre algunos plugins instalados en el navegador -โญ๏ธ Otros datos que te identifican y te dejan en evidencia - -๐Ÿš€ ยกEsta extensiรณn ha sido creada para detener la fuga de datos y emular diferentes dispositivos de la forma mรกs sencilla! - -Reemplaza automรกticamente las cadenas User-Agent despuรฉs de un perรญodo de tiempo especificado por una aleatoria. Las cadenas User-Agent tambiรฉn se pueden configurar manualmente. La extensiรณn es increรญblemente ligera y utiliza muy pocos recursos. La aleatorizaciรณn de User-Agent puede ser personalizada por el usuario (quรฉ navegadores y SO son suplantados, etc.). Lista de excepciones disponible con la opciรณn de comodines. Protege contra exploits Javascript para ocultar su identidad y proteger su anonimato. - -Completamente gratuito y sin anuncios. - -Hecho con โค๏ธ Cรณdigo fuente: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json deleted file mode 100644 index 4e982185..00000000 --- a/public/_locales/es/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "Cambiar automรกticamente el agente de usuario despuรฉs de un perรญodo de tiempo especificado a uno seleccionado al azar, ocultando asรญ su agente de usuario real" - }, - "manifest_action_default_title": { - "message": "Aleatorice su User-Agent" - }, - "manifest_command_renew_useragent": {"message": "Obtener nuevo agente"}, - - "active_user_agent": {"message": "Agente de usuario activo"}, - "pause_switcher": {"message": "Conmutador de pausa"}, - "unpause_switcher": {"message": "Reanudar el cambio"}, - "enable_switcher": {"message": "Activar conmutador"}, - "enabled_on_this_domain": {"message": "Activado en este dominio"}, - "get_new_agent": {"message": "Obtener nuevo agente"}, - "open_settings": {"message": "Abrir ajustes"}, - "make_donation": {"message": "Donar"}, - "bug_report": {"message": "Informe de error"}, - - "general_settings": {"message": "Configuraciรณn general"}, - "general_settings_hint": {"message": "Cambia el comportamiento del conmutador para adaptarlo mejor a tus necesidades"}, - "auto_renew": {"message": "Cambiar automรกticamente el User-Agent despuรฉs de un perรญodo de tiempo especificado"}, - "auto_renew_interval": {"message": "Tiempo (en segundos) para actualizar automรกticamente el User-Agent (por ejemplo, 1 hora = 3600)"}, - "auto_renew_on_startup": {"message": "Cambiar el User-Agent al iniciar el navegador"}, - "js_protection": {"message": "Protecciรณn contra la detecciรณn mediante JavaScript"}, - "custom_useragent": {"message": "Utilice uno de (en el orden aleatorio) User-Agent personalizado en lugar generado"}, - "custom_useragent_list": {"message": "User-Agents personalizados (establecer un User-Agents especรญfico, uno por lรญnea)"}, - "generator_settings": {"message": "Ajustes del generador"}, - "generator_settings_hint": {"message": "Aquรญ puede cambiar el comportamiento de cambio de agente"}, - "blacklist_settings": {"message": "Configuraciรณn de la lista negra"}, - "blacklist_settings_hint": {"message": "Modo Lista Negra - conmutaciรณn habilitada en todas partes, excepto en los dominios y reglas definidos. Lista blanca - por el contrario, desactivada en todas partes excepto en los dominios & reglas especificados"}, - "blacklist_mode": {"message": "Modo lista negra"}, - "whitelist_mode": {"message": "Modo de lista blanca"}, - "blacklist_domains": {"message": "Lista de nombres de dominio (uno por lรญnea)"}, - "blacklist_custom_rules": {"message": "Reglas personalizadas (una por lรญnea)"}, - "blacklist_custom_rules_hint": {"message": "Puede utilizar comodines como * y ?. * coincide con cualquier nรบmero de caracteres (por ejemplo, *google.com coincide con google.com, www.google.com, mail.google.com, etc.), ? coincide con un solo carรกcter (por ejemplo, www.?oogle.com coincide con www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, etc.)."}, - "remove": {"message": "Eliminar"}, - "save_changes": {"message": "Guardar cambios"}, - "error_occurred": {"message": "Se ha producido un error"}, - "like_this_extension": {"message": "ยฟLe gusta esta extensiรณn?"}, - "give_a_star_on_github": {"message": "ยกDanos una estrella en GitHub!"}, - "remote_useragent_list": {"message": "Utilice uno de los User-Agents (en orden aleatorio) de la lista de la siguiente URL"}, - "remote_useragent_list_hint": {"message": "La extensiรณn lo descargarรก periรณdicamente para mantenerlo actualizado"}, - "remote_useragent_updating_interval": {"message": "Intervalo de actualizaciรณn (en segundos; por ejemplo, cada 3 horas = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Actualizar ahora"}, - "please_rate_extension": {"message": "Por favor, valora este complemento"}, - - "edge_win": {"message": "Edge en Windows"}, - "edge_mac": {"message": "Edge en Mac" }, - "chrome_win": {"message": "Chrome en Windows"}, - "chrome_mac": {"message": "Chrome en Mac"}, - "chrome_linux": {"message": "Chrome en Linux"}, - "chrome_android": {"message": "Chrome en Android"}, - "firefox_win": {"message": "FireFox en Windows"}, - "firefox_mac": {"message": "FireFox en Mac"}, - "firefox_linux": {"message": "FireFox en Linux"}, - "firefox_android": {"message": "Firefox en Android"}, - "opera_win": {"message": "Opera en Windows"}, - "opera_mac": {"message": "Opera en Mac"}, - "safari_iphone": {"message": "Safari en iPhone"}, - "safari_mac": {"message": "Safari en Mac"} -} diff --git a/public/_locales/fr/full_description.txt b/public/_locales/fr/full_description.txt deleted file mode 100644 index 8249b43a..00000000 --- a/public/_locales/fr/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - est une en-tรชte envoyรฉe ร  chaque site Web visitรฉ. Il s'agit d'une sorte d'"empreinte digitale" laissรฉe par votre navigateur qui contient: - -โญ๏ธ Le nom et la version de votre navigateur -โญ๏ธ Le nom du systรจme d'exploitation (Mac, Windows, Linux, etc.) et sa version -โญ๏ธ Des informations sur certains plugins installรฉs sur le navigateur -โญ๏ธ D'autres informations qui vous identifient et vous exposent - -๐Ÿš€ Cette extension a รฉtรฉ crรฉรฉe pour arrรชter la fuite de donnรฉes. - -Il remplace automatiquement les en-tรชtes User-Agent aprรจs une certaine pรฉriode alรฉatoire. Les en-tรชtes User-Agent peuvent รฉgalement รชtre dรฉfinies manuellement. L'extension est ร  la fois lรฉgรจre et peu รฉnergivore en ressources. Les paramรจtres alรฉatoires de l'extension User-Agent peuvent รชtre personnalisรฉe par l'utilisateur (quels navigateurs et OS sont usurpรฉs, etc.). Il est possible d'utiliser des caractรจres gรฉnรฉriques pour mettre une liste d'exception en place. L'extension protรจge รฉgalement contre les failles Javascript en cachant votre identitรฉ et protรฉgeant votre anonymat. - -Entiรจrement gratuit et sans publicitรฉ. - -Fabriquรฉ avec โค๏ธ Code source: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/fr/messages.json b/public/_locales/fr/messages.json deleted file mode 100644 index a3ab7197..00000000 --- a/public/_locales/fr/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "Mets ร  jour de maniรจre automatique et alรฉatoire le User-Agent de ton navigateur afin de masquer au mieux ton identitรฉ" - }, - "manifest_action_default_title": { - "message": "User-Agent alรฉatoire" - }, - "manifest_command_renew_useragent": {"message": "Gรฉnรฉrer un nouveau User-Agent"}, - - "active_user_agent": {"message": "User-Agent actif"}, - "pause_switcher": {"message": "Mettre en pause le Switcher"}, - "unpause_switcher": {"message": "Rรฉactiver le Switcher"}, - "enable_switcher": {"message": "Activer le Switcher"}, - "enabled_on_this_domain": {"message": "Autoriser ce domaine"}, - "get_new_agent": {"message": "Gรฉnรฉrer un nouveau User-Agent"}, - "open_settings": {"message": "Ouvrir les paramรจtres"}, - "make_donation": {"message": "Faire une donation"}, - "bug_report": {"message": "Reporter un bug"}, - - "general_settings": {"message": "Paramรจtres principaux"}, - "general_settings_hint": {"message": "Changer le comportement du Switcher afin de matcher au mieux avec tes attentes"}, - "auto_renew": {"message": "Changement automatique du User-Agent aprรจs une pรฉriode de temps donnรฉe"}, - "auto_renew_interval": {"message": "Temps (en secondes) qui permettra de mettre ร  jour automatiquement ton User-Agent (e.g. 1 heure = 3600)"}, - "auto_renew_on_startup": {"message": "Change ton User-Agent ร  chaque redรฉmarrage du navigateur"}, - "js_protection": {"message": "Protection contre les dรฉtections basรฉes sur du JavaScript"}, - "custom_useragent": {"message": "Utilise un custom User-Agent (sans te soucier de l'ordre dans la liste) au lieu de celui gรฉnรฉrรฉ par l'extension"}, - "custom_useragent_list": {"message": "User-Agents custom (sรฉlectionne un User-Agents spรฉcifique, un par ligne)"}, - "generator_settings": {"message": "Paramรจtres de gรฉnรฉration du User-Agent"}, - "generator_settings_hint": {"message": "Ici vous pouvez sรฉlectionner les navigateurs gรฉnรฉrant le User-Agent"}, - "blacklist_settings": {"message": "Paramรจtres du blacklist"}, - "blacklist_settings_hint": {"message": "Blacklist mode - activรฉe partout, sauf pour les domaines et les rรจgles dรฉfinies. Whitelist mode - dรฉsactivรฉ partout sauf pour les domaines et les rรจgles spรฉcifiรฉes"}, - "blacklist_mode": {"message": "Blacklist mode"}, - "whitelist_mode": {"message": "Whitelist mode"}, - "blacklist_domains": {"message": "Liste des noms de domaines names (un par ligne)"}, - "blacklist_custom_rules": {"message": "Rรจgles custom (une par ligne)"}, - "blacklist_custom_rules_hint": {"message": "Tu peux utiliser un 'wildcards' comme * ou ?. * afin de matcher avec n'importe quelle longueur de caractรจres (par exemple, *google.com correspondra ร  google.com, www.google.com, mail.google.com , etc.), ? qui matchera avec un seul caractรจre (par exemple, www.?oogle.com correspondra ร  www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, etc.)"}, - "remove": {"message": "Supprimer"}, - "save_changes": {"message": "Sauvegarder les changements"}, - "error_occurred": {"message": "Une erreur s'est produite"}, - "like_this_extension": {"message": "Est-ce que t'aimes cet extension ?"}, - "give_a_star_on_github": {"message": "Envoie un peu de force sur GitHub!"}, - "remote_useragent_list": {"message": "Utilise (sans te soucier de l'ordre dans la liste) un User-Agent ร  partir de la liste d'URL suivante :"}, - "remote_useragent_list_hint": {"message": "L'extension le tรฉlรฉchargera pรฉriodiquement pour รชtre ร  jour"}, - "remote_useragent_updating_interval": {"message": "Interval de mise ร  jour (en secondes; e.g. chaque 3 heures = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Mettre ร  jour maintenant"}, - "please_rate_extension": {"message": "Veuillez รฉvaluer cet addon!"}, - - "edge_win": {"message": "Edge sur Windows"}, - "edge_mac": { "message": "Edge sur Mac" }, - "chrome_win": {"message": "Chrome sur Windows"}, - "chrome_mac": {"message": "Chrome sur Mac"}, - "chrome_linux": {"message": "Chrome sur Linux"}, - "chrome_android": {"message": "Chrome sur Android"}, - "firefox_win": {"message": "FireFox sur Windows"}, - "firefox_mac": {"message": "FireFox sur Mac"}, - "firefox_linux": {"message": "FireFox sur Linux"}, - "firefox_android": {"message": "Firefox sur Android"}, - "opera_win": {"message": "Opera sur Windows"}, - "opera_mac": {"message": "Opera sur Mac"}, - "safari_iphone": {"message": "Safari sur iPhone"}, - "safari_mac": {"message": "Safari sur Mac"} -} diff --git a/public/_locales/id/full_description.txt b/public/_locales/id/full_description.txt deleted file mode 100644 index d8cacb89..00000000 --- a/public/_locales/id/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - string yang dikirimkan ke situs web mana pun yang kamu kunjungi. Ini adalah semacam "sidik jari" yang ditinggalkan browser kamu yang berisi: - -โญ๏ธ Nama dan versi browser kamu -โญ๏ธ Nama dari sistem operasi (Mac, Windows, Linux, dll.) dan versi lainya -โญ๏ธ Informasi tentang beberapa plugin yang diinstal pada peramban -โญ๏ธ Informasi lain yang mengidentifikasi dan memaparkan kamu - -๐Ÿš€ Ekstensi ini telah dibuat untuk menghentikan kebocoran data dan mensimulasi perangkat yang berbeda dengan cara yang paling sederhana! - -Ini secara otomatis menggantikan string User-Agent setelah periode waktu tertentu dengan string yang diacak. String User-Agent juga dapat diatur secara manual. Ekstensi ini sangat ringan, menggunakan sumber daya yang sangat sedikit. Pengacakan Agen-Pengguna dapat disesuaikan oleh pengguna (browser dan OS apa yang dipalsukan, dll.). Daftar pengecualian tersedia dengan opsi wildcard. Melindungi dari eksploitasi Javascript untuk menyembunyikan identitas kamu dan melindungi anonimitas kamu. - -Benar-benar gratis dan tanpa iklan. - -Dibuat dengan โค๏ธ sumber kode: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/id/messages.json b/public/_locales/id/messages.json deleted file mode 100644 index d0ff9d00..00000000 --- a/public/_locales/id/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "Secara otomatis mengubah User-Agent setelah jangka waktu tertentu menjadi yang dipilih secara acak, sehingga menyembunyikan User-Agent kamu yang sebenarnya" - }, - "manifest_action_default_title": { - "message": "Acak User-Agent kamu" - }, - "manifest_command_renew_useragent": {"message": "Dapatkan User-Agent baru"}, - - "active_user_agent": {"message": "User-Agent aktif"}, - "pause_switcher": {"message": "Tunda Pengalih"}, - "unpause_switcher": {"message": "Lanjutkan Pengalih"}, - "enable_switcher": {"message": "Aktifkan Pengalih"}, - "enabled_on_this_domain": {"message": "Aktifkan pada domain ini"}, - "get_new_agent": {"message": "Dapatkan User-Agent baru"}, - "open_settings": {"message": "Buka pengaturan"}, - "make_donation": {"message": "Donasi"}, - "bug_report": {"message": "Laporkan kesalahan"}, - - "general_settings": {"message": "Pengaturan umum"}, - "general_settings_hint": {"message": "Ubah perilaku pengalih agar sesuai dengan kebutuhan kamu"}, - "auto_renew": {"message": "Secara otomatis mengubah User-Agent setelah jangka waktu tertentu"}, - "auto_renew_interval": {"message": "Waktu (dalam detik) untuk memperbarui User-Agent secara otomatis (mis. 1 jam = 3600)"}, - "auto_renew_on_startup": {"message": "Ubah User-Agent saat memulai browser"}, - "js_protection": {"message": "Lindungi dari deteksi oleh JavaScript"}, - "custom_useragent": {"message": "Gunakan salah satu (dalam urutan acak) User-Agent khusus yang dihasilkan"}, - "custom_useragent_list": {"message": "User-Agent kustom (tetapkan User-Agent tertentu, satu per baris)"}, - "generator_settings": {"message": "Pengaturan generator"}, - "generator_settings_hint": {"message": "Di sini Anda dapat mengubah perilaku User-Agent"}, - "blacklist_settings": {"message": "Pengaturan daftar hitam"}, - "blacklist_settings_hint": {"message": "Mode daftar hitam - pengalihan diaktifkan di mana saja, kecuali domain & aturan yang ditentukan. Daftar putih - sebaliknya, dinonaktifkan di mana saja kecuali domain & aturan yang ditentukan"}, - "blacklist_mode": {"message": "Mode daftar hitam"}, - "whitelist_mode": {"message": "Mode daftar putih"}, - "blacklist_domains": {"message": "Daftar nama domain (satu per baris)"}, - "blacklist_custom_rules": {"message": "Aturan khusus (satu per baris)"}, - "blacklist_custom_rules_hint": {"message": "Anda dapat menggunakan wildcard seperti * dan ?. * akan cocok dengan panjang karakter apa pun (mis. *google.com akan cocok dengan google.com, www.google.com, mail.google.com, dll.), ? hanya akan cocok dengan satu karakter (mis. www.?oogle.com akan cocok dengan www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, dll.)"}, - "remove": {"message": "Hapus"}, - "save_changes": {"message": "Simpan perubahan"}, - "error_occurred": {"message": "Terjadi kesalahan"}, - "like_this_extension": {"message": "Kamu suka ekstensi ini?"}, - "give_a_star_on_github": {"message": "Berikan kami bintang di GitHub!"}, - "remote_useragent_list": {"message": "Gunakan salah satu (dalam urutan acak) User-Agents dari daftar dengan URL berikut"}, - "remote_useragent_list_hint": {"message": "Ekstensi akan mengunduh secara berkala agar tetap terbaru"}, - "remote_useragent_updating_interval": {"message": "Memperbarui interval (dalam detik; misalnya setiap 3 jam = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Perbaharui sekarang"}, - "please_rate_extension": {"message": "Silahkan, beri peringkat addon ini!"}, - - "edge_win": {"message": "Edge pada Windows"}, - "edge_mac": {"message": "Edge pada Mac" }, - "chrome_win": {"message": "Chrome pada Windows"}, - "chrome_mac": {"message": "Chrome pada Mac"}, - "chrome_linux": {"message": "Chrome pada Linux"}, - "chrome_android": {"message": "Chrome pada Android"}, - "firefox_win": {"message": "FireFox pada Windows"}, - "firefox_mac": {"message": "FireFox pada Mac"}, - "firefox_linux": {"message": "FireFox pada Linux"}, - "firefox_android": {"message": "Firefox pada Android"}, - "opera_win": {"message": "Opera pada Windows"}, - "opera_mac": {"message": "Opera pada Mac"}, - "safari_iphone": {"message": "Safari pada iPhone"}, - "safari_mac": {"message": "Safari pada Mac"} -} diff --git a/public/_locales/ja/full_description.txt b/public/_locales/ja/full_description.txt deleted file mode 100644 index 894b1f5b..00000000 --- a/public/_locales/ja/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - ใ‚ใชใŸใŒ่จชๅ•ใ™ใ‚‹ใ™ในใฆใฎใ‚ฆใ‚งใƒ–ใ‚ตใ‚คใƒˆใซ้€ไฟกใ•ใ‚Œใ‚‹ๆ–‡ๅญ—ๅˆ—ใงใ™ใ€‚ใ“ใ‚Œใฏใ€ใ‚ใชใŸใฎใƒ–ใƒฉใ‚ฆใ‚ถใŒๆฎ‹ใ™ใ€ŒๆŒ‡็ด‹ใ€ใฎใ‚ˆใ†ใชใ‚‚ใฎใงใ€ไปฅไธ‹ใฎๅ†…ๅฎนใ‚’ๅซใ‚“ใงใ„ใพใ™ใ€‚ - -ใƒ–ใƒฉใ‚ฆใ‚ถใฎๅๅ‰ใจใƒใƒผใ‚ธใƒงใƒณ -ใ‚ชใƒšใƒฌใƒผใƒ†ใ‚ฃใƒณใ‚ฐใ‚ทใ‚นใƒ†ใƒ ๅ๏ผˆMacใ€Windowsใ€Linux ใชใฉ๏ผ‰ใจใใฎใƒใƒผใ‚ธใƒงใƒณใ€‚ -ใƒ–ใƒฉใ‚ฆใ‚ถใซใ‚คใƒณใ‚นใƒˆใƒผใƒซใ•ใ‚Œใฆใ„ใ‚‹ใ„ใใคใ‹ใฎใƒ—ใƒฉใ‚ฐใ‚คใƒณใซ้–ขใ™ใ‚‹ๆƒ…ๅ ฑ -โญ๏ธ ใใฎไป–ใ€ใŠๅฎขๆง˜ใ‚’็‰นๅฎšใ—ใ€ๅ…ฌ้–‹ใ™ใ‚‹ๆƒ…ๅ ฑ - -๐Ÿš€ ใ“ใฎๆ‹กๅผตๆฉŸ่ƒฝใฏใ€ใƒ‡ใƒผใ‚ฟๆผๆดฉใ‚’้˜ปๆญขใ—ใ€ๆœ€ใ‚‚ใ‚ทใƒณใƒ—ใƒซใชๆ–นๆณ•ใง็•ฐใชใ‚‹ใƒ‡ใƒใ‚คใ‚นใ‚’ใ‚จใƒŸใƒฅใƒฌใƒผใƒˆใ™ใ‚‹ใŸใ‚ใซไฝœๆˆใ•ใ‚Œใพใ—ใŸ! - -ใ“ใฎๆ‹กๅผตๆฉŸ่ƒฝใฏใ€ไธ€ๅฎšๆœŸ้–“ๅพŒใซUser-Agentๆ–‡ๅญ—ๅˆ—ใ‚’่‡ชๅ‹•็š„ใซใƒฉใƒณใƒ€ใƒ ใชใ‚‚ใฎใซ็ฝฎใๆ›ใˆใพใ™ใ€‚User-Agentๆ–‡ๅญ—ๅˆ—ใฏใ€ๆ‰‹ๅ‹•ใง่จญๅฎšใ™ใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใ€‚ใ“ใฎๆ‹กๅผตๆฉŸ่ƒฝใฏ้žๅธธใซ่ปฝ้‡ใงใ€ไฝฟ็”จใ™ใ‚‹ใƒชใ‚ฝใƒผใ‚นใ‚‚ใ”ใใ‚ใšใ‹ใงใ™ใ€‚User-Agentใฎใƒฉใƒณใƒ€ใƒ ๅŒ–ใฏใ€ใƒฆใƒผใ‚ถใƒผใŒใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บใ™ใ‚‹ใ“ใจใŒใงใใพใ™๏ผˆใฉใฎใƒ–ใƒฉใ‚ฆใ‚ถใจOSใŒ่ฉ็งฐใ•ใ‚Œใ‚‹ใ‹ใ€ใชใฉ๏ผ‰ใ€‚ใƒฏใ‚คใƒซใƒ‰ใ‚ซใƒผใƒ‰ใฎใ‚ชใƒ—ใ‚ทใƒงใƒณใงใ€ไพ‹ๅค–ใƒชใ‚นใƒˆใ‚’ๅˆฉ็”จๅฏ่ƒฝใ€‚Javascriptใฎๆ‚ช็”จใ‹ใ‚‰ไฟ่ญทใ—ใ€ใ‚ใชใŸใฎ่บซๅ…ƒใ‚’้š ใ—ใ€ๅŒฟๅๆ€งใ‚’ไฟ่ญทใ—ใพใ™ใ€‚ - -ๅฎŒๅ…จ็„กๆ–™ใ€ๅบƒๅ‘Šใชใ—ใ€‚ - -ใงไฝœใ‚‰ใ‚ŒใŸโค๏ธใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰๏ผš https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json deleted file mode 100644 index 5d01f8c7..00000000 --- a/public/_locales/ja/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "ๆŒ‡ๅฎšใ—ใŸๆ™‚้–“็ตŒ้ŽๅพŒใซ่‡ชๅ‹•็š„ใซใƒฆใƒผใ‚ถใƒผใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚’ใƒฉใƒณใƒ€ใƒ ใซๅค‰ๆ›ดใ—ใ€ๅฎŸ้š›ใฎใƒฆใƒผใ‚ถใƒผใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚’้š ใ—ใพใ™ใ€‚" - }, - "manifest_action_default_title": { - "message": "ใƒฆใƒผใ‚ถใƒผใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใฎใƒฉใƒณใƒ€ใƒ ๅŒ–" - }, - "manifest_command_renew_useragent": {"message": "ๆ–ฐใ—ใ„ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚’ๅ–ๅพ—ใ™ใ‚‹"}, - - "active_user_agent": {"message": "ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใƒฆใƒผใ‚ถใƒผใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ"}, - "pause_switcher": {"message": "ใƒใƒผใ‚บใ‚นใ‚คใƒƒใƒใƒฃใƒผ"}, - "unpause_switcher": {"message": "ใƒฌใ‚ธใƒฅใƒผใƒ ใ‚นใ‚คใƒƒใƒใƒฃใƒผ"}, - "enable_switcher": {"message": "ใ‚คใƒใƒผใƒ–ใƒซใ‚นใ‚คใƒƒใƒใƒฃใƒผ"}, - "enabled_on_this_domain": {"message": "ใ“ใฎใƒ‰ใƒกใ‚คใƒณใงๆœ‰ๅŠน"}, - "get_new_agent": {"message": "ๆ–ฐใ—ใ„ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚’ๅ–ๅพ—ใ™ใ‚‹"}, - "open_settings": {"message": "ใ‚ชใƒผใƒ—ใƒณ่จญๅฎš"}, - "make_donation": {"message": "ๅฏ„ไป˜ใ™ใ‚‹"}, - "bug_report": {"message": "ใƒใ‚ฐใƒฌใƒใƒผใƒˆ"}, - - "general_settings": {"message": "ไธ€่ˆฌ่จญๅฎš"}, - "general_settings_hint": {"message": "ใƒ‹ใƒผใ‚บใซๅˆใ‚ใ›ใฆใ‚นใ‚คใƒƒใƒใƒฃใƒผใฎๅ‹•ไฝœใ‚’ๅค‰ๆ›ดๅฏ่ƒฝ"}, - "auto_renew": {"message": "ๆŒ‡ๅฎšๆ™‚้–“็ตŒ้ŽๅพŒใซUser-Agentใ‚’่‡ชๅ‹•็š„ใซๅค‰ๆ›ดใ™ใ‚‹ใ€‚"}, - "auto_renew_interval": {"message": "User-Agentใ‚’่‡ชๅ‹•็š„ใซๆ›ดๆ–ฐใ™ใ‚‹ๆ™‚้–“๏ผˆ็ง’๏ผ‰๏ผˆไพ‹๏ผš1ๆ™‚้–“๏ผ3600๏ผ‰"}, - "auto_renew_on_startup": {"message": "ใƒ–ใƒฉใ‚ฆใ‚ถ่ตทๅ‹•ๆ™‚ใฎUser-Agentใ‚’ๅค‰ๆ›ดใ™ใ‚‹"}, - "js_protection": {"message": "JavaScriptใซใ‚ˆใ‚‹ๆคœๅ‡บใ‚’้˜ฒๆญขใ™ใ‚‹"}, - "custom_useragent": {"message": "็”Ÿๆˆใ•ใ‚ŒใŸใ‚ซใ‚นใ‚ฟใƒ User-Agentใฎใ„ใšใ‚Œใ‹ใ‚’๏ผˆใƒฉใƒณใƒ€ใƒ ใช้ †ๅบใง๏ผ‰ไฝฟ็”จใ—ใพใ™ใ€‚"}, - "custom_useragent_list": {"message": "ใ‚ซใ‚นใ‚ฟใƒ ใƒฆใƒผใ‚ถใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ (็‰นๅฎšใฎUser-Agentsใ‚’1่กŒใซ1ใคใšใค่จญๅฎšใ™ใ‚‹)"}, - "generator_settings": {"message": "ใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใƒผใฎ่จญๅฎš"}, - "generator_settings_hint": {"message": "ใ“ใ“ใงใฏใ€ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆๅˆ‡ใ‚Šๆ›ฟใˆใฎๅ‹•ไฝœใ‚’ๅค‰ๆ›ดใ™ใ‚‹ใ“ใจใŒใงใใพใ™"}, - "blacklist_settings": {"message": "ใƒ–ใƒฉใƒƒใ‚ฏใƒชใ‚นใƒˆใฎ่จญๅฎš"}, - "blacklist_settings_hint": {"message": "ใƒ–ใƒฉใƒƒใ‚ฏใƒชใ‚นใƒˆใƒขใƒผใƒ‰ - ๅฎš็พฉใ•ใ‚ŒใŸใƒ‰ใƒกใ‚คใƒณใจใƒซใƒผใƒซใ‚’้™คใใ™ในใฆใฎๅ ดๆ‰€ใงๅˆ‡ใ‚Šๆ›ฟใˆใŒๆœ‰ๅŠนใงใ™ใ€‚ใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆ - ้€†ใซใ€ๆŒ‡ๅฎšใ•ใ‚ŒใŸใƒ‰ใƒกใ‚คใƒณใจใƒซใƒผใƒซไปฅๅค–ใฎใ™ในใฆใฎๅ ดๆ‰€ใง็„กๅŠนๅŒ–ใ•ใ‚Œใพใ™ใ€‚"}, - "blacklist_mode": {"message": "ใƒ–ใƒฉใƒƒใ‚ฏใƒชใ‚นใƒˆใƒขใƒผใƒ‰"}, - "whitelist_mode": {"message": "ใƒ›ใƒฏใ‚คใƒˆใƒชใ‚นใƒˆใƒขใƒผใƒ‰"}, - "blacklist_domains": {"message": "ใƒ‰ใƒกใ‚คใƒณๅใƒชใ‚นใƒˆ๏ผˆ1่กŒใซ1ใค๏ผ‰"}, - "blacklist_custom_rules": {"message": "ใ‚ซใ‚นใ‚ฟใƒ ใƒซใƒผใƒซ(1่กŒใซ1ใค)"}, - "blacklist_custom_rules_hint": {"message": "ใ‚„?ใชใฉใฎใƒฏใ‚คใƒซใƒ‰ใ‚ซใƒผใƒ‰ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚* ใฏไปปๆ„ใฎ้•ทใ•ใฎๆ–‡ๅญ—ใซใƒžใƒƒใƒใ—ใพใ™๏ผˆไพ‹๏ผš*google.com ใฏ google.com, www.google.com, mail.google.com ใชใฉใซใƒžใƒƒใƒใ—ใพใ™๏ผ‰ใ€‚ ? ใฏ1ๆ–‡ๅญ—ใฎใฟใซใƒžใƒƒใƒใ—ใพใ™๏ผˆไพ‹๏ผš www.?oogle.com ใฏ www.oogle.com, www.moogle.com, www.google.com, www.woogle.comใ€ใชใฉใซใƒžใƒƒใƒใ—ใพใ™๏ผ‰ใ€‚"}, - "remove": {"message": "ๅ‰Š้™ค"}, - "save_changes": {"message": "ๅค‰ๆ›ดใ‚’ไฟๅญ˜ใ™ใ‚‹"}, - "error_occurred": {"message": "ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใŸ"}, - "like_this_extension": {"message": "ใ“ใฎใ‚จใ‚ฏใ‚นใƒ†ใƒณใ‚ทใƒงใƒณใŒๅฅฝใใงใ™ใ‹๏ผŸ"}, - "give_a_star_on_github": {"message": "GitHubใงๆ˜Ÿใ‚’ไป˜ใ‘ใฆใใ ใ•ใ„ใ€‚"}, - "remote_useragent_list": {"message": "ไปฅไธ‹ใฎURLใฎใƒชใ‚นใƒˆใซใ‚ใ‚‹User-Agentใฎใ„ใšใ‚Œใ‹ใ‚’๏ผˆใƒฉใƒณใƒ€ใƒ ใช้ †ๅบใง๏ผ‰ไฝฟ็”จใ—ใพใ™ใ€‚"}, - "remote_useragent_list_hint": {"message": "ใ‚จใ‚ฏใ‚นใƒ†ใƒณใ‚ทใƒงใƒณใฏๅฎšๆœŸ็š„ใซใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ—ใ€ๆœ€ๆ–ฐใฎ็Šถๆ…‹ใซไฟใกใพใ™"}, - "remote_useragent_updating_interval": {"message": "ๆ›ดๆ–ฐ้–“้š”๏ผˆ็ง’ๅ˜ไฝใ€ไพ‹๏ผš3ๆ™‚้–“ใ”ใจ๏ผ60ร—60ร—3๏ผ10800๏ผ‰"}, - "update_now": {"message": "็พๅœจใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆไธญ"}, - "please_rate_extension": {"message": "ใ“ใฎใ‚ขใƒ‰ใ‚ชใƒณใฎ่ฉ•ไพกใ‚’ใŠ้ก˜ใ„ใ—ใพใ™ใ€‚"}, - - "edge_win": {"message": "Edge on Windows"}, - "edge_mac": {"message": "Edge on Mac" }, - "chrome_win": {"message": "Chrome on Windows"}, - "chrome_mac": {"message": "Chrome on Mac"}, - "chrome_linux": {"message": "Chrome on Linux"}, - "chrome_android": {"message": "Chrome on Android"}, - "firefox_win": {"message": "FireFox on Windows"}, - "firefox_mac": {"message": "FireFox on Mac"}, - "firefox_linux": {"message": "FireFox on Linux"}, - "firefox_android": {"message": "Firefox on Android"}, - "opera_win": {"message": "Opera on Windows"}, - "opera_mac": {"message": "Opera on Mac"}, - "safari_iphone": {"message": "Safari on iPhone"}, - "safari_mac": {"message": "Safari on Mac"} -} diff --git a/public/_locales/pl/full_description.txt b/public/_locales/pl/full_description.txt deleted file mode 100644 index 0112b2b0..00000000 --- a/public/_locales/pl/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - ciฤ…g znakรณw, ktรณry jest wysyล‚any do kaลผdej odwiedzanej strony internetowej. Jest to rodzaj "odcisku palca", ktรณry pozostawia za sobฤ… przeglฤ…darka i ktรณry zawiera: - -โญ๏ธ Nazwฤ™ i wersjฤ™ Twojej przeglฤ…darki. -โญ๏ธ Nazwฤ™ systemu operacyjnego (Mac, Windows, Linux itp.) i jego wersjฤ™ -โญ๏ธ Informacje o niektรณrych wtyczkach zainstalowanych w przeglฤ…darce -โญ๏ธ Inne informacje, ktรณre Ciฤ™ identyfikujฤ… i eksponujฤ… - -๐Ÿš€ To rozszerzenie zostaล‚o stworzone, aby zatrzymaฤ‡ wyciek danych i emulowaฤ‡ rรณลผne urzฤ…dzenia w najprostszy sposรณb! - -Automatycznie zastฤ™puje ciฤ…gi User-Agent po okreล›lonym czasie losowym. Ciฤ…gi User-Agent mogฤ… byฤ‡ rรณwnieลผ ustawione rฤ™cznie. Rozszerzenie jest niezwykle lekkie, uลผywa bardzo maล‚o zasobรณw. Randomizacja User-Agent moลผe byฤ‡ dostosowana przez uลผytkownika (jakie przeglฤ…darki i systemy operacyjne sฤ… spoofed, itp.). Lista wyjฤ…tkรณw dostฤ™pna z opcjฤ… symboli wieloznacznych. Chroni przed exploitami Javascript, aby ukryฤ‡ swojฤ… toลผsamoล›ฤ‡ i chroniฤ‡ anonimowoล›ฤ‡. - -Caล‚kowicie darmowy i bez reklam. - -Made with โค๏ธ Kod ลบrรณdล‚owy: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json deleted file mode 100644 index 83fd016d..00000000 --- a/public/_locales/pl/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "Automatycznie zmienia User-Agenta po okreล›lonym czasie na losowo wybranego, ukrywajฤ…c w ten sposรณb prawdziwego User-Agenta" - }, - "manifest_action_default_title": { - "message": "Losuj swojego User-Agenta" - }, - "manifest_command_renew_useragent": {"message": "Zdobฤ…dลบ nowego agenta"}, - - "active_user_agent": {"message": "Aktywny User-Agent"}, - "pause_switcher": {"message": "Wstrzymaj przeล‚ฤ…cznik"}, - "unpause_switcher": {"message": "Wznรณw przeล‚ฤ…cznik"}, - "enable_switcher": {"message": "Wล‚ฤ…cz przeล‚ฤ…cznik"}, - "enabled_on_this_domain": {"message": "Wล‚ฤ…czone w tej domenie"}, - "get_new_agent": {"message": "Zdobฤ…dลบ nowego agenta"}, - "open_settings": {"message": "Otwรณrz ustawienia"}, - "make_donation": {"message": "Darowizna"}, - "bug_report": {"message": "Zgล‚oล› bล‚ฤ…d"}, - - "general_settings": {"message": "Ustawienia ogรณlne"}, - "general_settings_hint": {"message": "Zmieล„ zachowanie przeล‚ฤ…cznika, aby jak najlepiej dopasowaฤ‡ go do swoich potrzeb"}, - "auto_renew": {"message": "Automatycznie zmieล„ User-Agenta po okreล›lonym czasie"}, - "auto_renew_interval": {"message": "Czas (w sekundach) do automatycznej aktualizacji User-Agenta (np. 1 godzina = 3600)"}, - "auto_renew_on_startup": {"message": "Zmieล„ User-Agenta podczas uruchamiania przeglฤ…darki"}, - "js_protection": {"message": "Ochrona przed wykryciem za pomocฤ… JavaScript"}, - "custom_useragent": {"message": "Uลผyj jednego z (w przypadkowej kolejnoล›ci) niestandardowych User-Agentรณw zamiast generowanych"}, - "custom_useragent_list": {"message": "Niestandardowi User-Agenci (ustaw okreล›lonych User-Agentรณw, jeden na wiersz)"}, - "generator_settings": {"message": "Ustawienia generatora"}, - "generator_settings_hint": {"message": "Tutaj moลผesz zmieniฤ‡ zachowanie przeล‚ฤ…czania agenta"}, - "blacklist_settings": {"message": "Ustawienia czarnej listy"}, - "blacklist_settings_hint": {"message": "Tryb czarnej listy - przeล‚ฤ…czanie wล‚ฤ…czone wszฤ™dzie, z wyjฤ…tkiem okreล›lonych domen i reguล‚. Biaล‚a lista - wrฤ™cz przeciwnie, wyล‚ฤ…czone wszฤ™dzie poza okreล›lonymi domenami i reguล‚ami"}, - "blacklist_mode": {"message": "Tryb czarnej listy"}, - "whitelist_mode": {"message": "Tryb biaล‚ej listy"}, - "blacklist_domains": {"message": "Lista nazw domen (jedna w wierszu)"}, - "blacklist_custom_rules": {"message": "Reguล‚y niestandardowe (jedna w wierszu)"}, - "blacklist_custom_rules_hint": {"message": "Moลผesz uลผyฤ‡ znakรณw wieloznacznych, takich jak * i ?. * dopasuje dowolnฤ… dล‚ugoล›ฤ‡ znakรณw (np. *google.com dopasuje google.com, www.google.com, mail.google.com, itp.), ? dopasuje tylko pojedynczy znak (np. www.?oogle.com dopasuje www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, itp.)"}, - "remove": {"message": "Usuล„"}, - "save_changes": {"message": "Zapisz zmiany"}, - "error_occurred": {"message": "Wystฤ…piล‚ bล‚ฤ…d"}, - "like_this_extension": {"message": "Czy podoba Ci siฤ™ to rozszerzenie?"}, - "give_a_star_on_github": {"message": "Daj nam gwiazdkฤ™ na GitHubie!"}, - "remote_useragent_list": {"message": "Uลผyj jednego z (w przypadkowej kolejnoล›ci) User-Agentรณw z listy poprzez nastฤ™pujฤ…cy URL"}, - "remote_useragent_list_hint": {"message": "Rozszerzenie bฤ™dzie okresowo je pobieraฤ‡, aby byล‚o zawsze aktualne"}, - "remote_useragent_updating_interval": {"message": "Czฤ™stotliwoล›ฤ‡ aktualizacji (w sekundach; np. co 3 godziny = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Aktualizuj teraz"}, - "please_rate_extension": {"message": "Proszฤ™, oceล„ to rozszerzenie!"}, - - "edge_win": {"message": "Edge na Windows"}, - "edge_mac": {"message": "Edge na Mac" }, - "chrome_win": {"message": "Chrome na Windows"}, - "chrome_mac": {"message": "Chrome na Mac"}, - "chrome_linux": {"message": "Chrome na Linux"}, - "chrome_android": {"message": "Chrome na Android"}, - "firefox_win": {"message": "FireFox na Windows"}, - "firefox_mac": {"message": "FireFox na Mac"}, - "firefox_linux": {"message": "FireFox na Linux"}, - "firefox_android": {"message": "FireFox na Android"}, - "opera_win": {"message": "Opera na Windows"}, - "opera_mac": {"message": "Opera na Mac"}, - "safari_iphone": {"message": "Safari na iPhone"}, - "safari_mac": {"message": "Safari na Mac"} -} diff --git a/public/_locales/pt_BR/full_description.txt b/public/_locales/pt_BR/full_description.txt deleted file mode 100644 index fd7b7770..00000000 --- a/public/_locales/pt_BR/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent (Agente de usuรกrio) - รฉ um conjunto de informaรงรตes que รฉ enviado para qualquer site que vocรช visita. ร‰ um tipo de "impressรฃo digital" do seu navegador, que contรฉm: - -โญ๏ธ O nome e a versรฃo do seu navegador; -โญ๏ธ O nome de sistema operacional (Mac, Windows, Linux, etc.) e a sua versรฃo; -โญ๏ธ Informaรงรตes sobre alguns plugins instalados no seu navegador; -โญ๏ธ Outras informaรงรตes que lhe identifica e expรตe. - -๐Ÿš€ Esta extensรฃo foi criada para impedir o vazamento de dados. - -Ela substitui automaticamente identificaรงรฃo de Agente de usuรกrio, apรณs um perรญodo de tempo escolhido, por uma outra aleatรณria. As informaรงรตes de Agente de usuรกrio tambรฉm podem ser especificadas manualmente. A extensรฃo รฉ incrivelmente leve e usa muito pouco recursos. A randomizaรงรฃo de Agente de usuรกrio pode ser personalizada pelo usuรกrio (vรกrios tipos de navegadores e SO sรฃo disponรญveis, etc.). A lista de exceรงรตes pode ser criada com a opรงรฃo de usar os caracteres especiais. Tem proteรงรฃo contra exploraรงรตes de Javascript para ocultar sua identidade e proteger seu anonimato. - -Completamente gratuito e sem anรบncios. - -Feito com โค๏ธ Cรณdigo-fonte: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/pt_BR/messages.json b/public/_locales/pt_BR/messages.json deleted file mode 100644 index aaa21000..00000000 --- a/public/_locales/pt_BR/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "Altera automaticamente seu Agente de usuรกrio apรณs um tempo escolhido, para um outro e portanto oculta a sua verdadeira identidade" - }, - "manifest_action_default_title": { - "message": "Randomize seu Agente de usuรกrio" - }, - "manifest_command_renew_useragent": {"message": "Alterar para outro Agente"}, - - "active_user_agent": {"message": "Agente de usuรกrio ativo"}, - "pause_switcher": {"message": "Pausar alteraรงรฃo"}, - "unpause_switcher": {"message": "Retomar alteraรงรฃo"}, - "enable_switcher": {"message": "Ativar alteraรงรฃo"}, - "enabled_on_this_domain": {"message": "Activado neste dominio"}, - "get_new_agent": {"message": "Alterar para outro Agente"}, - "open_settings": {"message": "Abrir configuraรงรตes"}, - "make_donation": {"message": "Doar"}, - "bug_report": {"message": "Relatar falha"}, - - "general_settings": {"message": "Configuraรงรตes gerais"}, - "general_settings_hint": {"message": "Mudar o comportamento de alteraรงรฃo para melhor atender ร s suas necessidades"}, - "auto_renew": {"message": "Mudar automaticamente seu Agente de usuรกrio apรณs um perรญodo de tempo escolhido"}, - "auto_renew_interval": {"message": "Tempo (em segundos) para alterar automaticamente seu Agente de usuรกrio (ex. 1 hora = 3600)"}, - "auto_renew_on_startup": {"message": "Alterar seu Agente de usuรกrio na inicializaรงรฃo do navegador"}, - "js_protection": {"message": "Proteger contra detecรงรฃo por JavaScript"}, - "custom_useragent": {"message": "Use um dos Agentes de usuรกrio personalizados em vez de predefinidos (ordem aleatรณria)"}, - "custom_useragent_list": {"message": "Agentes de usuรกrio personalizados (definir um Agente de usuรกrio prรณprio, um por linha)"}, - "generator_settings": {"message": "Configuraรงรตes do gerador"}, - "generator_settings_hint": {"message": "Aqui vocรช pode mudar o comportamento de alteraรงรฃo de Agente"}, - "blacklist_settings": {"message": "Configuraรงรตes de lista negra"}, - "blacklist_settings_hint": {"message": "Modo de lista negra - alteraรงรฃo ativada em todos os lugares, menos em domรญnios e regras especificadas. Lista branca - ao contrรกrio, desativada em todos os lugares, menos em domรญnios e regras especificadas"}, - "blacklist_mode": {"message": "Lista negra"}, - "whitelist_mode": {"message": "Lista branca"}, - "blacklist_domains": {"message": "Lista de nomes de domรญnio (um por linha)"}, - "blacklist_custom_rules": {"message": "Regras personalizadas (um por linha)"}, - "blacklist_custom_rules_hint": {"message": "Vocรช pode usar caracteres especiais, tais como * e ?. * coincidirรก com qualquer quantidade de caracteres (ex. *google.com coincidirรก com google.com, www.google.com, mail.google.com, etc.), ? coincidirรก apenas com um รบnico caractere (ex. www.?oogle.com corresponderรก com www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, etc.)"}, - "remove": {"message": "Remove"}, - "save_changes": {"message": "Salvar mudanรงas"}, - "error_occurred": {"message": "Ocorreu um erro"}, - "like_this_extension": {"message": "Vocรช gosta da extensรฃo?"}, - "give_a_star_on_github": {"message": "Dรช-nos uma estrela no GitHub!"}, - "remote_useragent_list": {"message": "Use um dos Agentes de usuรกrio da lista fornecida via seguinte URL (ordem aleatรณria)"}, - "remote_useragent_list_hint": {"message": "A extensรฃo periodicamente baixarรก Agentes para mantรช-los atualizados"}, - "remote_useragent_updating_interval": {"message": "Intervalo de atualizaรงรฃo (em segundos; por exemplo, a cada 3 horas = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Atualizar agora"}, - "please_rate_extension": {"message": "Por favor, classifique este suplemento!"}, - - "edge_win": {"message": "Edge no Windows"}, - "edge_mac": { "message": "Edge no Mac" }, - "chrome_win": {"message": "Chrome no Windows"}, - "chrome_mac": {"message": "Chrome no Mac"}, - "chrome_linux": {"message": "Chrome no Linux"}, - "chrome_android": {"message": "Chrome no Android"}, - "firefox_win": {"message": "Firefox no Windows"}, - "firefox_mac": {"message": "Firefox no Mac"}, - "firefox_linux": {"message": "Firefox no Linux"}, - "firefox_android": {"message": "Firefox no Android"}, - "opera_win": {"message": "Opera no Windows"}, - "opera_mac": {"message": "Opera no Mac"}, - "safari_iphone": {"message": "Safari no iPhone"}, - "safari_mac": {"message": "Safari no Mac"} -} diff --git a/public/_locales/readme.md b/public/_locales/readme.md deleted file mode 100644 index cebd2753..00000000 --- a/public/_locales/readme.md +++ /dev/null @@ -1,37 +0,0 @@ -# i18n - -## How to make a translations - -1. Make a fork of this repository -2. Make a copy of `en` directory, and rename it to your [locale name][locales-list] -3. Open `%your_locale%\messages.json` file. Translate all lines in `message` fields **only** -4. Translate `%your_locale%\full_description.txt` file content -5. Make sure your file encoding is `UTF-8` and has valid format ([you can check it here](http://jsonlint.com/)) -6. Make a [pull-request](https://github.com/tarampampam/random-user-agent/compare) - -## How to fix the translation mistakes - -1. Navigate your browser to the file with the required localization -2. Click on a pencil (edit file) -3. Make your changes -4. Make a [pull-request](https://github.com/tarampampam/random-user-agent/compare) with your changes - -## ๐Ÿ‘ Translators - -- ๐Ÿ‡บ๐Ÿ‡ฆ Ukrainian by [@Yctftcyfc](https://github.com/Yctftcyfc) -- ๐Ÿ‡ต๐Ÿ‡ฑ Polish by [@Yctxtctx](https://github.com/Yctxtctx) -- ๐Ÿ‡ฏ๐Ÿ‡ต Japanese by [@webact1](https://github.com/webact1) -- ๐Ÿ‡น๐Ÿ‡ท Turkish by [@webact1](https://github.com/webact1) -- ๐Ÿ‡ช๐Ÿ‡ธ Spanish by [@webact1](https://github.com/webact1) -- ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesian by [@tustoz](https://github.com/tustoz) and [@FerdinaKusumah](https://github.com/FerdinaKusumah) -- ๐Ÿ‡ซ๐Ÿ‡ท French by [@maxgfr](https://github.com/maxgfr) -- ๐Ÿ‡ฉ๐Ÿ‡ช German by [@Xenorio](https://github.com/Xenorio) -- ๐Ÿ‡ต๐Ÿ‡น Portuguese by [@ghost](https://github.com/ghost) -- ๐Ÿ‡จ๐Ÿ‡ณ Chinese by [@yfdyh000](https://github.com/yfdyh000) - -### Useful links - -- [API Reference](https://developer.chrome.com/docs/extensions/reference/i18n/) -- [Locales list][locales-list] - -[locales-list]:https://developer.chrome.com/webstore/i18n?csw=1#localeTable diff --git a/public/_locales/ru/full_description.txt b/public/_locales/ru/full_description.txt deleted file mode 100644 index 395971b0..00000000 --- a/public/_locales/ru/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - ัั‚ะพ ัั‚ั€ะพะบะฐ, ะบะพั‚ะพั€ะฐั ะฟะตั€ะตะดะฐะตั‚ัั ะฑั€ะฐัƒะทะตั€ะพะผ ะฒะผะตัั‚ะต ั ะทะฐะฟั€ะพัะพะผ ะปัŽะฑะพะน ัั‚ั€ะฐะฝะธั†ั‹ ะฒ ะธะฝั‚ะตั€ะฝะตั‚ะต. ะญั‚ะพ ะฒะฐัˆ ัะฒะพะตะพะฑั€ะฐะทะฝั‹ะน "ะพั‚ะฟะตั‡ะฐั‚ะพะบ", ะฒ ะบะพั‚ะพั€ะพะผ ัะพะดะตั€ะถะธั‚ัั: - -โญ๏ธ ะะฐะทะฒะฐะฝะธะต ะธ ะฒะตั€ัะธั ะฒะฐัˆะตะณะพ ะฑั€ะฐัƒะทะตั€ะฐ -โญ๏ธ ะะฐะทะฒะฐะฝะธะต ะพะฟะตั€ะฐั†ะธะพะฝะฝะพะน ัะธัั‚ะตะผั‹ (Mac, Windows, Linux ะธ ั‚.ะด.) ะธ ะตั‘ ะฒะตั€ัะธั -โญ๏ธ ะ˜ะฝั„ะพั€ะผะฐั†ะธั ะพ ะฝะตะบะพั‚ะพั€ั‹ั… ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝั‹ั… ะฟะปะฐะณะธะฝะฐั… ะฒ ัะธัั‚ะตะผะต -โญ๏ธ ะŸั€ะพั‡ะฐั ะธะฝั„ะพั€ะผะฐั†ะธั, ะธะดะตะฝั‚ะธั„ะธั†ะธั€ัƒัŽั‰ะฐั ะธ ั€ะฐัะบั€ั‹ะฒะฐัŽั‰ะฐั ะฒะฐั - -๐Ÿš€ ะ”ะปั ั‚ะพะณะพ, ั‡ั‚ะพะฑั‹ ะฟั€ะตะบั€ะฐั‚ะธั‚ัŒ ัั‚ัƒ ัƒั‚ะตั‡ะบัƒ ะดะฐะฝะฝั‹ั… ะธ ัะผัƒะปะธั€ะพะฒะฐั‚ัŒ ั€ะฐะทะปะธั‡ะฝั‹ะต ัƒัั‚ั€ะพะนัั‚ะฒะฐ ะธ ะฑั‹ะปะพ ัะพะทะดะฐะฝะพ ัั‚ะพ ั€ะฐััˆะธั€ะตะฝะธะต! - -ะžะฝะพ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฟะพะดะผะตะฝัะตั‚ User-Agent ั‡ะตั€ะตะท ัƒะบะฐะทะฐะฝะฝั‹ะน ะฟั€ะพะผะตะถัƒั‚ะพะบ ะฒั€ะตะผะตะฝะธ ะฝะฐ ัะปัƒั‡ะฐะนะฝั‹ะน. ะขะฐะบ ะถะต ัั‚ั€ะพะบะฐ User-Agent ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ัƒะบะฐะทะฐะฝะฐ ะฒั€ัƒั‡ะฝัƒัŽ. ะŸั€ะตะดะพัั‚ะฐะฒะปัะตั‚ ะทะฐั‰ะธั‚ัƒ ะพั‚ ั€ะฐัะบั€ั‹ั‚ะธั ั€ะตะฐะปัŒะฝะพะณะพ User-Agent ะดะฐะถะต ัั€ะตะดัั‚ะฒะฐะผะธ JavaScript! ะ”ะฐะฝะฝะพะต ั€ะฐััˆะธั€ะตะฝะธะต ะพั‡ะตะฝัŒ ะฝะตะฑะพะปัŒัˆะพะต ะธ ะฑะตั€ะตะถะฝะพ ะพั‚ะฝะพัะธั‚ัั ะบ ั€ะตััƒั€ัะฐะผ. ะ“ะตะฝะตั€ะฐั†ะธั ัะปัƒั‡ะฐะนะฝะพะณะพ User-Agent ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฝะฐัั‚ั€ะพะตะฝะฐ (ะธะผะตะตั‚ัั ะฒั‹ะฑะพั€ ะฑั€ะฐัƒะทะตั€ะพะฒ, ะบะพั‚ะพั€ั‹ะต ะฝะตะพะฑั…ะพะดะธะผะพ ะธะผะธั‚ะธั€ะพะฒะฐั‚ัŒ). ะŸะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั ัƒะดะพะฑะฝั‹ะต ะฟั€ะฐะฒะธะปะฐ ะธัะบะปัŽั‡ะตะฝะธะน ะธ ัะธะฝั…ั€ะพะฝะธะทะฐั†ะธั ะฝะฐัั‚ั€ะพะตะบ. - -ะะฑัะพะปัŽั‚ะฝะพ ะฑะตัะฟะปะฐั‚ะฝะพะต ะธ ะฑะตะท ั€ะตะบะปะฐะผั‹/ั‚ั€ะตะบะตั€ะพะฒ. - -ะ ะฐะทั€ะฐะฑะพั‚ะฐะฝะพ ั โค๏ธ ะ˜ัั…ะพะดะฝั‹ะน ะบะพะด: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json deleted file mode 100644 index 441ec79b..00000000 --- a/public/_locales/ru/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะทะฐะผะตะฝัะตั‚ User-Agent ั‡ะตั€ะตะท ะทะฐะดะฐะฝะฝั‹ะน ะฟั€ะพะผะตะถัƒั‚ะพะบ ะฒั€ะตะผะตะฝะธ ะฝะฐ ัะปัƒั‡ะฐะนะฝั‹ะน, ั‚ะตะผ ัะฐะผั‹ะผ ัะบั€ั‹ะฒะฐั ะฝะฐัั‚ะพัั‰ะธะน" - }, - "manifest_action_default_title": { - "message": "ะ ะฐะฝะดะพะผะธะทะธั€ะพะฒะฐั‚ัŒ ะฒะฐัˆ User-Agent" - }, - "manifest_command_renew_useragent": {"message": "ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฝะพะฒั‹ะน"}, - - "active_user_agent": {"message": "ะขะตะบัƒั‰ะธะน User-Agent"}, - "pause_switcher": {"message": "ะŸั€ะธะพัั‚ะฐะฝะพะฒะธั‚ัŒ ะฟะพะดะผะตะฝัƒ"}, - "unpause_switcher": {"message": "ะ’ะพะทะพะฑะฝะพะฒะธั‚ัŒ ะฟะพะดะผะตะฝัƒ"}, - "enable_switcher": {"message": "ะ’ะบะปัŽั‡ะธั‚ัŒ ะฟะพะดะผะตะฝัƒ"}, - "enabled_on_this_domain": {"message": "ะ’ะบะปัŽั‡ะตะฝ ะฝะฐ ัั‚ะพะผ ะดะพะผะตะฝะต"}, - "get_new_agent": {"message": "ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฝะพะฒั‹ะน"}, - "open_settings": {"message": "ะžั‚ะบั€ั‹ั‚ัŒ ะฝะฐัั‚ั€ะพะนะบะธ"}, - "make_donation": {"message": "ะšัƒะฟะธั‚ัŒ ะฐะฒั‚ะพั€ัƒ ะบะพั„ะต"}, - "bug_report": {"message": "ะกะพะพะฑั‰ะธั‚ัŒ ะพะฑ ะพัˆะธะฑะบะต"}, - - "general_settings": {"message": "ะžัะฝะพะฒะฝั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ"}, - "general_settings_hint": {"message": "ะ˜ะทะผะตะฝะธั‚ะต ะฝะฐัั‚ั€ะพะนะบะธ ั€ะฐะฑะพั‚ั‹ ั€ะฐััˆะธั€ะตะฝะธั ะฟะพ ะฒะฐัˆะตะผัƒ ัƒัะผะพั‚ั€ะตะฝะธัŽ"}, - "auto_renew": {"message": "ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะพะฑะฝะพะฒะปัั‚ัŒ User-Agent ั‡ะตั€ะตะท ะทะฐะดะฐะฝะฝั‹ะน ะฟั€ะพะผะตะถัƒั‚ะพะบ ะฒั€ะตะผะตะฝะธ"}, - "auto_renew_interval": {"message": "ะŸะตั€ะธะพะด ะฒั€ะตะผะตะฝะธ (ะฒ ัะตะบัƒะฝะดะฐั…) ะดะปั ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะณะพ ะพะฑะฝะพะฒะปะตะฝะธั User-Agent (ะฝะฐะฟั€ะธะผะตั€, 1 ั‡ะฐั = 3600)"}, - "auto_renew_on_startup": {"message": "ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะพะฑะฝะพะฒะปัั‚ัŒ User-Agent ะฟั€ะธ ะทะฐะฟัƒัะบะต ะฑั€ะฐัƒะทะตั€ะฐ"}, - "js_protection": {"message": "ะกะบั€ั‹ะฒะฐั‚ัŒ ะฝะฐัั‚ะพัั‰ะธะน User-Agent ัั€ะตะดัั‚ะฒะฐะผะธ JavaScript"}, - "custom_useragent": {"message": "ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพะดะธะฝ ะธะท ัะปะตะดัƒัŽั‰ะธั… User-Agent (ะฒ ัะปัƒั‡ะฐะนะฝะพะผ ะฟะพั€ัะดะบะต) ะฒะผะตัั‚ะพ ะณะตะฝะตั€ะธั€ัƒะตะผะพะณะพ"}, - "custom_useragent_list": {"message": "ะกะฟะธัะพะบ ัะฒะพะธั… User-Agent (ะฟะพ ะพะดะฝะพะผัƒ ะฝะฐ ัั‚ั€ะพะบัƒ)"}, - "generator_settings": {"message": "ะะฐัั‚ั€ะพะนะบะธ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ"}, - "generator_settings_hint": {"message": "ะฃะบะฐะถะธั‚ะต ั‚ะต ั‚ะธะฟั‹ ะฑั€ะฐัƒะทะตั€ะพะฒ, User-Agent ะบะพั‚ะพั€ั‹ั… ัะปะตะดัƒะตั‚ ะณะตะฝะตั€ะธั€ะพะฒะฐั‚ัŒ"}, - "blacklist_settings": {"message": "ะะฐัั‚ั€ะพะนะบะธ ั‡ะตั€ะฝะพะณะพ ัะฟะธัะบะฐ"}, - "blacklist_settings_hint": {"message": "ะŸั€ะธ ะฒะบะปัŽั‡ะตะฝะธะธ ั€ะตะถะธะผะฐ ั‡ะตั€ะฝะพะณะพ ัะฟะธัะบะฐ ะฟะพะดะผะตะฝะฐ ะฒะบะปัŽั‡ะตะฝะฐ ะฒะตะทะดะต, ะบั€ะพะผะต ะฟะตั€ะตั‡ะธัะปะตะฝะฝั‹ั… ะฝะธะถะต ะดะพะผะตะฝะพะฒ ะธ ะฟั€ะฐะฒะธะป; ะฑะตะปั‹ะน ะถะต ัะฟะธัะพะบ ะฝะฐะพะฑะพั€ะพั‚ - ะฟะพะดะผะตะฝะฐ ะฒั‹ะบะปัŽั‡ะตะฝะฐ ะฒะตะทะดะต, ะบั€ะพะผะต ัƒะบะฐะทะฐะฝะฝั‹ั… ะดะพะผะตะฝะพะฒ ะธ ะฟั€ะฐะฒะธะป"}, - "blacklist_mode": {"message": "ะ ะตะถะธะผ ั‡ะตั€ะฝะพะณะพ ัะฟะธัะบะฐ"}, - "whitelist_mode": {"message": "ะ ะตะถะธะผ ะฑะตะปะพะณะพ ัะฟะธัะบะฐ"}, - "blacklist_domains": {"message": "ะกะฟะธัะพะบ ะธะผะตะฝ ะดะพะผะตะฝะพะฒ (ะฟะพ ะพะดะฝะพะผัƒ ะฝะฐ ัั‚ั€ะพะบัƒ)"}, - "blacklist_custom_rules": {"message": "ะกะฟะธัะพะบ ะฟั€ะฐะฒะธะป (ะฟะพ ะพะดะฝะพะผัƒ ะฝะฐ ัั‚ั€ะพะบัƒ)"}, - "blacklist_custom_rules_hint": {"message": "ะ’ั‹ ะผะพะถะตั‚ะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ัะฟะตั†ะธะฐะปัŒะฝั‹ะต ัะธะผะฒะพะปั‹, ั‚ะฐะบะธะต ะบะฐะบ * ะธ ?. * ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒะตั‚ ะปัŽะฑั‹ะผ ัะธะผะฒะพะปะฐะผ ะปัŽะฑะพะน ะดะปะธะฝั‹ (ั‚.ะต. *google.com ะฑัƒะดะตั‚ ัะพะพั‚ะฒะตั‚ัั‚ะฒะพะฒะฐั‚ัŒ google.com, www.google.com, mail.google.com ะธ ั‚.ะด.). ? ัะพะพั‚ะฒะตั‚ัั‚ะฒัƒะตั‚ ะพะดะธะฝะพั‡ะฝะพะผัƒ ะฟั€ะพะธะทะฒะพะปัŒะฝะพะผัƒ ัะธะผะฒะพะปัƒ (ั‚.ะต. www.?oogle.com ะฑัƒะดะตั‚ ัะพะพั‚ะฒะตั‚ัั‚ะฒะพะฒะฐั‚ัŒ www.oogle.com, www.moogle.com, www.woogle.com ะธ ั‚.ะด.)"}, - "remove": {"message": "ะฃะดะฐะปะธั‚ัŒ"}, - "save_changes": {"message": "ะกะพั…ั€ะฐะฝะธั‚ัŒ ะธะทะผะตะฝะตะฝะธั"}, - "error_occurred": {"message": "ะŸั€ะพะธะทะพัˆะปะฐ ะพัˆะธะฑะบะฐ"}, - "like_this_extension": {"message": "ะ’ะฐะผ ะฝั€ะฐะฒะธั‚ัั ัั‚ะพ ั€ะฐััˆะธั€ะตะฝะธะต?"}, - "give_a_star_on_github": {"message": "ะŸะพัั‚ะฐะฒัŒั‚ะต ะตะผัƒ ะทะฒั‘ะทะดะพั‡ะบัƒ ะฝะฐ GitHub!"}, - "remote_useragent_list": {"message": "ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะพะดะธะฝ ะธะท User-Agent (ะฒ ัะปัƒั‡ะฐะนะฝะพะผ ะฟะพั€ัะดะบะต) ะธะท ัะฟะธัะบะฐ ะฟะพ URL"}, - "remote_useragent_list_hint": {"message": "ะญั‚ะพ ั€ะฐััˆะธั€ะตะฝะธะต ะฑัƒะดะตั‚ ะฟะตั€ะธะพะดะธั‡ะตัะบะธ ัะบะฐั‡ะธะฒะฐั‚ัŒ ะตะณะพ ะดะปั ั‚ะพะณะพ, ั‡ั‚ะพะฑ ะฟะพะดะดะตั€ะถะธะฒะฐั‚ัŒ ัะฟะธัะพะบ ะฒ ะฐะบั‚ัƒะฐะปัŒะฝะพะผ ัะพัั‚ะพัะฝะธะธ"}, - "remote_useragent_updating_interval": {"message": "ะ˜ะฝั‚ะตั€ะฒะฐะป ะพะฑะฝะพะฒะปะตะฝะธั (ะฒ ัะตะบัƒะฝะดะฐั…; ะฟั€ะธะผะตั€ - ะบะฐะถะดั‹ะต 3 ั‡ะฐัะฐ = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "ะžะฑะฝะพะฒะธั‚ัŒ ัะตะนั‡ะฐั"}, - "please_rate_extension": {"message": "ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะพั†ะตะฝะธั‚ะต ัั‚ะพ ะดะพะฟะพะปะฝะตะฝะธะต!"}, - - "edge_win": {"message": "Edge ะฝะฐ Windows"}, - "edge_mac": { "message": "Edge ะฝะฐ Mac" }, - "chrome_win": {"message": "Chrome ะฝะฐ Windows"}, - "chrome_mac": {"message": "Chrome ะฝะฐ Mac"}, - "chrome_linux": {"message": "Chrome ะฝะฐ Linux"}, - "chrome_android": {"message": "Chrome ะฝะฐ Android"}, - "firefox_win": {"message": "FireFox ะฝะฐ Windows"}, - "firefox_mac": {"message": "FireFox ะฝะฐ Mac"}, - "firefox_linux": {"message": "FireFox ะฝะฐ Linux"}, - "firefox_android": {"message": "Firefox ะฝะฐ Android"}, - "opera_win": {"message": "Opera ะฝะฐ Windows"}, - "opera_mac": {"message": "Opera ะฝะฐ Mac"}, - "safari_iphone": {"message": "Safari ะฝะฐ iPhone"}, - "safari_mac": {"message": "Safari ะฝะฐ Mac"} -} diff --git a/public/_locales/tr/full_description.txt b/public/_locales/tr/full_description.txt deleted file mode 100644 index ed640451..00000000 --- a/public/_locales/tr/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - ziyaret ettiฤŸiniz herhangi bir web sitesine gรถnderilen bir dize. Bu, tarayฤฑcฤฑnฤฑzฤฑn geride bฤฑraktฤฑฤŸฤฑ ve iรงerdiฤŸi bir tรผr "parmak izidir": - -โญ๏ธ Tarayฤฑcฤฑnฤฑzฤฑn adฤฑ ve sรผrรผmรผ -โญ๏ธ ฤฐลŸletim sisteminin adฤฑ (Mac, Windows, Linux, vb.) ve sรผrรผmรผ -โญ๏ธ Tarayฤฑcฤฑda yรผklรผ bazฤฑ eklentiler hakkฤฑnda bilgi -โญ๏ธ Sizi tanฤฑmlayan ve ifลŸa eden diฤŸer bilgiler - -๐Ÿš€ Bu uzantฤฑ, veri sฤฑzฤฑntฤฑsฤฑnฤฑ durdurmak ve farklฤฑ cihazlarฤฑ en basit ลŸekilde taklit etmek iรงin oluลŸturulmuลŸtur! - -Belirli bir sรผre sonra User-Agent dizelerini otomatik olarak rastgele bir dizeyle deฤŸiลŸtirir. User-Agent dizeleri manuel olarak da ayarlanabilir. Uzantฤฑ inanฤฑlmaz derecede hafiftir ve รงok az kaynak kullanฤฑr. User-Agent randomizasyonu kullanฤฑcฤฑ tarafฤฑndan รถzelleลŸtirilebilir (hangi tarayฤฑcฤฑlarฤฑn ve iลŸletim sistemlerinin taklit edileceฤŸi vb.). Joker karakter seรงeneฤŸi ile istisnalar listesi mevcuttur. KimliฤŸinizi gizlemek ve anonimliฤŸinizi korumak iรงin Javascript istismarlarฤฑna karลŸฤฑ koruma saฤŸlar. - -Tamamen รผcretsiz ve reklamsฤฑz. - -Made with โค๏ธ Kaynak kodu: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/tr/messages.json b/public/_locales/tr/messages.json deleted file mode 100644 index 3a4ecd84..00000000 --- a/public/_locales/tr/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "Belirli bir sรผre sonra kullanฤฑcฤฑ aracฤฑsฤฑnฤฑ otomatik olarak rastgele seรงilen bir kullanฤฑcฤฑ aracฤฑsฤฑna deฤŸiลŸtirir, bรถylece gerรงek kullanฤฑcฤฑ aracฤฑnฤฑzฤฑ gizler" - }, - "manifest_action_default_title": { - "message": "Kullanฤฑcฤฑ Aracฤฑnฤฑzฤฑ Rastgele Ayarlayฤฑn" - }, - "manifest_command_renew_useragent": {"message": "Yeni temsilci alฤฑn"}, - - "active_user_agent": {"message": "Aktif Kullanฤฑcฤฑ-Agent"}, - "pause_switcher": {"message": "Duraklatma DeฤŸiลŸtirici"}, - "unpause_switcher": {"message": "Devam DeฤŸiลŸtirici"}, - "enable_switcher": {"message": "DeฤŸiลŸtiriciyi EtkinleลŸtir"}, - "enabled_on_this_domain": {"message": "Bu etki alanฤฑnda etkinleลŸtirildi"}, - "get_new_agent": {"message": "Yeni temsilci alฤฑn"}, - "open_settings": {"message": "Aรงฤฑk ayarlar"}, - "make_donation": {"message": "BaฤŸฤฑลŸ Yapฤฑn"}, - "bug_report": {"message": "Hata raporu"}, - - "general_settings": {"message": "Genel ayarlar"}, - "general_settings_hint": {"message": "DeฤŸiลŸtiricinin davranฤฑลŸฤฑnฤฑ ihtiyaรงlarฤฑnฤฑza en uygun ลŸekilde deฤŸiลŸtirin"}, - "auto_renew": {"message": "Belirli bir sรผre sonra Kullanฤฑcฤฑ Aracฤฑsฤฑnฤฑ otomatik olarak deฤŸiลŸtir"}, - "auto_renew_interval": {"message": "User-Agent'ฤฑn otomatik olarak gรผncelleneceฤŸi sรผre (saniye cinsinden) (รถrn. 1 saat = 3600)"}, - "auto_renew_on_startup": {"message": "Tarayฤฑcฤฑ baลŸlangฤฑcฤฑnda User-Agent'ฤฑ deฤŸiลŸtirme"}, - "js_protection": {"message": "JavaScript tarafฤฑndan algฤฑlanmaya karลŸฤฑ koruma"}, - "custom_useragent": {"message": "Bunun yerine oluลŸturulan รถzel Kullanฤฑcฤฑ Aracฤฑsฤฑndan birini (rastgele sฤฑrayla) kullanฤฑn"}, - "custom_useragent_list": {"message": "ร–zel Kullanฤฑcฤฑ Temsilcileri (her satฤฑr iรงin bir tane olmak รผzere belirli bir Kullanฤฑcฤฑ Temsilcisi ayarlayฤฑn)"}, - "generator_settings": {"message": "Jeneratรถr ayarlarฤฑ"}, - "generator_settings_hint": {"message": "Burada temsilci deฤŸiลŸtirme davranฤฑลŸฤฑnฤฑ deฤŸiลŸtirebilirsiniz"}, - "blacklist_settings": {"message": "Kara liste ayarlarฤฑ"}, - "blacklist_settings_hint": {"message": "Kara liste modu - tanฤฑmlanan etki alanlarฤฑ ve kurallar dฤฑลŸฤฑnda her yerde etkin anahtarlama. Beyaz liste - tam tersine, belirtilen etki alanlarฤฑ ve kurallar dฤฑลŸฤฑnda her yerde devre dฤฑลŸฤฑ bฤฑrakฤฑlฤฑr"}, - "blacklist_mode": {"message": "Kara liste modu"}, - "whitelist_mode": {"message": "Beyaz liste modu"}, - "blacklist_domains": {"message": "Alan adlarฤฑ listesi (her satฤฑr iรงin bir tane)"}, - "blacklist_custom_rules": {"message": "ร–zel kurallar (her satฤฑr iรงin bir tane)"}, - "blacklist_custom_rules_hint": {"message": "ve ? gibi joker karakterler kullanabilirsiniz. * herhangi bir karakter uzunluฤŸuyla eลŸleลŸir (รถrneฤŸin *google.com google.com, www.google.com, mail.google.com, vb. ile eลŸleลŸir), ? yalnฤฑzca tek bir karakterle eลŸleลŸir (รถrneฤŸin www.?oogle.com www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, vb. ile eลŸleลŸir)."}, - "remove": {"message": "Kaldฤฑrmak"}, - "save_changes": {"message": "DeฤŸiลŸiklikleri kaydet"}, - "error_occurred": {"message": "Hata oluลŸtu"}, - "like_this_extension": {"message": "Bu uzantฤฑyฤฑ beฤŸendiniz mi?"}, - "give_a_star_on_github": {"message": "GitHub'da bize bir yฤฑldฤฑz verin!"}, - "remote_useragent_list": {"message": "AลŸaฤŸฤฑdaki URL ile listedeki Kullanฤฑcฤฑ Aracฤฑlarฤฑndan birini (rastgele sฤฑrayla) kullanฤฑn"}, - "remote_useragent_list_hint": {"message": "Uzantฤฑ, gรผncel tutmak iรงin periyodik olarak indirecektir"}, - "remote_useragent_updating_interval": {"message": "Gรผncelleme aralฤฑฤŸฤฑ (saniye cinsinden; รถrneฤŸin her 3 saatte bir = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "ลžimdi gรผncelleyin"}, - "please_rate_extension": {"message": "Lรผtfen bu eklentiyi deฤŸerlendirin!"}, - - "edge_win": {"message": "Edge รผzerinde Windows"}, - "edge_mac": {"message": "Edge รผzerinde Mac" }, - "chrome_win": {"message": "Chrome รผzerinde Windows"}, - "chrome_mac": {"message": "Chrome รผzerinde Mac"}, - "chrome_linux": {"message": "Chrome รผzerinde Linux"}, - "chrome_android": {"message": "Chrome รผzerinde Android"}, - "firefox_win": {"message": "FireFox รผzerinde Windows"}, - "firefox_mac": {"message": "FireFox รผzerinde Mac"}, - "firefox_linux": {"message": "FireFox รผzerinde Linux"}, - "firefox_android": {"message": "Firefox รผzerinde Android"}, - "opera_win": {"message": "Opera รผzerinde Windows"}, - "opera_mac": {"message": "Opera รผzerinde Mac"}, - "safari_iphone": {"message": "Safari รผzerinde iPhone"}, - "safari_mac": {"message": "Safari รผzerinde Mac"} -} diff --git a/public/_locales/uk/full_description.txt b/public/_locales/uk/full_description.txt deleted file mode 100644 index c901a8d9..00000000 --- a/public/_locales/uk/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - ั€ัะดะพะบ, ัะบะธะน ะฝะฐะดัะธะปะฐั”ั‚ัŒัั ะฝะฐ ะฑัƒะดัŒ-ัะบะธะน ะฒะตะฑ-ัะฐะนั‚, ัะบะธะน ะฒะธ ะฒั–ะดะฒั–ะดัƒั”ั‚ะต. ะฆะต ัะฒะพะณะพ ั€ะพะดัƒ "ะฒั–ะดะฑะธั‚ะพะบ ะฟะฐะปัŒั†ั", ัะบะธะน ะทะฐะปะธัˆะฐั” ะฒะฐัˆ ะฑั€ะฐัƒะทะตั€: - -โญ๏ธ ะะฐะทะฒะฐ ั‚ะฐ ะฒะตั€ัั–ั ะฒะฐัˆะพะณะพ ะฑั€ะฐัƒะทะตั€ะฐ -โญ๏ธ ะะฐะทะฒะฐ ะพะฟะตั€ะฐั†ั–ะนะฝะพั— ัะธัั‚ะตะผะธ (Mac, Windows, Linux ั‚ะพั‰ะพ) ั‚ะฐ ั—ั— ะฒะตั€ัั–ั -โญ๏ธ ะ†ะฝั„ะพั€ะผะฐั†ั–ัŽ ะฟั€ะพ ะดะตัะบั– ะฟะปะฐะณั–ะฝะธ, ะฒัั‚ะฐะฝะพะฒะปะตะฝั– ะฒ ะฑั€ะฐัƒะทะตั€ั– -โญ๏ธ ะ†ะฝัˆัƒ ั–ะฝั„ะพั€ะผะฐั†ั–ัŽ, ัะบะฐ ั–ะดะตะฝั‚ะธั„ั–ะบัƒั” ั‚ะฐ ะฒะธะบั€ะธะฒะฐั” ะฒะฐั - -๐Ÿš€ ะฆะต ั€ะพะทัˆะธั€ะตะฝะฝั ะฑัƒะปะพ ัั‚ะฒะพั€ะตะฝะพ, ั‰ะพะฑ ะทัƒะฟะธะฝะธั‚ะธ ะฒะธั‚ั–ะบ ะดะฐะฝะธั… ั– ะตะผัƒะปัŽะฒะฐั‚ะธ ั€ั–ะทะฝั– ะฟั€ะธัั‚ั€ะพั— ะฝะฐะนะฟั€ะพัั‚ั–ัˆะธะผ ัะฟะพัะพะฑะพะผ! - -ะ’ะพะฝะพ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะพ ะทะฐะผั–ะฝัŽั” ั€ัะดะบะธ User-Agent ั‡ะตั€ะตะท ะฟะตะฒะฝะธะน ะฟั€ะพะผั–ะถะพะบ ั‡ะฐััƒ ะฝะฐ ั€ะฐะฝะดะพะผั–ะทะพะฒะฐะฝั–. ะ ัะดะบะธ User-Agent ั‚ะฐะบะพะถ ะผะพะถัƒั‚ัŒ ะฑัƒั‚ะธ ะฒัั‚ะฐะฝะพะฒะปะตะฝั– ะฒั€ัƒั‡ะฝัƒ. ะ ะพะทัˆะธั€ะตะฝะฝั ะฝะตะนะผะพะฒั–ั€ะฝะพ ะปะตะณะบะต, ะฒะธะบะพั€ะธัั‚ะพะฒัƒั” ะดัƒะถะต ะผะฐะปะพ ั€ะตััƒั€ัั–ะฒ. ะ ะฐะฝะดะพะผั–ะทะฐั†ั–ั User-Agent ะผะพะถะต ะฑัƒั‚ะธ ะฝะฐะปะฐัˆั‚ะพะฒะฐะฝะฐ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะตะผ (ัะบั– ะฑั€ะฐัƒะทะตั€ะธ ั– ะžะก ะฟั–ะดะผั–ะฝััŽั‚ัŒัั ั– ั‚.ะด.). ะ”ะพัั‚ัƒะฟะฝะธะน ัะฟะธัะพะบ ะฒะธะฝัั‚ะบั–ะฒ ะท ะผะพะถะปะธะฒั–ัั‚ัŽ ะฒะธะบะพั€ะธัั‚ะฐะฝะฝั ะฟั–ะดัั‚ะฐะฝะพะฒะพั‡ะฝะธั… ะทะฝะฐะบั–ะฒ. ะ—ะฐั…ะธั‰ะฐั” ะฒั–ะด ะตะบัะฟะปะพะนั‚ั–ะฒ Javascript ะดะปั ะฟั€ะธั…ะพะฒัƒะฒะฐะฝะฝั ะฒะฐัˆะพั— ะพัะพะฑะธัั‚ะพัั‚ั– ั‚ะฐ ะทะฐั…ะธัั‚ัƒ ะฒะฐัˆะพั— ะฐะฝะพะฝั–ะผะฝะพัั‚ั–. - -ะŸะพะฒะฝั–ัั‚ัŽ ะฑะตะทะบะพัˆั‚ะพะฒะฝะธะน ั– ะฑะตะท ั€ะตะบะปะฐะผะธ. - -ะ—ั€ะพะฑะปะตะฝะพ ะทะฐ ะดะพะฟะพะผะพะณะพัŽ โค๏ธ ะ’ะธั…ั–ะดะฝะธะน ะบะพะด: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/uk/messages.json b/public/_locales/uk/messages.json deleted file mode 100644 index df2236e4..00000000 --- a/public/_locales/uk/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะฐ ะทะผั–ะฝะฐ ะฐะณะตะฝั‚ะฐ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ ั‡ะตั€ะตะท ะทะฐะดะฐะฝะธะน ะฟั€ะพะผั–ะถะพะบ ั‡ะฐััƒ ะฝะฐ ะฒะธะฟะฐะดะบะพะฒะพ ะพะฑั€ะฐะฝะพะณะพ, ั‚ะฐะบะธะผ ั‡ะธะฝะพะผ ะฟั€ะธั…ะพะฒัƒัŽั‡ะธ ะฒะฐัˆะพะณะพ ั€ะตะฐะปัŒะฝะพะณะพ ะฐะณะตะฝั‚ะฐ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ" - }, - "manifest_action_default_title": { - "message": "ะ ะฐะฝะดะพะผั–ะทัƒะนั‚ะต ัะฒะพะณะพ User-Agent" - }, - "manifest_command_renew_useragent": {"message": "ะžั‚ั€ะธะผะฐั‚ะธ ะฝะพะฒะธะน ั–ะดะตะฝั‚ะธั„ั–ะบะฐั‚ะพั€"}, - - "active_user_agent": {"message": "ะŸะพั‚ะพั‡ะฝะธะน User-Agent"}, - "pause_switcher": {"message": "ะŸั€ะธะทัƒะฟะธะฝะธั‚ะธ ั€ะพะทัˆะธั€ะตะฝะฝั"}, - "unpause_switcher": {"message": "ะ—ะฐะฟัƒัั‚ะธั‚ะธ ั€ะพะทัˆะธั€ะตะฝะฝั"}, - "enable_switcher": {"message": "ะะบั‚ะธะฒัƒะฒะฐั‚ะธ ั€ะพะทัˆะธั€ะตะฝะฝั"}, - "enabled_on_this_domain": {"message": "ะ’ะบะปัŽั‡ะตะฝะพ ะฝะฐ ั†ัŒะพะผัƒ ะดะพะผะตะฝั–"}, - "get_new_agent": {"message": "ะžั‚ั€ะธะผะฐั‚ะธ ะฝะพะฒะพะณะพ ะฐะณะตะฝั‚ะฐ"}, - "open_settings": {"message": "ะ’ั–ะดะบั€ะธั‚ะธ ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั"}, - "make_donation": {"message": "ะŸะพะถะตั€ั‚ะฒัƒะฒะฐั‚ะธ"}, - "bug_report": {"message": "ะŸะพะฒั–ะดะพะผะปะตะฝะฝั ะฟั€ะพ ะฟะพะผะธะปะบัƒ"}, - - "general_settings": {"message": "ะ—ะฐะณะฐะปัŒะฝั– ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั"}, - "general_settings_hint": {"message": "ะ—ะผั–ะฝั–ั‚ัŒ ะฟะพะฒะตะดั–ะฝะบัƒ ะฟะตั€ะตะผะธะบะฐั‡ะฐ ั‚ะฐะบ, ั‰ะพะฑ ะฒั–ะฝ ะฝะฐะนะบั€ะฐั‰ะต ะฒั–ะดะฟะพะฒั–ะดะฐะฒ ะฒะฐัˆะธะผ ะฟะพั‚ั€ะตะฑะฐะผ"}, - "auto_renew": {"message": "ะะฒั‚ะพะผะฐั‚ะธั‡ะฝะฐ ะทะผั–ะฝะฐ ะšะพั€ะธัั‚ัƒะฒะฐั‡ะฐ-ะะณะตะฝั‚ะฐ ั‡ะตั€ะตะท ะทะฐะดะฐะฝะธะน ะฟั€ะพะผั–ะถะพะบ ั‡ะฐััƒ"}, - "auto_renew_interval": {"message": "ะงะฐั (ะฒ ัะตะบัƒะฝะดะฐั…) ะดะปั ะฐะฒั‚ะพะผะฐั‚ะธั‡ะฝะพะณะพ ะพะฝะพะฒะปะตะฝะฝั User-Agent (ะฝะฐะฟั€ะธะบะปะฐะด, 1 ะณะพะดะธะฝะฐ = 3600)"}, - "auto_renew_on_startup": {"message": "ะ—ะผั–ะฝะฐ ะฐะณะตะฝั‚ะฐ ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ ะฟั€ะธ ะทะฐะฟัƒัะบัƒ ะฑั€ะฐัƒะทะตั€ะฐ"}, - "js_protection": {"message": "ะ—ะฐั…ะธัั‚ ะฒั–ะด ะฒะธัะฒะปะตะฝะฝั JavaScript"}, - "custom_useragent": {"message": "ะ’ะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ะพะดะธะฝ ะท (ัƒ ะฒะธะฟะฐะดะบะพะฒะพะผัƒ ะฟะพั€ัะดะบัƒ) ะบะพั€ะธัั‚ัƒะฒะฐั†ัŒะบะธั… User-Agent ะทะฐะผั–ัั‚ัŒ ะทะณะตะฝะตั€ะพะฒะฐะฝะพะณะพ"}, - "custom_useragent_list": {"message": "ะšะพั€ะธัั‚ัƒะฒะฐั†ัŒะบั– ะฐะณะตะฝั‚ะธ (ะทะฐะดะฐั‚ะธ ะบะพะฝะบั€ะตั‚ะฝะธั… ะฐะณะตะฝั‚ั–ะฒ, ะฟะพ ะพะดะฝะพะผัƒ ะฝะฐ ะปั–ะฝั–ัŽ)"}, - "generator_settings": {"message": "ะะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั ะณะตะฝะตั€ะฐั‚ะพั€ะฐ"}, - "generator_settings_hint": {"message": "ะขัƒั‚ ะฒะธ ะผะพะถะตั‚ะต ะทะผั–ะฝะธั‚ะธ ะฟะพะฒะตะดั–ะฝะบัƒ ะฟะตั€ะตะผะธะบะฐะฝะฝั ะฐะณะตะฝั‚ั–ะฒ"}, - "blacklist_settings": {"message": "ะะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั ั‡ะพั€ะฝะพะณะพ ัะฟะธัะบัƒ"}, - "blacklist_settings_hint": {"message": "ะ ะตะถะธะผ ั‡ะพั€ะฝะพะณะพ ัะฟะธัะบัƒ - ะฟะตั€ะตะผะธะบะฐะฝะฝั ะฒะบะปัŽั‡ะตะฝะพ ัะบั€ั–ะทัŒ, ะบั€ั–ะผ ะทะฐะดะฐะฝะธั… ะดะพะผะตะฝั–ะฒ ั– ะฟั€ะฐะฒะธะป. ะ‘ั–ะปะธะน ัะฟะธัะพะบ - ะฝะฐะฒะฟะฐะบะธ, ะฒั–ะดะบะปัŽั‡ะตะฝะธะน ะฒััŽะดะธ, ะบั€ั–ะผ ะทะฐะทะฝะฐั‡ะตะฝะธั… ะดะพะผะตะฝั–ะฒ ั– ะฟั€ะฐะฒะธะป"}, - "blacklist_mode": {"message": "ะ ะตะถะธะผ ั‡ะพั€ะฝะพะณะพ ัะฟะธัะบัƒ"}, - "whitelist_mode": {"message": "ะ ะตะถะธะผ ะฑั–ะปะพะณะพ ัะฟะธัะบัƒ"}, - "blacklist_domains": {"message": "ะกะฟะธัะพะบ ะดะพะผะตะฝะฝะธั… ั–ะผะตะฝ (ะฟะพ ะพะดะฝะพะผัƒ ะฒ ั€ัะดะบัƒ)"}, - "blacklist_custom_rules": {"message": "ะšะพั€ะธัั‚ัƒะฒะฐั†ัŒะบั– ะฟั€ะฐะฒะธะปะฐ (ะฟะพ ะพะดะฝะพะผัƒ ะฝะฐ ั€ัะดะพะบ)"}, - "blacklist_custom_rules_hint": {"message": "ะ’ะธ ะผะพะถะตั‚ะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ะฟั–ะดัั‚ะฐะฝะพะฒะพั‡ะฝั– ะทะฝะฐะบะธ, ั‚ะฐะบั– ัะบ * ั– ?. * ะฑัƒะดะต ะฒั–ะดะฟะพะฒั–ะดะฐั‚ะธ ะฑัƒะดัŒ-ัะบั–ะน ะดะพะฒะถะธะฝั– ัะธะผะฒะพะปั–ะฒ (ะฝะฐะฟั€ะธะบะปะฐะด, *google.com ะฑัƒะดะต ะฒั–ะดะฟะพะฒั–ะดะฐั‚ะธ google.com, www.google.com, mail.google.com ั– ั‚.ะด.), ? ะฑัƒะดะต ะฒั–ะดะฟะพะฒั–ะดะฐั‚ะธ ั‚ั–ะปัŒะบะธ ะพะดะฝะพะผัƒ ัะธะผะฒะพะปัƒ (ะฝะฐะฟั€ะธะบะปะฐะด, www.?oogle.com ะฑัƒะดะต ะฒั–ะดะฟะพะฒั–ะดะฐั‚ะธ www.oogle.com, www.moogle.com, www.google.com, www.woogle.com ั– ั‚.ะด.)"}, - "remove": {"message": "ะ’ะธะดะฐะปะธั‚ะธ"}, - "save_changes": {"message": "ะ—ะฑะตั€ะตะณั‚ะธ ะทะผั–ะฝะธ"}, - "error_occurred": {"message": "ะ’ะธะฝะธะบะปะฐ ะฟะพะผะธะปะบะฐ"}, - "like_this_extension": {"message": "ะ’ะฐะผ ะฟะพะดะพะฑะฐั”ั‚ัŒัั ั†ะต ั€ะพะทัˆะธั€ะตะฝะฝั?"}, - "give_a_star_on_github": {"message": "ะŸะพัั‚ะฐะฒั‚ะต ะฝะฐะผ ะทั–ั€ะบัƒ ะฝะฐ GitHub!"}, - "remote_useragent_list": {"message": "ะ’ะธะบะพั€ะธัั‚ะพะฒัƒะนั‚ะต ะพะดะธะฝ User Agent (ัƒ ะฒะธะฟะฐะดะบะพะฒะพะผัƒ ะฟะพั€ัะดะบัƒ) ะทั– ัะฟะธัะบัƒ ะทะฐ ะฝะฐัั‚ัƒะฟะฝะธะผ URL"}, - "remote_useragent_list_hint": {"message": "ะ ะพะทัˆะธั€ะตะฝะฝั ะฑัƒะดะต ะฟะตั€ั–ะพะดะธั‡ะฝะพ ะทะฐะฒะฐะฝั‚ะฐะถัƒะฒะฐั‚ะธ ะนะพะณะพ ะดะปั ะฟั–ะดั‚ั€ะธะผะบะธ ะฒ ะฐะบั‚ัƒะฐะปัŒะฝะพะผัƒ ัั‚ะฐะฝั–"}, - "remote_useragent_updating_interval": {"message": "ะ†ะฝั‚ะตั€ะฒะฐะป ะพะฝะพะฒะปะตะฝะฝั (ะฒ ัะตะบัƒะฝะดะฐั…; ะฝะฐะฟั€ะธะบะปะฐะด, ะบะพะถะฝั– 3 ะณะพะดะธะฝะธ = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "ะžะฝะพะฒะธั‚ะธ ะทะฐั€ะฐะท"}, - "please_rate_extension": {"message": "ะ‘ัƒะดัŒ ะปะฐัะบะฐ, ะพั†ั–ะฝั–ั‚ัŒ ั†ะตะน ะฐะดะดะพะฝ!"}, - - "edge_win": {"message": "Edge ะฝะฐ Windows"}, - "edge_mac": {"message": "Edge ะฝะฐ Mac" }, - "chrome_win": {"message": "Chrome ะฝะฐ Windows"}, - "chrome_mac": {"message": "Chrome ะฝะฐ Mac"}, - "chrome_linux": {"message": "Chrome ะฝะฐ Linux"}, - "chrome_android": {"message": "Chrome ะฝะฐ Android"}, - "firefox_win": {"message": "FireFox ะฝะฐ Windows"}, - "firefox_mac": {"message": "FireFox ะฝะฐ Mac"}, - "firefox_linux": {"message": "FireFox ะฝะฐ Linux"}, - "firefox_android": {"message": "FireFox ะฝะฐ Android"}, - "opera_win": {"message": "Opera ะฝะฐ Windows"}, - "opera_mac": {"message": "Opera ะฝะฐ Mac"}, - "safari_iphone": {"message": "Safari ะฝะฐ iPhone"}, - "safari_mac": {"message": "Safari ะฝะฐ Mac"} -} diff --git a/public/_locales/vi/full_description.txt b/public/_locales/vi/full_description.txt deleted file mode 100644 index 41cadb24..00000000 --- a/public/_locales/vi/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -User-Agent - mแป™t dรฒng kรญ tแปฑ ฤ‘ฦฐแปฃc gแปญi ฤ‘แบฟn bแบฅt kแปณ trang web nร o bแบกn truy cแบญp. ฤรขy lร  mแป™t loแบกi โ€œvรขn tayโ€ mร  trรฌnh duyแป‡t cแปงa bแบกn ฤ‘แปƒ lแบกi bao gแป“m: - -โญ๏ธ Tรชn vร  phiรชn bแบฃn trรฌnh duyแป‡t cแปงa bแบกn -โญ๏ธ Tรชn vร  phiรชn bแบฃn cแปงa hแป‡ ฤ‘iแปu hร nh (Mac, Windows, Linux, vv) -โญ๏ธ Thรดng tin vแป mแป™t sแป‘ phแบงn mแปŸ rแป™ng ฤ‘ฦฐแปฃc cร i ฤ‘แบทt trรชn trรฌnh duyแป‡t -โญ๏ธ Cรกc thรดng tin khรกc cho phรฉp xรกc ฤ‘แป‹nh vร  lร m lแป™ danh tรญnh bแบกn - -๐Ÿš€ Phแบงn mแปŸ rแป™ng nร y ฤ‘รฃ ฤ‘ฦฐแปฃc tแบกo ra ฤ‘แปƒ ngฤƒn chแบทn rรฒ rแป‰ dแปฏ liแป‡u vร  giแบฃ lแบญp nhแปฏng thiแบฟt bแป‹ khรกc mแป™t cรกch ฤ‘ฦกn giแบฃn nhแบฅt! - -Nรณ tแปฑ ฤ‘แป™ng thay thแบฟ dรฒng User-Agent sau mแป™t khoแบฃng thแปi gian nhแบฅt ฤ‘แป‹nh vแป›i mแป™t dรฒng ngแบซu nhiรชn. Dรฒng User-Agent cลฉng cรณ thแปƒ ฤ‘ฦฐแปฃc ฤ‘แบทt thแปง cรดng. Phแบงn mแปŸ rแป™ng nร y cแปฑc kแปณ nhแบน, sแปญ dแปฅng rแบฅt รญt tร i nguyรชn. Sแปฑ ngแบซu nhiรชn hoรก User-Agent cรณ thแปƒ ฤ‘ฦฐแปฃc tรนy chแป‰nh bแปŸi ngฦฐแปi dรนng (nhแปฏng trรฌnh duyแป‡t vร  hแป‡ ฤ‘iแปu hร nh nร o ฤ‘ฦฐแปฃc giแบฃ lแบญp, v.v.). Bao gแป“m danh sรกch ngoแบกi lแป‡ vแป›i tรนy chแปn kรฝ tแปฑ ฤ‘แบกi diแป‡n. Bแบฃo vแป‡ khแปi nhแปฏng lแป— hแป•ng Javascript ฤ‘แปƒ แบฉn danh tรญnh vร  bแบฃo vแป‡ sแปฑ แบฉn danh cแปงa bแบกn. - -Hoร n toร n miแป…n phรญ vร  khรดng cรณ quแบฃng cรกo. - -ฤฦฐแปฃc lร m vแป›i โค๏ธ Mรฃ nguแป“n: https://github.com/tarampampam/random-user-agent diff --git a/public/_locales/vi/messages.json b/public/_locales/vi/messages.json deleted file mode 100644 index 20e7e259..00000000 --- a/public/_locales/vi/messages.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "manifest_name": { - "message": "User-Agent ngแบซu nhiรชn (Thay ฤ‘แป•i)", - "description": "Tแป‘i ฤ‘a 45 kรญ tแปฑ" - }, - "manifest_description": { - "message": "Tแปฑ ฤ‘แป™ng thay ฤ‘แป•i User-Agent cแปงa bแบกn thร nh mแป™t dรฒng ฤ‘ฦฐแปฃc chแปn ngแบซu nhiรชn, tแปซ ฤ‘รณ แบฉn User-Agent thแปฑc cแปงa bแบกn", - "description": "Khรดng sแปญ dแปฅng HTML hoแบทc ฤ‘แป‹nh dแบกng khรกc; tแป‘i ฤ‘a 132 kรญ tแปฑ" - }, - "manifest_action_default_title": { - "message": "Ngแบซu nhiรชn hoรก User-Agent", - "description": "User-Agent hiแป‡n tแบกi xuแบฅt hiแป‡n khi ngฦฐแปi dรนng trแป chuแป™t vร o biแปƒu tฦฐแปฃng cแปงa phแบงn mแปŸ rแป™ng trรชn thanh cรดng cแปฅ" - }, - "manifest_command_renew_useragent": {"message": "Tแบกo User-Agent mแป›i"}, - - "active_user_agent": {"message": "User-Agent hiแป‡n tแบกi"}, - "pause_switcher": {"message": "Tแบกm dแปซng thay ฤ‘แป•i"}, - "unpause_switcher": {"message": "Tiแบฟp tแปฅc thay ฤ‘แป•i"}, - "enable_switcher": {"message": "Cho phรฉp thay ฤ‘แป•i"}, - "enabled_on_this_domain": {"message": "ฤฦฐแปฃc cho phรฉp แปŸ tรชn miแปn nร y"}, - "get_new_agent": {"message": "Tแบกo User-Agent mแป›i"}, - "open_settings": {"message": "MแปŸ phแบงn cร i ฤ‘แบทt"}, - "make_donation": {"message": "แปฆng hแป™ tร i chรญnh"}, - "bug_report": {"message": "Bรกo lแป—i"}, - - "general_settings": {"message": "Cร i ฤ‘แบทt chung"}, - "general_settings_hint": {"message": "Thay ฤ‘แป•i hร nh vi cแปงa bแป™ thay ฤ‘แป•i sao cho phรน hแปฃp vแป›i nhu cแบงu cแปงa bแบกn"}, - "auto_renew": {"message": "Tแปฑ ฤ‘แป™ng thay ฤ‘แป•i User-Agent sau mแป™t khoแบฃng thแปi gian nhแบฅt ฤ‘แป‹nh"}, - "auto_renew_interval": {"message": "Thแปi gian (tรญnh bแบฑng giรขy) ฤ‘แปƒ tแปฑ ฤ‘แป™ng thay ฤ‘แป•i User-Agent (vd: 1 tiแบฟng = 3600)"}, - "auto_renew_on_startup": {"message": "Thay ฤ‘แป•i User-Agent khi khแปŸi ฤ‘แป™ng trรฌnh duyแป‡t"}, - "js_protection": {"message": "Bแบฃo vแป‡ trฦฐแป›c lแป— hแป•ng JavaScript"}, - "custom_useragent": {"message": "Sแปญ dแปฅng mแป™t trong (theo thแปฉ tแปฑ ngแบซu nhiรชn) nhแปฏng User-Agent tuแปณ chแป‰nh thay vรฌ tแปฑ tแบกo ra ngแบซu nhiรชn"}, - "custom_useragent_list": {"message": "User-Agent tuแปณ chแป‰nh (viแบฟt cรกc dรฒng User-Agent, 1 dรฒng 1 lแบงn)"}, - "generator_settings": {"message": "Cร i ฤ‘แบทt bแป™ tแบกo User-Agent"}, - "generator_settings_hint": {"message": "แปž ฤ‘รขy bแบกn cรณ thแปƒ tuแปณ chแป‰nh hร nh vi thay ฤ‘แป•i"}, - "blacklist_settings": {"message": "Cร i ฤ‘แบทt danh sรกch ฤ‘en"}, - "blacklist_settings_hint": {"message": "Chแบฟ ฤ‘แป™ danh sรกch ฤ‘en - cho phรฉp แปŸ tแบฅt cแบฃ cรกc trang trแปซ nhแปฏng trang cho trฦฐแป›c. Chแบฟ ฤ‘แป™ danh sรกch trแบฏng - ngฦฐแปฃc lแบกi, khรดng cho phรฉp แปŸ mแปi trang miแปn trแปซ nhแปฏng trang cho trฦฐแป›c"}, - "blacklist_mode": {"message": "Chแบฟ ฤ‘แป™ danh sรกch ฤ‘en"}, - "whitelist_mode": {"message": "Chแบฟ ฤ‘แป™ danh sรกch trแบฏng"}, - "blacklist_domains": {"message": "Danh sรกch tรชn miแปn (mแป—i dรฒng 1 tรชn)"}, - "blacklist_custom_rules": {"message": "Luแบญt tuแปณ chแป‰nh (mแป—i dรฒng 1 tรชn)"}, - "blacklist_custom_rules_hint": {"message": "Bแบกn cรณ thแปƒ sแปญ dแปฅng kรญ tแปฑ ฤ‘แบกi diแป‡n nhฦฐ * and ?. * cho mแป™t phแบงn cแปงa tรชn miแปn (vd: *google.com sแบฝ ฤ‘แบกi diแป‡n google.com, www.google.com, mail.google.com, vv), ? sแบฝ chi ฤ‘แบกi diแป‡n mแป™t kรญ tแปฑ (vd: www.?oogle.com sแบฝ ฤ‘แบกi diแป‡n www.oogle.com, www.moogle.com, www.google.com, www.woogle.com, vv)"}, - "remove": {"message": "Xoรก"}, - "save_changes": {"message": "Lฦฐu thay ฤ‘แป•i"}, - "error_occurred": {"message": "ฤรฃ xแบฃy ra lแป—i"}, - "like_this_extension": {"message": "Bแบกn cรณ thรญch phแบงn mแปŸ rแป™ng nร y khรดng?"}, - "give_a_star_on_github": {"message": "Hรฃy cho chรบng tรดi mแป™t ngรดi sao trรชn GitHub!"}, - "remote_useragent_list": {"message": "Sแปญ dแปฅng mแป™t trong (theo thแปฉ tแปฑ ngแบซu nhiรชn) nhแปฏng User-Agent tuแปณ chแป‰nh tแปซ danh sรกch trong URL sau ฤ‘รขy"}, - "remote_useragent_list_hint": {"message": "Phแบงn mแปŸ rแป™ng sแบฝ tแบฃi vแป theo ฤ‘แป‹nh kแปณ ฤ‘แปƒ cแบญp nhแบญt bแบฃn mแป›i nhแบฅt"}, - "remote_useragent_updating_interval": {"message": "Khoแบฃng thแปi gian cแบญp nhแบญt (bแบฑng giรขy; vd: mแป—i 3 tiแบฟng = 60ร—60ร—3 = 10800)"}, - "update_now": {"message": "Cแบญp nhแบญt ngay"}, - "please_rate_extension": {"message": "Hรฃy ฤ‘รกnh giรก phแบงn mแปŸ rแป™ng nร y!"}, - - "edge_win": {"message": "Edge trรชn Windows"}, - "edge_mac": {"message": "Edge trรชn Mac" }, - "chrome_win": {"message": "Chrome trรชn Windows"}, - "chrome_mac": {"message": "Chrome trรชn Mac"}, - "chrome_linux": {"message": "Chrome trรชn Linux"}, - "chrome_android": {"message": "Chrome trรชn Android"}, - "firefox_win": {"message": "FireFox trรชn Windows"}, - "firefox_mac": {"message": "FireFox trรชn Mac"}, - "firefox_linux": {"message": "FireFox trรชn Linux"}, - "firefox_android": {"message": "Firefox trรชn Android"}, - "opera_win": {"message": "Opera trรชn Windows"}, - "opera_mac": {"message": "Opera trรชn Mac"}, - "safari_iphone": {"message": "Safari trรชn iPhone"}, - "safari_mac": {"message": "Safari trรชn Mac"} -} diff --git a/public/_locales/zh_CN/full_description.txt b/public/_locales/zh_CN/full_description.txt deleted file mode 100644 index 62c40b90..00000000 --- a/public/_locales/zh_CN/full_description.txt +++ /dev/null @@ -1,14 +0,0 @@ -็”จๆˆทไปฃ็†๏ผˆUser-Agent๏ผ‰ๆ˜ฏๅœจๆ‚จ่ฎฟ้—ฎ็ฝ‘็ซ™ๆ—ถๅ‘้€่ฟ‡ๅŽป็š„ไธ€ไธชๆ ‡่ฏ†ๅญ—็ฌฆไธฒใ€‚่ฟ™ๆ˜ฏๆ‚จ็š„ๆต่งˆๅ™จ็•™ไธ‹็š„โ€œๆŒ‡็บนโ€ไน‹ไธ€ใ€‚่ฏฅๅญ—็ฌฆไธฒไธญๅŒ…ๅซ๏ผš - -โญ๏ธ ๆ‚จ็š„ๆต่งˆๅ™จ็š„ๅ็งฐๅ’Œ็‰ˆๆœฌ -โญ๏ธ ๆ“ไฝœ็ณป็ปŸ็š„ๅ็งฐ๏ผˆๅฆ‚ Macใ€Windowsใ€Linux ็ญ‰๏ผ‰ๅŠๅ…ถ็‰ˆๆœฌ -โญ๏ธ ๅทฒๅฎ‰่ฃ…ๅœจๆต่งˆๅ™จไธญ็š„ๆ’ไปถ็š„ไธ€ไบ›ไฟกๆฏ -โญ๏ธ ๅ…ถไป–ๅฏไปฅ่ฏ†ๅˆซๅ’Œ่ฎคๅ‡บๆ‚จ็š„ไฟกๆฏ - -๐Ÿš€ ๆœฌๆ‰ฉๅฑ•ๆ˜ฏไธบไบ†้˜ฒๆญขๆญค็งๆ•ฐๆฎๆณ„้œฒๆ‚จ็š„ไฟกๆฏใ€‚ - -ๅฎƒๅฐ†ๆŒ‰ๆŒ‡ๅฎš็š„ๆ—ถ้—ด้—ด้š”ๆฅ้šๆœบๅˆ‡ๆขไธ€ไธช็”จๆˆทไปฃ็†ๅญ—็ฌฆไธฒใ€‚ๆ‚จไนŸๅฏๆ‰‹ๅŠจ่ฎพ็ฝฎ็”จๆˆทไปฃ็†ๅญ—็ฌฆไธฒใ€‚่ฏฅๆ‰ฉๅฑ•้žๅธธ่ฝป้‡็บง๏ผŒๅช้œ€ๅพˆๅฐ‘็š„่ต„ๆบใ€‚็”จๆˆทๅฏๅฎšๅˆถ็”จๆˆทไปฃ็†็š„้šๆœบๅŒ–๏ผŒๅŒ…ๆ‹ฌไผช่ฃ…ไธบๅ“ช็งๆต่งˆๅ™จๅ’Œๆ“ไฝœ็ณป็ปŸใ€‚ๆœฌๆ‰ฉๅฑ•ๆไพ›ๆœ‰ไธ€ไธชไพ‹ๅค–ๅˆ—่กจๆฅ้ฟๅ…็‰นๅฎšๅŸŸๅๅ—ไผช่ฃ…ๅฝฑๅ“ใ€‚ๆœฌๆ‰ฉๅฑ•่ฟ˜ๅฏ้˜ฒๆญข้€š่ฟ‡ JavaScript ๅ‘ๆŽ˜ๆ‚จ็š„็œŸๅฎžไฟกๆฏใ€‚ - -ๅฎŒๅ…จๅ…่ดน๏ผŒๆฒกๆœ‰ๅนฟๅ‘Šใ€‚ - -็”จโค๏ธๅˆถไฝœ ๆบไปฃ็ ๏ผšhttps://github.com/tarampampam/random-user-agent diff --git a/public/_locales/zh_CN/messages.json b/public/_locales/zh_CN/messages.json deleted file mode 100644 index ec41dfc6..00000000 --- a/public/_locales/zh_CN/messages.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "manifest_name": { - "message": "Random User-Agent (Switcher)" - }, - "manifest_description": { - "message": "ๆŒ‰ๆ—ถ่‡ชๅŠจๆ›ดๆ”น็”จๆˆทไปฃ็†ๅญ—็ฌฆไธฒ๏ผŒ้š่—ๆ‚จ็š„็œŸๅฎž็”จๆˆทไปฃ็†ใ€‚" - }, - "manifest_action_default_title": { - "message": "้šๆœบๅŒ–ๆ‚จ็š„ User-Agent" - }, - "manifest_command_renew_useragent": {"message": "ๆขไธชๆ–ฐ็š„"}, - - "active_user_agent": {"message": "ๆดปๅŠจ User-Agent"}, - "pause_switcher": {"message": "ๆš‚ๅœๅˆ‡ๆขๅ™จ"}, - "unpause_switcher": {"message": "ๆขๅคๅˆ‡ๆขๅ™จ"}, - "enable_switcher": {"message": "ๅฏ็”จๅˆ‡ๆขๅ™จ"}, - "enabled_on_this_domain": {"message": "ๅทฒไธบๆญคๅŸŸๅฏ็”จ"}, - "get_new_agent": {"message": "ๆขไธชๆ–ฐ็š„"}, - "open_settings": {"message": "ๆ‰“ๅผ€่ฎพ็ฝฎ"}, - "make_donation": {"message": "ๆๅŠฉ"}, - "bug_report": {"message": "็ผบ้™ทๆŠฅๅ‘Š"}, - - "general_settings": {"message": "ๅธธ่ง„่ฎพ็ฝฎ"}, - "general_settings_hint": {"message": "ๆ‚จๅฏไปฅๆ นๆฎ้œ€ๆฑ‚ๆ›ดๆ”นๅˆ‡ๆขๅ™จ็š„่ฎพ็ฝฎใ€‚"}, - "auto_renew": {"message": "ๆŒ‰ๆ—ถ่‡ชๅŠจๆ›ดๆ”น็”จๆˆทไปฃ็†ๅญ—็ฌฆไธฒ"}, - "auto_renew_interval": {"message": "ๆฏ x ็ง’่‡ชๅŠจๆ›ดๆ–ฐ User-Agent๏ผˆๅฆ‚3600็ง’=1ๅฐๆ—ถ๏ผ‰"}, - "auto_renew_on_startup": {"message": "ๆต่งˆๅ™จๅฏๅŠจๆ—ถๆ›ดๆ”น User-Agent"}, - "js_protection": {"message": "้˜ฒๆญข้€š่ฟ‡ JavaScript ๆฃ€ๆต‹"}, - "custom_useragent": {"message": "ไปฅ้šๆœบ้กบๅบไฝฟ็”จ่‡ชๅฎšไน‰็š„็”จๆˆทไปฃ็†๏ผŒไธไฝฟ็”จ็”Ÿๆˆ"}, - "custom_useragent_list": {"message": "่‡ชๅฎšไน‰ User-Agents๏ผˆๆฏ่กŒไธ€ไธช๏ผ‰"}, - "generator_settings": {"message": "็”Ÿๆˆๅ™จ่ฎพ็ฝฎ"}, - "generator_settings_hint": {"message": ""}, - "blacklist_settings": {"message": "้ป‘ๅๅ•่ฎพ็ฝฎ"}, - "blacklist_settings_hint": {"message": "้ป‘ๅๅ•ๆจกๅผ - ้ป˜่ฎคๅฏ็”จ๏ผŒๅ…จ้ขๅฏ็”จ็”จๆˆทไปฃ็†ๅˆ‡ๆข๏ผŒ้™ค้ž็ฌฆๅˆๅทฒๅฎšไน‰็š„ๅŸŸๅๅ’Œ่ง„ๅˆ™ใ€‚็™ฝๅๅ•ๆจกๅผ็›ธๅ๏ผŒไป…้’ˆๅฏน็ฌฆๅˆๅทฒๅฎšไน‰็š„ๅŸŸๅๅ’Œ่ง„ๅˆ™็š„่ฎฟ้—ฎๅฏ็”จ็”จๆˆทไปฃ็†ๅˆ‡ๆขใ€‚"}, - "blacklist_mode": {"message": "้ป‘ๅๅ•ๆจกๅผ"}, - "whitelist_mode": {"message": "็™ฝๅๅ•ๆจกๅผ"}, - "blacklist_domains": {"message": "ๅŸŸๅๅˆ—่กจ๏ผˆๆฏ่กŒไธ€ๆก๏ผ‰"}, - "blacklist_custom_rules": {"message": "่‡ชๅฎšไน‰่ง„ๅˆ™๏ผˆๆฏ่กŒไธ€ๆก๏ผ‰"}, - "blacklist_custom_rules_hint": {"message": "ๆ‚จๅฏไปฅไฝฟ็”จ * ๅ’Œ ? ้€š้…็ฌฆใ€‚* ๅŒน้…ไปปไฝ•้•ฟๅบฆ็š„ๅญ—็ฌฆไธฒ๏ผˆไพ‹ๅฆ‚ *google.com ๅฏๅŒน้… google.com, www.google.com, mail.google.com ็ญ‰๏ผ‰๏ผŒ? ๅฏๅŒน้…ไธ€ไธชๅญ—็ฌฆ๏ผˆไพ‹ๅฆ‚ www.?oogle.com ๅฏๅŒน้… www.oogle.com, www.moogle.com, www.google.com, www.woogle.com ็ญ‰๏ผ‰"}, - "remove": {"message": "็งป้™ค"}, - "save_changes": {"message": "ไฟๅญ˜ๆ›ดๆ”น"}, - "error_occurred": {"message": "ๅ‘็”Ÿ้”™่ฏฏ"}, - "like_this_extension": {"message": "ไฝ ๅ–œๆฌข่ฟ™ไธชๆ‰ฉๅฑ•ๅ—๏ผŸ"}, - "give_a_star_on_github": {"message": "ๅœจGitHubไธŠ็ป™ๆˆ‘ไปฌไธ€้ข—ๆ˜Ÿ!"}, - "remote_useragent_list": {"message": "ไฝฟ็”จไปฅไธ‹URLๅˆ—่กจไธญ็š„็”จๆˆทไปฃ็†ไน‹ไธ€๏ผˆๆŒ‰้šๆœบ้กบๅบ๏ผ‰ใ€‚"}, - "remote_useragent_list_hint": {"message": "่ฏฅๆ‰ฉๅฑ•ๅฐ†ๅฎšๆœŸไธ‹่ฝฝ๏ผŒไปฅไฟๆŒๅ…ถๆœ€ๆ–ฐ็Šถๆ€"}, - "remote_useragent_updating_interval": {"message": "ๆ›ดๆ–ฐ้—ด้š”๏ผˆไปฅ็ง’ไธบๅ•ไฝ๏ผ›ไพ‹ๅฆ‚๏ผŒๆฏ3ๅฐๆ—ถ=60ร—60ร—3=10800๏ผ‰ใ€‚"}, - "update_now": {"message": "็Žฐๅœจๆ›ดๆ–ฐ"}, - "please_rate_extension": {"message": "่ฏท็ป™่ฟ™ไธชๆ’ไปถ่ฏ„ๅˆ†!"}, - - "edge_win": {"message": "Edge ไบŽ Windows"}, - "edge_mac": { "message": "Edge ไบŽ Mac" }, - "chrome_win": {"message": "Chrome ไบŽ Windows"}, - "chrome_mac": {"message": "Chrome ไบŽ Mac"}, - "chrome_linux": {"message": "Chrome ไบŽ Linux"}, - "chrome_android": {"message": "Chrome ไบŽ Android"}, - "firefox_win": {"message": "FireFox ไบŽ Windows"}, - "firefox_mac": {"message": "FireFox ไบŽ Mac"}, - "firefox_linux": {"message": "FireFox ไบŽ Linux"}, - "firefox_android": {"message": "Firefox ไบŽ Android"}, - "opera_win": {"message": "Opera ไบŽ Windows"}, - "opera_mac": {"message": "Opera ไบŽ Mac"}, - "safari_iphone": {"message": "Safari ไบŽ iPhone"}, - "safari_mac": {"message": "Safari ไบŽ Mac"} -} diff --git a/public/background.html b/public/background.html deleted file mode 100644 index 0fcc74b1..00000000 --- a/public/background.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Background - - - - - - diff --git a/public/icons/logo/128-gray.png b/public/icons/logo/128-gray.png deleted file mode 100644 index 45096e99..00000000 Binary files a/public/icons/logo/128-gray.png and /dev/null differ diff --git a/public/icons/logo/128.png b/public/icons/logo/128.png deleted file mode 100644 index 59761af9..00000000 Binary files a/public/icons/logo/128.png and /dev/null differ diff --git a/public/icons/logo/16-gray.png b/public/icons/logo/16-gray.png deleted file mode 100644 index f5e757a9..00000000 Binary files a/public/icons/logo/16-gray.png and /dev/null differ diff --git a/public/icons/logo/16.png b/public/icons/logo/16.png deleted file mode 100644 index 74265609..00000000 Binary files a/public/icons/logo/16.png and /dev/null differ diff --git a/public/icons/logo/48-gray.png b/public/icons/logo/48-gray.png deleted file mode 100644 index 8cc11654..00000000 Binary files a/public/icons/logo/48-gray.png and /dev/null differ diff --git a/public/icons/logo/48.png b/public/icons/logo/48.png deleted file mode 100644 index 6356b03e..00000000 Binary files a/public/icons/logo/48.png and /dev/null differ diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index f3739f81..00000000 --- a/public/manifest.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "manifest_version": 2, - "name": "__MSG_manifest_name__", - "version": "0", - "author": "https://github.com/tarampampam", - "homepage_url": "https://github.com/tarampampam/random-user-agent", - - "default_locale": "en", - "description": "__MSG_manifest_description__", - "icons": { - "16": "icons/logo/16.png", - "48": "icons/logo/48.png", - "128": "icons/logo/128.png" - }, - "minimum_chrome_version": "49.0", - "incognito": "spanning", - - "browser_action": { - "default_icon": "icons/logo/48.png", - "default_popup": "popup.html", - "default_title": "__MSG_manifest_action_default_title__" - }, - "background": { - "page": "background.html", - "persistent": true - }, - "options_ui": { - "page": "options.html", - "open_in_tab": true - }, - "content_scripts": [{ - "matches": [""], - "all_frames": true, - "run_at": "document_start", - "js": ["js/content-script.js"] - }], - "permissions": [ - "tabs", - "storage", - "webRequest", - "webRequestBlocking", - "" - ], - - "commands": { - "renew-useragent": { - "description": "__MSG_manifest_command_renew_useragent__", - "suggested_key": { - "default": "Ctrl+Shift+U" - } - } - } -} diff --git a/public/options.html b/public/options.html deleted file mode 100644 index 53182e61..00000000 --- a/public/options.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Options - - - -
- - - diff --git a/public/popup.html b/public/popup.html deleted file mode 100644 index 145795e0..00000000 --- a/public/popup.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Popup - - - -
- - - diff --git a/src/background.ts b/src/background.ts deleted file mode 100644 index 17a08579..00000000 --- a/src/background.ts +++ /dev/null @@ -1,187 +0,0 @@ -import {RuntimeReceiver} from './messaging/runtime' -import {HandlersRouter} from './messaging/handlers' -import Version from './messaging/handlers/version' -import BrowserStorage from './settings/storage' -import Settings, {SettingEvent} from './settings/settings' -import {IconState, setExtensionIcon} from './utils/icon' -import Timer from './utils/timer' -import RenewUseragent from './messaging/handlers/renew-useragent' -import EnabledForDomain from './messaging/handlers/enabled-for-domain' -import ChangeForDomain from './messaging/handlers/change-for-domain' -import ApplicableToURI from './messaging/handlers/applicable-to-uri' -import UseragentService from './services/useragent-service' -import Generator from './useragent/generator' -import FilterService from './services/filter-service' -import BeforeSendHeaders from './hooks/before-send-headers' -import UpdateSettings from './messaging/handlers/update-settings' -import GetSettings from './messaging/handlers/get-settings' -import Useragent, {UseragentStateEvent} from './useragent/useragent' -import GetUseragent from './messaging/handlers/get-useragent' -import UpdateUseragent from './messaging/handlers/update-useragent' -import HeadersReceived from './hooks/headers-received' -import RemoteListService, {LocalStorageStringsCache} from './services/remotelist-service' -import UpdateRemoteUAList from './messaging/handlers/update-remote-ua-list' -import OnCommand from './hooks/commands' -import {setExtensionTitle} from './utils/icon-title' -import {humanizeUserAgent} from './utils/humanize' - -// define default errors handler for the background page -const errorsHandler: (err: Error) => void = console.error - -// create extension storage instance -const storage = new BrowserStorage() -// create extension useragent state storage -const useragent = new Useragent() - -useragent.load().then((): void => { // load useragent state - useragent.on(UseragentStateEvent.onChange, (): void => { - useragent.save() - .then((): void => { - const info = useragent.get().info - - if (info) { - setExtensionTitle(humanizeUserAgent(info)).catch(errorsHandler) - } - }) - .catch(errorsHandler) // save useragent state on update - }) - - storage.init().then((): void => { // storage must be initialized before usage - const settings = new Settings(storage) - - settings.load().then((): void => { // load extension settings from the storage - const initialSettings = settings.get() - - // update extension icon on startup - setExtensionIcon(initialSettings.enabled ? IconState.Active : IconState.Inactive) - - // create all required services - const remoteListService = new RemoteListService(new LocalStorageStringsCache()) - const useragentService = new UseragentService(settings, useragent, new Generator(), remoteListService) - const filterService = new FilterService(settings) - - // set the remote list URI - if (initialSettings.remoteUseragentList.enabled && initialSettings.remoteUseragentList.uri.length > 0) { - remoteListService.setUri(initialSettings.remoteUseragentList.uri) - } - - remoteListService.init().then((): void => { // initialize remote user-agent list - // create the useragent auto-renewal timer - const renewalTimer = new Timer(initialSettings.renew.intervalMillis, (): void => { - useragentService.renew() - }) - - // create the remote user-agents list auto-updating timer - const remoteListUpdateTimer = new Timer(initialSettings.remoteUseragentList.updateIntervalMillis, (): void => { - remoteListService.update().catch(errorsHandler) - }) - - // update the remote user-agents list if empty - if (initialSettings.remoteUseragentList.enabled && remoteListService.get().length === 0) { - remoteListService.update().catch(errorsHandler) - } - - // renew the useragent on startup, if needed - if (initialSettings.renew.onStartup) { - useragentService.renew() - } - - // start the renewal timer, if extension and this feature are enabled - if (initialSettings.enabled && initialSettings.renew.enabled) { - renewalTimer.start() - } - - // start the remote user-agent list timer, if extension and this feature are enabled - if (initialSettings.enabled && initialSettings.remoteUseragentList.enabled) { - remoteListService.update().catch(errorsHandler) // update on startup - - if (remoteListUpdateTimer.getIntervalMillis() > 0) { - remoteListUpdateTimer.start() - } - } - - // subscribe for the settings changes - settings.on(SettingEvent.onChange, (): void => { - const changedSettings = settings.get() - - // update extension icon state - setExtensionIcon(changedSettings.enabled ? IconState.Active : IconState.Inactive) - - if (changedSettings.enabled) { - if (changedSettings.renew.enabled) { - // update renewal interval, if needed - if (renewalTimer.getIntervalMillis() !== changedSettings.renew.intervalMillis) { - renewalTimer.setIntervalMillis(changedSettings.renew.intervalMillis) - } - - if (!renewalTimer.isStarted()) { - renewalTimer.start() - } - } else { - renewalTimer.stop() - } - - if (changedSettings.remoteUseragentList.enabled) { - // update remote agents updating interval, if needed - if (remoteListUpdateTimer.getIntervalMillis() !== changedSettings.remoteUseragentList.updateIntervalMillis) { - if (changedSettings.remoteUseragentList.updateIntervalMillis > 0) { - remoteListUpdateTimer.setIntervalMillis(changedSettings.remoteUseragentList.updateIntervalMillis) - } else { - remoteListUpdateTimer.stop() - } - } - - // update the list URI - if (remoteListService.getUri() !== changedSettings.remoteUseragentList.uri) { - remoteListService.setUri(changedSettings.remoteUseragentList.uri) - remoteListService.update().catch(errorsHandler) - - if (changedSettings.remoteUseragentList.updateIntervalMillis > 0) { - remoteListUpdateTimer.restart() - } - } - - if (!remoteListUpdateTimer.isStarted() && changedSettings.remoteUseragentList.updateIntervalMillis > 0) { - remoteListUpdateTimer.start() - } - } else { - remoteListUpdateTimer.stop() - } - } else { - renewalTimer.stop() - remoteListUpdateTimer.stop() - } - - // and save - settings.save().catch(errorsHandler) - }) - - // register runtime messages listener when all dependencies are ready - new RuntimeReceiver( - new HandlersRouter( // register all handlers here - new Version, - new GetSettings(settings), - new UpdateSettings(settings), - new RenewUseragent(useragentService), - new EnabledForDomain(filterService), - new ChangeForDomain(filterService), - new ApplicableToURI(filterService), - new GetUseragent(useragent), - new UpdateUseragent(useragent), - new UpdateRemoteUAList(remoteListService, errorsHandler), - ), - errorsHandler, - ).listen() - - // this hook is required for the HTTP headers modification - new BeforeSendHeaders(settings, useragent, filterService).listen() - - // this hook allows to send important data to the content script without using sendMessage() - new HeadersReceived(settings, useragent, filterService).listen() - - // this hook allows handle keyboard shortcuts - new OnCommand(useragentService).listen() - }).catch(errorsHandler) - }).catch(errorsHandler) - }).catch(errorsHandler) -}).catch(errorsHandler) diff --git a/src/content-script.ts b/src/content-script.ts deleted file mode 100644 index e1ccaa72..00000000 --- a/src/content-script.ts +++ /dev/null @@ -1,249 +0,0 @@ -import {RuntimeSender} from './messaging/runtime' -import {applicableToURI, ApplicableToURIResponse} from './messaging/handlers/applicable-to-uri' -import {getSettings, GetSettingsResponse} from './messaging/handlers/get-settings' -import {getUseragent, GetUseragentResponse} from './messaging/handlers/get-useragent' -import {CookieName, decode, Payload} from './hooks/headers-received' -import ClientHint, {IBrand, UaPlatform} from './useragent/client-hint' - -interface IClientHints { - brands: { - full, short: IBrand[] - } - platform: UaPlatform - isMobile: boolean -} - -new Promise((resolve: (p: Payload) => void, reject: (e: Error) => void) => { - // make an attempt to fetch the payload from the cookies - const cookies = document.cookie.split(';') - - for (let i = 0; i < cookies.length; i++) { - const cookie = cookies[i].trimStart() - - if (cookie.startsWith(CookieName + '=')) { - const parts = cookie.split('=') - - if (parts.length >= 2) { - document.cookie = `${CookieName}=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/` // remove the cookie - - return resolve(decode(parts[1])) - } - } - } - - // and as a fallback - sending requests to the background script - new RuntimeSender() - .send( // order is important! - applicableToURI(window.location.href), - getSettings(), - getUseragent(), - ) - .then((resp): void => { // <-- the promise is the main problem for hiding from inline scripts detection - const applicable = (resp[0] as ApplicableToURIResponse).payload.applicable - const settings = (resp[1] as GetSettingsResponse).payload - const uaInfo = (resp[2] as GetUseragentResponse).payload.info - - if (applicable && settings.jsProtection.enabled && uaInfo !== undefined) { - return resolve({ - uaInfo: uaInfo, - }) - } - }) - .catch(reject) -}) - .then((p: Payload): string => { - const callingArgs: [Payload, IClientHints] = [p, { - brands: { - full: ClientHint.brands(p.uaInfo, true), - short: ClientHint.brands(p.uaInfo, false), - }, - platform: ClientHint.platform(p.uaInfo), - isMobile: ClientHint.isMobile(p.uaInfo), - }] - - return '(' + function (p: Payload, ch: IClientHints): void { - // makes required navigator object modifications - const patchNavigator = (navigator: Navigator): void => { - // allows to overload object property with a getter function (without potential exceptions) - const overloadPropertyWithGetter = (object: object, property: string, value: any): void => { - if (typeof object === 'object') { - if (Object.getOwnPropertyDescriptor(object, property) === undefined) { - Object.defineProperty(object, property, {get: (): any => value}) - } - } - } - - if (typeof navigator === 'object') { - overloadPropertyWithGetter(navigator, 'userAgent', p.uaInfo.useragent) - - // app version should not contain "Mozilla/" prefix - overloadPropertyWithGetter(navigator, 'appVersion', p.uaInfo.useragent.replace(/^Mozilla\//i, '')) - - enum NavigatorPropNames { - platform = 'platform', - oscpu = 'oscpu', - vendor = 'vendor', - } - - // patch the platform property (based on os type) - switch (p.uaInfo.osType) { // fixes - case 'windows': - overloadPropertyWithGetter(navigator, NavigatorPropNames.platform, 'Win32') - overloadPropertyWithGetter(navigator, NavigatorPropNames.oscpu, 'Windows NT; Win64; x64') - break - - case 'linux': - overloadPropertyWithGetter(navigator, NavigatorPropNames.platform, 'Linux x86_64') - overloadPropertyWithGetter(navigator, NavigatorPropNames.oscpu, 'Linux x86_64') - break - - case 'android': - overloadPropertyWithGetter(navigator, NavigatorPropNames.platform, 'Linux armv8l') - overloadPropertyWithGetter(navigator, NavigatorPropNames.oscpu, 'Linux armv8l') - break - - case 'macOS': - overloadPropertyWithGetter(navigator, NavigatorPropNames.platform, 'MacIntel') - overloadPropertyWithGetter(navigator, NavigatorPropNames.oscpu, 'Mac OS X') - break - - case 'iOS': - overloadPropertyWithGetter(navigator, NavigatorPropNames.platform, 'iPhone') - overloadPropertyWithGetter(navigator, NavigatorPropNames.oscpu, 'Mac OS X') - break - - default: - overloadPropertyWithGetter(navigator, NavigatorPropNames.oscpu, undefined) - break - } - - switch (p.uaInfo.engine) { - case 'blink': - overloadPropertyWithGetter(navigator, NavigatorPropNames.vendor, 'Google Inc.') - break - - case 'gecko': // firefox always with an empty vendor - overloadPropertyWithGetter(navigator, NavigatorPropNames.vendor, '') - break - - case 'webkit': - overloadPropertyWithGetter(navigator, NavigatorPropNames.vendor, 'Apple Computer Inc.') - break - } - - // https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/core/frame/navigator_ua_data.cc - // https://web.dev/migrate-to-ua-ch/ - // https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData - if (typeof navigator['userAgentData'] === 'object') { - // returns formatted list for usage in {NavigatorUAData} object - const formatBrandsList = (list: IBrand[]): NavigatorUABrandVersion[] => { - return list.map(b => { - return {brand: b.brand, version: b.version} - }) - } - - overloadPropertyWithGetter(navigator, 'userAgentData', new Proxy(navigator.userAgentData, { - get(target: NavigatorUAData, key: string | symbol, receiver): any { - if (key in target) { - if (typeof target[key] === 'function') { // functions - switch (key) { - case 'toJSON': - return (): UALowEntropyJSON => { - return { - ...target[key].bind(target).call(receiver), - mobile: ch.isMobile, - brands: formatBrandsList(ch.brands.short), - platform: ch.platform, - } - } - - case 'getHighEntropyValues': - return (hints: string[]): Promise => { - return new Promise((resolve: (v: UADataValues) => void, reject: () => void): void => { - target[key].bind(target).call(receiver, hints) - .then((original: UADataValues) => { - resolve({ - ...original, - brands: formatBrandsList(ch.brands.short), - mobile: ch.isMobile, - platform: ch.platform, - uaFullVersion: p.uaInfo.browserVersion.full, - fullVersionList: formatBrandsList(ch.brands.full), - platformVersion: undefined, // unset the original property - }) - }) - .catch(reject) - }) - } - } - - return target[key].bind(target) // proxy pass - } else { // properties - switch (key) { - case 'brands': - return formatBrandsList(ch.brands.short) - - case 'mobile': - return ch.isMobile - - case 'platform': - return ch.platform - } - - return target[key] // proxy pass - } - } - }, - })) - } - } - } - - // patch current window navigator - patchNavigator(window.navigator) - - // handler for patching navigator object for the iframes - // issue: - window.addEventListener('load', (): void => { - const iframes = document.getElementsByTagName('iframe') - - for (let i = 0; i < iframes.length; i++) { - const contentWindow = iframes[i].contentWindow - - if (typeof contentWindow === 'object' && contentWindow !== null) { - patchNavigator(contentWindow.navigator) - } - } - }, {once: true, passive: true}) - - // watch for the new iframes dynamic creation - new MutationObserver((mutations): void => { - mutations.forEach((mutation): void => { - mutation.addedNodes.forEach((addedNode): void => { - if (addedNode.nodeName === 'IFRAME') { - const iframe = addedNode as HTMLIFrameElement, contentWindow = iframe.contentWindow - - if (typeof contentWindow === 'object' && contentWindow !== null) { - patchNavigator(contentWindow.navigator) - } - } - }) - }) - }).observe(document, {childList: true, subtree: true}) - } + `)(${callingArgs.map(v => JSON.stringify(v)).join(',')})` - }, - ) - .then((scriptContent: string): void => { - const script = document.createElement('script'), parent = document.head || document.documentElement - - script.textContent = scriptContent - - // script.defer = false - // script.async = false - parent.appendChild(script) // execute the script - - setTimeout(() => { - parent.removeChild(script) - }) // and remove them on a next tick - }) - .catch(console.warn) diff --git a/src/entrypoints/background/api/filters.ts b/src/entrypoints/background/api/filters.ts new file mode 100644 index 00000000..7823c97c --- /dev/null +++ b/src/entrypoints/background/api/filters.ts @@ -0,0 +1,37 @@ +import Rule = chrome.declarativeNetRequest.Rule +import type { ReadonlySettingsState, ReadonlyUserAgentState } from '~/shared/types' +import { setRequestHeaders, unsetRequestHeaders } from '../hooks' + +/** Returns true if the extension is applicable for the given domain name. */ +export async function isApplicableForDomain(settings: ReadonlySettingsState, domain: string): Promise { + const isInList = settings.blacklist.domains.some((item): boolean => item === domain || domain.endsWith(`.${item}`)) + + switch (settings.blacklist.mode) { + case 'blacklist': + return !isInList + + case 'whitelist': + return isInList + } +} + +/** Reloads the request headers based on the current settings and user-agent. */ +export async function reloadRequestHeaders( + settings: ReadonlySettingsState, + current: ReadonlyUserAgentState | undefined +): Promise | void> { + if (settings.enabled && current) { + // if the extension is disabled or current user-agent is not set, we do not need to update the + // browser request headers + return await setRequestHeaders( + current, + settings.blacklist.mode === 'blacklist' + ? { exceptDomains: settings.blacklist.domains } + : { applyToDomains: settings.blacklist.domains }, + settings.jsProtection.enabled + ) + } + + // otherwise, we need to unset the request headers + await unsetRequestHeaders() +} diff --git a/src/entrypoints/background/api/index.ts b/src/entrypoints/background/api/index.ts new file mode 100644 index 00000000..7a4242ea --- /dev/null +++ b/src/entrypoints/background/api/index.ts @@ -0,0 +1,3 @@ +export { isApplicableForDomain, reloadRequestHeaders } from './filters' +export { default as renewUserAgent } from './renew-user-agent' +export { default as updateRemoteUserAgentList } from './update-remote-useragent-list' diff --git a/src/entrypoints/background/api/renew-user-agent.ts b/src/entrypoints/background/api/renew-user-agent.ts new file mode 100644 index 00000000..cf951c7a --- /dev/null +++ b/src/entrypoints/background/api/renew-user-agent.ts @@ -0,0 +1,292 @@ +import UAParser from 'ua-parser-js' +import type { ReadonlySettingsState, ReadonlyUserAgentState } from '~/shared/types' +import { generateUserAgent } from '~/shared/user-agent' +import { type BrowserType, generatorTypesToSets, type OSType } from '../../../shared' +import { + Settings, + CurrentUserAgent, + type RemoteUserAgentList, + LatestBrowserVersions, + type ReadonlyVersionsState, +} from '../persistent' + +const linuxOsRe = + /nix|nux|bsd|vms|cent|chrom|fedora|debian|elementary|gentoo|gnu|harmony|kai|mageia|mandriva|manjaro|mint|slack|suse|ubuntu/i +const iosOsRe = /iphone|ipad|ipod/i + +export default async function renewUserAgent( + s: Settings, + current: CurrentUserAgent, + remote: RemoteUserAgentList, + hostOS: chrome.runtime.PlatformOs, + latestVersions: LatestBrowserVersions +): Promise< + Readonly<{ + source: 'custom_agents_list' | 'remote_list' | 'generator' + previous?: ReadonlyUserAgentState + new: ReadonlyUserAgentState + }> +> { + const previous = await current.get() + const settings = await s.get() + + const useCustom = settings.customUseragent.enabled + const useRemote = settings.remoteUseragentList.enabled + + let picked: ReadonlyUserAgentState | undefined = undefined + let source: Awaited>['source'] | undefined = undefined + + switch (true) { + case useCustom && useRemote: { + // 50% / 50% + if (Math.random() < 0.5) { + picked = customUserAgent(settings) + source = 'custom_agents_list' + } else { + picked = await remoteUserAgent(remote) + source = 'remote_list' + } + + break + } + + case useCustom: { + picked = customUserAgent(settings) + source = 'custom_agents_list' + + break + } + + case useRemote: { + picked = await remoteUserAgent(remote) + source = 'remote_list' + + break + } + } + + if (picked && source) { + await current.update(picked) + + return Object.freeze({ source, previous, new: picked }) + } + + const [latest] = await latestVersions.get() + const generated = generatedUserAgent(settings, hostOS, latest) + + await current.update(generated) + + return Object.freeze({ source: 'generator', previous, new: generated }) +} + +const customUserAgent = (settings: ReadonlySettingsState): ReadonlyUserAgentState | undefined => { + const list = settings.customUseragent.list + + if (list.length) { + const random = list[Math.floor(Math.random() * list.length)] + + if (random.trim().length) { + return parseUserAgentString(random) + } + } +} + +const remoteUserAgent = async (remote: RemoteUserAgentList): Promise => { + const random = await remote.get(true) + + if (random && random.trim().length) { + return parseUserAgentString(random) + } +} + +const generatedUserAgent = ( + settings: ReadonlySettingsState, + hostOS: chrome.runtime.PlatformOs, + latest?: ReadonlyVersionsState +): ReadonlyUserAgentState => { + const { types, syncOsWithHost } = settings.generator + const [browsers, oses] = generatorTypesToSets(types) + + // pick a random browser type and os to generate a user agent + const pickBrowser: BrowserType = browsers.length ? browsers[Math.floor(Math.random() * browsers.length)] : 'chrome' + const pickOS: OSType = syncOsWithHost + ? ((): OSType => { + switch (hostOS) { + case 'mac': + return 'macos' + case 'linux': + case 'openbsd': + case 'fuchsia': + case 'cros': + return 'linux' + case 'android': + return 'android' + } + + return 'windows' // fallback + })() + : oses.length + ? oses[Math.floor(Math.random() * oses.length)] + : 'windows' // fallback + + // run the generator with the selected type and provide the latest browser versions, if available + const generated = generateUserAgent( + ((): Parameters[0] => { + switch (true) { + case pickBrowser === 'chrome' && pickOS === 'linux': + return 'chrome_linux' + case pickBrowser === 'chrome' && pickOS === 'macos': + return 'chrome_mac' + case pickBrowser === 'chrome' && pickOS === 'windows': + return 'chrome_win' + case pickBrowser === 'chrome' && pickOS === 'android': + return 'chrome_android' + case pickBrowser === 'firefox' && pickOS === 'linux': + return 'firefox_linux' + case pickBrowser === 'firefox' && pickOS === 'macos': + return 'firefox_mac' + case pickBrowser === 'firefox' && pickOS === 'windows': + return 'firefox_win' + case pickBrowser === 'firefox' && pickOS === 'android': + return 'firefox_android' + case pickBrowser === 'safari' && pickOS === 'ios': + return 'safari_iphone' + case pickBrowser === 'safari' && pickOS === 'macos': + return 'safari_mac' + case pickBrowser === 'opera' && pickOS === 'windows': + return 'opera_win' + case pickBrowser === 'opera' && pickOS === 'macos': + return 'opera_mac' + case pickBrowser === 'edge' && pickOS === 'windows': + return 'edge_win' + case pickBrowser === 'edge' && pickOS === 'macos': + return 'edge_mac' + } + + return 'chrome_win' // fallback + })(), + ((): Parameters[1] => { + switch (pickBrowser) { + case 'chrome': + return { maxMajor: latest?.chrome } + case 'firefox': + return { maxMajor: latest?.firefox } + case 'opera': + return { maxMajor: latest?.opera, underHoodMaxMajor: latest?.chrome } + case 'safari': + return { maxMajor: latest?.safari } + case 'edge': + return { maxMajor: latest?.edge, underHoodMaxMajor: latest?.chrome } + } + })() + ) + + return Object.freeze({ + userAgent: generated.userAgent, + browser: ((): ReadonlyUserAgentState['browser'] => { + switch (pickBrowser) { + case 'chrome': + return 'chrome' + case 'firefox': + return 'firefox' + case 'opera': + return 'opera' + case 'safari': + return 'safari' + case 'edge': + return 'edge' + default: + return 'unknown' + } + })(), + os: ((): ReadonlyUserAgentState['os'] => { + switch (pickOS) { + case 'windows': + return 'windows' + case 'linux': + return 'linux' + case 'macos': + return 'macOS' + case 'ios': + return 'iOS' + case 'android': + return 'android' + default: + return 'unknown' + } + })(), + version: { + browser: { major: generated.version.browser.major, full: generated.version.browser.full }, + underHood: generated.version.underHood + ? { major: generated.version.underHood.major, full: generated.version.underHood.full } + : undefined, + }, + }) +} + +const parseUserAgentString = (ua: string): ReadonlyUserAgentState => { + const parsed = new UAParser(ua).getResult() + + const os = ((): ReadonlyUserAgentState['os'] => { + const v = parsed.os.name?.toLowerCase() + + if (v) { + switch (true) { + case v.includes('windows'): + return 'windows' + case linuxOsRe.test(v): + return 'linux' + case v.includes('mac'): + return 'macOS' + case iosOsRe.test(v): + return 'iOS' + case v.includes('android'): + return 'android' + } + } + + return 'unknown' + })() + + const browser = ((): ReadonlyUserAgentState['browser'] => { + const v = parsed.browser.name?.toLowerCase() + + if (v) { + switch (true) { + case v.includes('chrome'): + return 'chrome' + case v.includes('firefox'): + case v.includes('firebird'): + return 'firefox' + case v.includes('opera'): + return 'opera' + case v.includes('safari'): + return 'safari' + case v.includes('edge'): + return 'edge' + } + } + + return 'unknown' + })() + + const browserVersion = ((): ReadonlyUserAgentState['version']['browser'] => { + const version = parsed.browser.version + + if (version) { + return { + major: parseInt(version?.split('.')[0], 10), + full: version, + } + } + + return { major: 0, full: '0.0.0' } + })() + + return Object.freeze({ + userAgent: parsed.ua, + browser, + os, + version: { browser: browserVersion }, + }) +} diff --git a/src/entrypoints/background/api/update-remote-useragent-list.ts b/src/entrypoints/background/api/update-remote-useragent-list.ts new file mode 100644 index 00000000..b0d79665 --- /dev/null +++ b/src/entrypoints/background/api/update-remote-useragent-list.ts @@ -0,0 +1,26 @@ +import { RemoteUserAgentList } from '../persistent' + +export default async function ( + remote: RemoteUserAgentList, + clearBefore?: boolean +): Promise< + Readonly<{ + url: string + gotListSize: number + }> +> { + if (!remote.url) { + throw new Error('Remote list URL is not set') + } + + if (clearBefore) { + await remote.clear() + } + + await remote.update() + + return Object.freeze({ + url: remote.url.toString(), + gotListSize: (await remote.get(false))?.length || 0, + }) +} diff --git a/src/entrypoints/background/hooks/http-requests.ts b/src/entrypoints/background/hooks/http-requests.ts new file mode 100644 index 00000000..f1740a7a --- /dev/null +++ b/src/entrypoints/background/hooks/http-requests.ts @@ -0,0 +1,250 @@ +import { browserBrands, isMobile, platform } from '~/shared/client-hint' +import { canonizeDomain } from '~/shared' +import type { ContentScriptPayload, ReadonlyUserAgentState } from '~/shared/types' +import ResourceType = chrome.declarativeNetRequest.ResourceType +import Rule = chrome.declarativeNetRequest.Rule + +// copy-paste of chrome.declarativeNetRequest.RuleActionType type (FireFox v124 does not have it) +// https://developer.chrome.com/docs/extensions/reference/api/declarativeNetRequest#type-RuleActionType +enum RuleActionType { + BLOCK = 'block', // Block the network request + REDIRECT = 'redirect', // Redirect the network request + ALLOW = 'allow', // Allow the network request. The request won't be intercepted if there is an allow rule which matches it + UPGRADE_SCHEME = 'upgradeScheme', // Upgrade the network request url's scheme to https if the request is http or ftp + MODIFY_HEADERS = 'modifyHeaders', // Modify request/response headers from the network request + ALLOW_ALL_REQUESTS = 'allowAllRequests', // Allow all requests within a frame hierarchy, including the frame request itself +} + +// copy-paste of chrome.declarativeNetRequest.HeaderOperation type (FireFox v124 does not have it) +// https://developer.chrome.com/docs/extensions/reference/api/declarativeNetRequest#type-HeaderOperation +enum HeaderOperation { + APPEND = 'append', // Adds a new entry for the specified header. This operation is not supported for request headers + SET = 'set', // Sets a new value for the specified header, removing any existing headers with the same name + REMOVE = 'remove', // Removes all entries for the specified header +} + +// Note: the rule IDs must be unique, and do not change them after the extension is published. +// The rule IDs are used to remove the existing rules before adding new ones. +const RuleIDs: { readonly [_ in 'ReplaceUserAgent' | 'ReplaceClientHints' | 'ProvidePayload']: number } = { + ReplaceUserAgent: 1, + ReplaceClientHints: 2, + ProvidePayload: 3, +} + +enum HeaderNames { + USER_AGENT = 'User-Agent', + CLIENT_HINT_FULL_VERSION = 'Sec-CH-UA-Full-Version', // deprecated, https://mzl.la/3g1NzEI + CLIENT_HINT_PLATFORM_VERSION = 'Sec-CH-UA-Platform-Version', // https://mzl.la/3yyNXAY + CLIENT_HINT_BRAND_MAJOR = 'Sec-CH-UA', // https://mzl.la/3EaQyoi + CLIENT_HINT_BRAND_FULL = 'Sec-CH-UA-Full-Version-List', // https://mzl.la/3C3x5TT + CLIENT_HINT_PLATFORM = 'Sec-CH-UA-Platform', // https://mzl.la/3EbrbTj + CLIENT_HINT_MOBILE = 'Sec-CH-UA-Mobile', // https://mzl.la/3SYTA3f + SERVER_TIMING = 'server-timing', // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Server-Timing +} + +const allResourceTypes = Object.values(ResourceType) + +// the following domains are always excluded from the rules +const alwaysExcludedFor: ReadonlyArray = ['challenges.cloudflare.com'].map(canonizeDomain) + +/** + * Enables the request headers modification. + * + * The filter parameter is optional and can be used to apply the rules only to specific domains. + * If filter is not provided, the rules are applied to all domains. + * + * Enabling payload sending means that the JS protection is enabled. + * + * To debug the rules, you can use the following page: + * https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending + * + * @link https://developer.chrome.com/docs/extensions/reference/api/declarativeNetRequest + * + * @throws {Error} If the rules cannot be set + */ +export async function setRequestHeaders( + ua: ReadonlyUserAgentState, + filter?: { applyToDomains?: ReadonlyArray; exceptDomains?: ReadonlyArray }, + sendPayload: boolean = false +): Promise> { + const condition: chrome.declarativeNetRequest.RuleCondition = { + resourceTypes: allResourceTypes, + } + + if (filter?.applyToDomains && filter.applyToDomains.length > 0) { + // initiatorDomains: The rule only matches network requests originating from this list of domains. If the list + // is omitted, the rule is applied to requests from all domains. An empty list is not allowed. + // A canonical domain should be used. This matches against the request initiator and not the + // request URL. + // requestDomains: The rule only matches network requests when the domain matches one from this list. If the + // list is omitted, the rule is applied to requests from all domains. An empty list is not + // allowed. A canonical domain should be used. + // + // https://developer.chrome.com/docs/extensions/reference/api/declarativeNetRequest#type-MatchedRulesFilter + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/declarativeNetRequest/RuleCondition + const list = filter.applyToDomains.map(canonizeDomain).filter(Boolean) + + if (list.length) { + condition.initiatorDomains = condition.requestDomains = list + } + } + + if (filter?.exceptDomains && filter.exceptDomains.length > 0) { + // excludedInitiatorDomains: The rule does not match network requests originating from this list of domains. + // If the list is empty or omitted, no domains are excluded. This takes precedence + // over initiatorDomains. A canonical domain should be used. This matches against + // the request initiator and not the request URL. + // excludedRequestDomains: The rule does not match network requests when the domains matches one from this + // list. If the list is empty or omitted, no domains are excluded. This takes + // precedence over requestDomains. A canonical domain should be used. + const list = filter.exceptDomains.map(canonizeDomain).filter(Boolean) + + if (list.length) { + condition.excludedInitiatorDomains = condition.excludedRequestDomains = list + } + } + + // add the always excluded domains to the condition + if (condition.excludedInitiatorDomains) { + condition.excludedInitiatorDomains = [...new Set(condition.excludedInitiatorDomains.concat(alwaysExcludedFor))] + } else { + condition.excludedInitiatorDomains = [...alwaysExcludedFor] + } + + // and do the same for the request domains + if (condition.excludedRequestDomains) { + condition.excludedRequestDomains = [...new Set(condition.excludedRequestDomains.concat(alwaysExcludedFor))] + } else { + condition.excludedRequestDomains = [...alwaysExcludedFor] + } + + const brandsWithMajor = (() => { + switch (ua.browser) { + case 'chrome': + return browserBrands('chrome', ua.version.browser.major) + case 'opera': + return browserBrands('opera', ua.version.browser.major, ua.version.underHood?.major || 0) + case 'edge': + return browserBrands('edge', ua.version.browser.major, ua.version.underHood?.major || 0) + } + + return [] + })() + + const brandsWithFull = (() => { + switch (ua.browser) { + case 'chrome': + return browserBrands('chrome', ua.version.browser.full) + case 'opera': + return browserBrands('opera', ua.version.browser.full, ua.version.underHood?.full || '') + case 'edge': + return browserBrands('edge', ua.version.browser.full, ua.version.underHood?.full || '') + } + + return [] + })() + + const setPlatform = platform(ua.os) + const setIsMobile = isMobile(ua.os) + + const payload: ContentScriptPayload = { + current: ua, + brands: { + major: brandsWithMajor, + full: brandsWithFull, + }, + platform: setPlatform, + isMobile: setIsMobile, + } + + const rules: Array = [ + { + id: RuleIDs.ReplaceUserAgent, + action: { + type: RuleActionType.MODIFY_HEADERS, + requestHeaders: [ + { + operation: HeaderOperation.SET, + header: HeaderNames.USER_AGENT, + value: ua.userAgent, + }, + ], + }, + condition, + }, + { + id: RuleIDs.ReplaceClientHints, + action: { + type: RuleActionType.MODIFY_HEADERS, + requestHeaders: [ + brandsWithMajor + ? { + operation: HeaderOperation.SET, + header: HeaderNames.CLIENT_HINT_BRAND_MAJOR, + value: brandsWithMajor.map((b) => `"${b.brand}";v="${b.version}"`).join(', '), + } + : { operation: HeaderOperation.REMOVE, header: HeaderNames.CLIENT_HINT_BRAND_MAJOR }, + brandsWithFull + ? { + operation: HeaderOperation.SET, + header: HeaderNames.CLIENT_HINT_BRAND_FULL, + value: brandsWithFull.map((b) => `"${b.brand}";v="${b.version}"`).join(', '), + } + : { operation: HeaderOperation.REMOVE, header: HeaderNames.CLIENT_HINT_BRAND_FULL }, + { + operation: HeaderOperation.SET, + header: HeaderNames.CLIENT_HINT_PLATFORM, + value: `"${setPlatform}"`, + }, + { + operation: HeaderOperation.SET, + header: HeaderNames.CLIENT_HINT_MOBILE, + value: setIsMobile ? '?1' : '?0', + }, + { operation: HeaderOperation.REMOVE, header: HeaderNames.CLIENT_HINT_FULL_VERSION }, + { operation: HeaderOperation.REMOVE, header: HeaderNames.CLIENT_HINT_PLATFORM_VERSION }, + ], + }, + condition, + }, + ] + + if (sendPayload) { + rules.push({ + id: RuleIDs.ProvidePayload, + action: { + type: RuleActionType.MODIFY_HEADERS, + responseHeaders: [ + { + operation: HeaderOperation.SET, + header: HeaderNames.SERVER_TIMING, + value: `${__UNIQUE_HEADER_KEY_NAME__};desc="${btoa(JSON.stringify(payload)).replace(/=/g, '_')}"`, + }, + ], + }, + condition, + }) + } + + await chrome.declarativeNetRequest.updateDynamicRules({ + removeRuleIds: Object.values(RuleIDs), // remove existing rules + addRules: rules, + }) + + if (chrome.runtime.lastError) { + throw new Error(chrome.runtime.lastError.message) + } + + return rules +} + +/** Unsets the request headers. */ +export async function unsetRequestHeaders(): Promise { + await chrome.declarativeNetRequest.updateDynamicRules({ + removeRuleIds: Object.values(RuleIDs), // remove existing rules + }) + + if (chrome.runtime.lastError) { + throw new Error(chrome.runtime.lastError.message) + } +} diff --git a/src/entrypoints/background/hooks/index.ts b/src/entrypoints/background/hooks/index.ts new file mode 100644 index 00000000..a430d04e --- /dev/null +++ b/src/entrypoints/background/hooks/index.ts @@ -0,0 +1,2 @@ +export { setRequestHeaders, unsetRequestHeaders } from './http-requests' +export { registerContentScripts } from './scripting' diff --git a/src/entrypoints/background/hooks/scripting.ts b/src/entrypoints/background/hooks/scripting.ts new file mode 100644 index 00000000..908f0090 --- /dev/null +++ b/src/entrypoints/background/hooks/scripting.ts @@ -0,0 +1,41 @@ +import RegisteredContentScript = chrome.scripting.RegisteredContentScript + +// the common properties for the content scripts +const common: Omit = { + matches: [''], + allFrames: true, + runAt: 'document_start', +} + +// properties for the content script that will be executed in the isolated world (as a content script) +const content: RegisteredContentScript = { ...common, id: 'content', js: ['content.js'] } + +// properties for the content script that will be executed in the main world (as an injected script) +const inject: RegisteredContentScript = { ...common, id: 'inject', js: [__UNIQUE_INJECT_FILENAME__] } + +/** Register the content scripts */ +export async function registerContentScripts() { + // first, unregister (probably) previously registered content scripts + await chrome.scripting.unregisterContentScripts() + + try { + await chrome.scripting.registerContentScripts([ + { ...content, world: 'ISOLATED' }, + { ...inject, world: 'MAIN' }, + ]) + } catch (err) { + if ( + err instanceof Error && + err.message.toLowerCase().includes('unexpected property') && + err.message.includes('world') + ) { + // if so, it means that the "world" property is not supported by the current browser (FireFox at this moment) + // so we need to register the content scripts without the "world" property + // + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/RegisteredContentScript#browser_compatibility + return await chrome.scripting.registerContentScripts([content]) + } + + throw err + } +} diff --git a/src/entrypoints/background/hotkeys/hotkeys.ts b/src/entrypoints/background/hotkeys/hotkeys.ts new file mode 100644 index 00000000..431f9d64 --- /dev/null +++ b/src/entrypoints/background/hotkeys/hotkeys.ts @@ -0,0 +1,9 @@ +export default function (handlers: { renewUserAgent: () => Promise | void }) { + chrome.commands.onCommand.addListener(async (command) => { + switch (command) { + case 'renew-useragent': // command name, defined in manifest.json + await handlers.renewUserAgent() + break + } + }) +} diff --git a/src/entrypoints/background/hotkeys/index.ts b/src/entrypoints/background/hotkeys/index.ts new file mode 100644 index 00000000..68dd84bf --- /dev/null +++ b/src/entrypoints/background/hotkeys/index.ts @@ -0,0 +1 @@ +export { default as registerHotkeys } from './hotkeys' diff --git a/src/entrypoints/background/index.ts b/src/entrypoints/background/index.ts new file mode 100644 index 00000000..12aac54d --- /dev/null +++ b/src/entrypoints/background/index.ts @@ -0,0 +1,276 @@ +import { checkPermissions, detectBrowser, watchPermissionsChange } from '~/shared' +import { type HandlersMap, listen as listenRuntime } from '~/shared/messaging' +import { newErrorEvent, newExtensionLoadedEvent } from '~/shared/stats' +import { isApplicableForDomain, reloadRequestHeaders, renewUserAgent, updateRemoteUserAgentList } from './api' +import { registerContentScripts, unsetRequestHeaders } from './hooks' +import { registerHotkeys } from './hotkeys' +import { + CurrentUserAgent, + RemoteUserAgentList, + Settings, + StorageArea, + UserID, + LatestBrowserVersions, +} from './persistent' +import { type Collector as StatsCollector, GaCollector } from './stats' +import { Timer } from './timer' +import { setExtensionIcon, setExtensionTitle } from './ui' + +/** Debug logging */ +const debug = (msg: string, ...args: Array): void => console.debug(`%c๐Ÿ˜ˆ ${msg}`, 'font-weight:bold', ...args) +/** Convert milliseconds to seconds */ +const m2s = (millis: number): number => Math.round(millis / 1000) +let stats: StatsCollector | undefined = undefined + +// register the error handler to catch global errors (unhandled exceptions) and unhandled promise rejections to +// send the error events to the stats collector +;((): void => { + const errorsHandler = (error: unknown): void => { + if (stats && error) { + stats.send(newErrorEvent(error, { page: 'background' })).then((err) => err && debug('stats error', err)) + } + } + + if (self && self.addEventListener) { + self.addEventListener('error', errorsHandler) + self.addEventListener('error', errorsHandler) + } +})() + +// run the background script +;(async () => { + // register the content scripts + await registerContentScripts() + + // detect the host OS + const hostOS = (await chrome.runtime.getPlatformInfo()).os + + // at least FireFox does not allow the extension to work with all URLs by default, and the user must grant the + // necessary permissions. in addition, the user can revoke the permissions at any time, so we need to monitor the + // changes in the permissions and open the onboarding page if the necessary permissions are missing + watchPermissionsChange(async () => await checkPermissions(true)) + + // if the permissions are not granted, we open the onboarding page to explain the situation to the user + await checkPermissions(true) + + // settings are stored in the 'sync' storage area because they need to be synchronized between different devices, + // and only if the 'sync' storage area is not available, we use the 'local' storage area + const settings = new Settings(new StorageArea('settings-struct-v3', 'sync', 'local')) + const initSettings = await settings.get() + debug('settings', initSettings) + + // for the current user-agent, we need to use the 'local' storage area because it supports much more frequent + // updates and does not require synchronization between devices. do not use the 'sync' storage area for this purpose + const currentUserAgent = new CurrentUserAgent(new StorageArea('useragent-state', 'local')) + debug('current user-agent', await currentUserAgent.get()) + + // remote user-agent list is used to store the list, fetched from the remote server. it uses the local storage area + // because it does not require synchronization between devices + const remoteUserAgentList = new RemoteUserAgentList(new StorageArea('useragent-remote-list', 'local')) + debug('remote user-agent list', await remoteUserAgentList.get(false)) + + // to identify the user, we use the 'sync' storage area because we need to synchronize the user ID between different + // devices. if the 'sync' storage area is not available, we use the 'local' storage area + // the user id is generated once and stored in the storage area. it does not change over time and does not contain + // any personal information (in fact, it's just a random UUID) + const uuid = (await new UserID(new StorageArea('user-id', 'sync', 'local')).get()).userID + debug('unique user id (uuid)', uuid) + + // the latest browser versions are stored in the 'local' storage area because they do not require synchronization + // between devices. the data is updated automatically + const latestBrowserVersions = new LatestBrowserVersions(new StorageArea('latest-browser-versions', 'local')) + debug('initial latest browser versions', ...(await latestBrowserVersions.get())) + + // stats collector is used to collect statistics about the extension usage. personal information is not collected + // and will never be collected. the collected data is used to overview the extension usage and track the most popular + // features + stats = new GaCollector(uuid, { + extVersion: chrome.runtime.getManifest().version, + osFamily: hostOS, + browser: detectBrowser(), + }) + + // handlers is a map of functions that can be called from the popup or content scripts (and not only from them). + // think about them as a kind of API for the extension + const handlers: HandlersMap = { + ping: (...args) => args, + version: () => chrome.runtime.getManifest().version, + currentUserAgent: async () => (await currentUserAgent.get())?.userAgent, + renewUserAgent: async () => { + const gen = await renewUserAgent(settings, currentUserAgent, remoteUserAgentList, hostOS, latestBrowserVersions) + return gen.new.userAgent + }, + settings: async () => settings.get(), + updateSettings: async (part) => (await settings.update(part)) && settings.get(), + isApplicableForDomain: async (domain) => isApplicableForDomain(await settings.get(), domain), + updateRemoteListNow: async (clear) => await updateRemoteUserAgentList(remoteUserAgentList, clear), + fireStatsEvents: async (...events) => await stats?.send(...events), + } + + // create a timer to renew the user-agent automatically + const userAgentRenewTimer = new Timer('renew-user-agent', m2s(initSettings.renew.intervalMillis), async () => { + await renewUserAgent(settings, currentUserAgent, remoteUserAgentList, hostOS, latestBrowserVersions) + debug('user-agent was renewed automatically', await currentUserAgent.get()) + }) + + // create a timer to update the remote user-agents list automatically + const remoteListUpdateTimer = new Timer( + 'update-remote-list', + m2s(initSettings.remoteUseragentList.updateIntervalMillis), + async () => { + await remoteUserAgentList.update() + debug('remote user-agent list updated automatically', await remoteUserAgentList.get(false)) + } + ) + + // create a timer to update the latest browser versions automatically (once in 6 hours) + const latestBrowserVersionsTimer = new Timer('update-latest-browser-versions', 60 * 60 * 6, async () => { + await latestBrowserVersions.update() + debug('latest browser versions updated automatically', latestBrowserVersions.get()) + }) + + // on current user-agent changes, save it to the storage area, and update the browser request headers + currentUserAgent.onChange(async (c) => { + debug('current user-agent was changed', c) + + // update the extension title with the current user-agent information + await setExtensionTitle(c) + + // reload the request headers with the new user-agent information + const reloaded = await reloadRequestHeaders(await settings.get(), await currentUserAgent.get()) + debug('the request header rules have been ' + (reloaded ? 'set' : 'unset'), reloaded) + }) + + settings.onChange(async (s) => { + debug('settings were changed', s) + + if (s.enabled) { + // ๐ŸŒ if the extension is enabled, we need to enable required features + + // ๐Ÿš€ automatic user-agent renewal + if (s.renew.enabled) { + // update the user-agent renewal timer on changes, if needed + if (m2s(s.renew.intervalMillis) !== userAgentRenewTimer.getIntervalSec) { + await userAgentRenewTimer.changeInterval(m2s(s.renew.intervalMillis)) + } + + // start the renewal timer if it's not started yet + if (!userAgentRenewTimer.isStarted) { + await userAgentRenewTimer.start() + } + } else { + // stop the renewal timer if the extension is enabled, but the user-agent renewal is disabled + await userAgentRenewTimer.stop() + } + + // ๐Ÿš€ remote user-agent list + if (s.remoteUseragentList.enabled) { + const intervalSec = m2s(s.remoteUseragentList.updateIntervalMillis) + + // update the remote user-agents list update timer on changes, if needed + if (intervalSec !== remoteListUpdateTimer.getIntervalSec) { + if (intervalSec > 0) { + await remoteListUpdateTimer.changeInterval(intervalSec) + } else { + await remoteListUpdateTimer.stop() + } + } + + if (!remoteListUpdateTimer.isStarted && s.remoteUseragentList.updateIntervalMillis > 0) { + await remoteListUpdateTimer.start() + } + } else { + await remoteListUpdateTimer.stop() + } + + // ๐Ÿš€ update the browser request headers with the current user-agent information + const reloaded = await reloadRequestHeaders(await settings.get(), await currentUserAgent.get()) + debug('the request header rules have been ' + (reloaded ? 'set' : 'unset'), reloaded) + + // ๐Ÿš€ update the latest browser versions automatically + await latestBrowserVersionsTimer.start() + } else { + // ๐ŸŒš otherwise, if the extension is disabled, we need to disable everything + await Promise.allSettled([ + // disable headers replacement + unsetRequestHeaders(), + // disable the user-agent renewal timer + userAgentRenewTimer.stop(), + // disable the remote user-agents list update timer + remoteListUpdateTimer.stop(), + // disable the latest browser versions update timer + latestBrowserVersionsTimer.stop(), + ]) + + debug('all features have been disabled') + } + + // update the remote user-agents list URI on changes, if needed + if (remoteUserAgentList.url?.toString() !== s.remoteUseragentList.uri) { + if (remoteUserAgentList.setUrl(s.remoteUseragentList.uri)) { + // note: we do not await the result because we do not want to block the execution + remoteUserAgentList.update().catch((err) => debug('remote user-agent list update error', err)) + + if (s.remoteUseragentList.updateIntervalMillis > 0) { + await remoteListUpdateTimer.restart() + } + } + } + + // update the extension icon state + await setExtensionIcon(s.enabled) + }) + + // configure the remote user-agent list service + if (initSettings.remoteUseragentList.enabled) { + if (initSettings.remoteUseragentList.uri) { + if (remoteUserAgentList.setUrl(initSettings.remoteUseragentList.uri)) { + // note: we do not await the result because we do not want to block the execution + remoteUserAgentList.update().catch((err) => debug('remote user-agent list update error', err)) + + if (initSettings.remoteUseragentList.updateIntervalMillis > 0) { + await remoteListUpdateTimer.start() + } + } + } + } + + // renew the user-agent on startup, if the feature is enabled or the user-agent is missing (first run?) + if (initSettings.renew.onStartup || !(await currentUserAgent.get())) { + await renewUserAgent(settings, currentUserAgent, remoteUserAgentList, hostOS, latestBrowserVersions) + } + + // start the renewal timer on startup, if the extension and this feature are enabled + if (initSettings.enabled && initSettings.renew.enabled) { + await userAgentRenewTimer.start() + } + + // start the latest browser versions update timer on startup, if the extension is enabled + if (initSettings.enabled) { + // initial update of the latest browser versions + latestBrowserVersions.update().catch((err) => debug('latest browser versions update error', err)) + + await latestBrowserVersionsTimer.start() + } + + // register hotkeys for the extension commands, such as renewing the user-agent + registerHotkeys({ + renewUserAgent: async () => { + await renewUserAgent(settings, currentUserAgent, remoteUserAgentList, hostOS, latestBrowserVersions) + }, + }) + + // set the extension icon state on startup + await setExtensionIcon(initSettings.enabled) + + listenRuntime(handlers) + + // send an initial event about the extension loading + stats.send(newExtensionLoadedEvent(initSettings)).then((err) => err && debug('stats error', err)) +})().catch((error: unknown): void => { + if (stats) { + stats.send(newErrorEvent(error, { page: 'background' })).then((err) => err && debug('stats error', err)) + } + + throw error +}) diff --git a/src/entrypoints/background/persistent/current-user-agent.ts b/src/entrypoints/background/persistent/current-user-agent.ts new file mode 100644 index 00000000..50acf13f --- /dev/null +++ b/src/entrypoints/background/persistent/current-user-agent.ts @@ -0,0 +1,85 @@ +import structuredClone from '@ungap/structured-clone' +import { deepFreeze } from '~/shared' +import type { DeepWriteable } from '~/types' +import type { ReadonlyUserAgentState } from '~/shared/types' +import type StorageArea from './storage-area' + +type UserAgentState = DeepWriteable + +export default class { + private readonly storage: StorageArea + + /** A list of change listeners */ + private changeListeners: Array<(newState: ReadonlyUserAgentState) => void> = [] + + constructor(storage: StorageArea) { + this.storage = storage + } + + /** Adds a change listener. */ + onChange(callback: (newState: ReadonlyUserAgentState) => void): void { + this.changeListeners.push(callback) + } + + /** + * Retrieves the current user-agent state. + * + * @throws {Error} If the state cannot be loaded. + */ + async get(): Promise { + const loaded = await this.storage.get() + + if (loaded) { + // the previous version of the extension used the info field, but now we save the entire data directly + // in the root. therefore, we need to migrate the data + if ('info' in loaded && typeof loaded.info === 'object') { + // the legacy user-agent state is stored in a different format + type LegacyUseragentInfo = { + info?: { + useragent: string + engine: 'webkit' | 'blink' | 'gecko' | 'unknown' + osType: 'windows' | 'linux' | 'macOS' | 'iOS' | 'android' | 'unknown' + browser: 'chrome' | 'firefox' | 'opera' | 'safari' | 'edge' | 'unknown' + browserVersion: { major: number; full: string } + brandBrowserVersion?: { major: number; full: string } + } + } + + const legacy = loaded as LegacyUseragentInfo + + return deepFreeze({ + userAgent: legacy.info?.useragent || '', + browser: legacy.info?.browser || 'unknown', + os: legacy.info?.osType || 'unknown', + version: { + browser: legacy.info?.brandBrowserVersion || { major: 0, full: '0.0.0' }, + underHood: legacy.info?.browserVersion || undefined, + }, + }) + } + + return deepFreeze(loaded) + } + } + + /** + * Update the current user-agent state. Listeners are notified about the changes. + * + * @throws {Error} If the state cannot be updated. + */ + async update(updated: UserAgentState): Promise { + const current = await this.storage.get() + + if (JSON.stringify(current) !== JSON.stringify(updated)) { + await this.storage.set(updated) + + const clone = deepFreeze(structuredClone(updated)) + + this.changeListeners.forEach((listener) => listener(clone)) + + return clone + } + + return deepFreeze(structuredClone(updated)) + } +} diff --git a/src/entrypoints/background/persistent/index.ts b/src/entrypoints/background/persistent/index.ts new file mode 100644 index 00000000..33acb14c --- /dev/null +++ b/src/entrypoints/background/persistent/index.ts @@ -0,0 +1,6 @@ +export { default as StorageArea } from './storage-area' +export { default as Settings } from './settings.ts' +export { default as CurrentUserAgent } from './current-user-agent' +export { default as RemoteUserAgentList } from './remote-useragent-list' +export { default as UserID } from './user-id' +export { default as LatestBrowserVersions, type ReadonlyVersionsState } from './latest-browser-versions' diff --git a/src/entrypoints/background/persistent/latest-browser-versions.ts b/src/entrypoints/background/persistent/latest-browser-versions.ts new file mode 100644 index 00000000..059b0867 --- /dev/null +++ b/src/entrypoints/background/persistent/latest-browser-versions.ts @@ -0,0 +1,142 @@ +import type { DeepReadonly } from '../../../types' +import type StorageArea from './storage-area.ts' + +type State = { + versions: Partial<{ + chrome: number + firefox: number + opera: number + safari: number + edge: number + }> + updatedAt: number +} + +export type ReadonlyVersionsState = DeepReadonly + +type MDNReleaseRecord = Readonly<{ + release_date?: string // YYYY-MM-DD, e.g. "2012-11-20", n/a for planned (beta) releases + status: 'retired' | 'current' | 'beta' | 'nightly' | 'planned' + release_notes?: string // URL, e.g. "https://blogs.opera.com/desktop/2023/06/opera-100-0-4815-30-stable-update/" + engine_version?: string // e.g. "614.4.6" or "84" +}> + +export default class { + private readonly storage: StorageArea + + constructor(storage: StorageArea) { + this.storage = storage + } + + /** Fetches the latest browser versions and stores it in the storage. */ + async update(): Promise { + // fetch the data for all browsers in parallel and extract the latest stable version + const [chrome, firefox, opera, safari, edge] = ( + await Promise.all([ + this.fetchBrowserData('chrome'), + this.fetchBrowserData('firefox'), + this.fetchBrowserData('opera'), + this.fetchBrowserData('safari'), + this.fetchBrowserData('edge'), + ]) + ).map((records: Array | null): MDNReleaseRecord | null => { + if (!records) { + return null // no data = no record + } + + // try to find the latest stable (current) release + const current = records.filter((release) => release.status === 'current').sort(this.sortByDate) + if (current.length) { + return current[0] + } + + // if there is no stable release, return the latest public release + return records.sort(this.sortByDate).find((release) => release.status === 'retired') || records[0] + }) + + /** Since the Opera is a bit special, we need to extract the version from the release notes link :D */ + const operaVersionFromReleaseNotes = (releaseNotes: string | undefined): string | undefined => { + if (!releaseNotes) { + return undefined + } + + const match = releaseNotes.match(/opera-(\d+)/) + if (!match) { + return undefined + } + + return match[1] + } + + // read the current state and update the versions to use them if the new data is missing + const current = await this.storage.get() + + await this.storage.set({ + versions: { + chrome: this.extractMajor(chrome?.engine_version) ?? current?.versions?.chrome, + firefox: this.extractMajor(firefox?.engine_version) ?? current?.versions?.firefox, + opera: this.extractMajor(operaVersionFromReleaseNotes(opera?.release_notes)) ?? current?.versions?.opera, + safari: this.extractMajor(safari?.engine_version) ?? current?.versions?.safari, + edge: this.extractMajor(edge?.engine_version) ?? current?.versions?.edge, + }, + updatedAt: Date.now(), + }) + } + + async get(): Promise | undefined]> { + const state = await this.storage.get() + + return [state?.versions, state?.updatedAt ? new Date(state.updatedAt) : undefined] + } + + async clear(): Promise { + await this.storage.clear() + } + + /** Fetch the browser versions data from MDN. */ + private async fetchBrowserData< + T extends + | 'chrome' + | 'firefox' + | 'opera' + | 'safari' + | 'edge' + | 'safari_ios' + | 'webview_android' + | 'chrome_android' + | 'firefox_android' + | 'opera_android', + >(browser: T): Promise | null> { + // the filename is the same as the browser name (e.g. "chrome.json") in current major version (v5) of the MDN data: + // https://cdn.jsdelivr.net/gh/mdn/browser-compat-data@5/browsers/ - list of all available files + // https://github.com/mdn/browser-compat-data/tree/main/browsers - GitHub repository + // + // about the caching on the jsdelivr side - the data is cached for 7 days: + // https://www.jsdelivr.com/documentation#id-caching + const resp = await fetch(`https://cdn.jsdelivr.net/gh/mdn/browser-compat-data@5/browsers/${browser}.json`) + if (resp.ok) { + const releases = (await resp.json())?.browsers[browser]?.releases + if (releases) { + return Object.values(releases) + } + } + + return null + } + + /** Sorts the records by the release date. */ + private sortByDate = (a: T, b: T) => + (a.release_date ? new Date(a.release_date).getTime() : 0) - + (b.release_date ? new Date(b.release_date).getTime() : 0) + + /** Extract the major version from a string. If the string is empty or doesn't contain a number, return undefined. */ + private extractMajor = (str: string | undefined): number | undefined => { + if (!str) { + return undefined + } + + const major = parseInt(str.replaceAll(/[^\d.]/g, '').split('.')[0]) + + return isNaN(major) ? undefined : major + } +} diff --git a/src/entrypoints/background/persistent/remote-useragent-list.ts b/src/entrypoints/background/persistent/remote-useragent-list.ts new file mode 100644 index 00000000..73eebcd5 --- /dev/null +++ b/src/entrypoints/background/persistent/remote-useragent-list.ts @@ -0,0 +1,108 @@ +import type StorageArea from './storage-area' + +type UserAgentListState = { + list: Array +} + +export default class { + private readonly storage: StorageArea + private remoteListUrl: URL | undefined + + constructor(storage: StorageArea) { + this.storage = storage + } + + /** Sets the remote list URL. If the URL is invalid, it will be ignored and the method will return false. */ + setUrl(url: string | URL): boolean { + let newUrl: URL | undefined + + switch (true) { + case typeof url === 'string': + try { + newUrl = new URL(url) // validate the URL + } catch { + // do nothing + } + break + + case url instanceof URL: + newUrl = url + break + } + + if (newUrl && ['http:', 'https:'].includes(newUrl.protocol)) { + this.remoteListUrl = newUrl + + return true + } + + return false + } + + /** Returns the remote list URL. */ + get url(): URL | undefined { + return this.remoteListUrl + } + + /** Clears the user agent list. */ + async clear(): Promise { + await this.storage.clear() + } + + /** + * Fetches the remote list and stores it in the storage. + * + * @throws {Error} If the remote list URL is not set or the fetch fails. + */ + async update(): Promise { + if (!this.remoteListUrl) { + throw new Error('Remote list URL is not set') + } + + const response = await fetch(this.remoteListUrl, { + method: 'GET', + redirect: 'follow', + referrerPolicy: 'no-referrer', + }) + + if (!response.ok) { + throw new Error(`Failed to fetch remote list: ${response.statusText} (${this.remoteListUrl.toString()})`) + } + + const text = await response.text() + + if (text.length) { + const list = text + .split('\n') + .map((s): string => s.trim()) + .filter((s): boolean => { + if (s.startsWith('#') || s.startsWith('//')) { + return false // skip comments + } + + return s.length !== 0 // skip empty lines + }) + .filter(Boolean) + + if (list.length) { + await this.storage.set({ list }) + } + } + } + + /** + * Retrieves the user agent list from the storage. + * + * If random is true, returns a random user agent. Otherwise, returns the whole list. + * If the list is empty, returns undefined. + */ + async get(random: true): Promise | undefined> + async get(random: false): Promise> | undefined> + async get(random: boolean): Promise | Readonly> | undefined> { + const state = await this.storage.get() + + if (state?.list.length) { + return Object.freeze(random ? state.list[Math.floor(Math.random() * state.list.length)] : state.list) + } + } +} diff --git a/src/entrypoints/background/persistent/settings.test.ts b/src/entrypoints/background/persistent/settings.test.ts new file mode 100644 index 00000000..5b56fa3e --- /dev/null +++ b/src/entrypoints/background/persistent/settings.test.ts @@ -0,0 +1,82 @@ +import { describe, expect, test } from 'vitest' +import Settings from './settings' +import StorageArea from './storage-area' + +describe('settings', () => { + // this is mock of the browser's storage area that does nothing + class StorageAreaMock extends StorageArea { + private state?: Record + + async clear(): Promise { + this.state = undefined + } + + async set(v: T): Promise { + this.state = v as Record + } + + async get(): Promise { + return this.state as T | undefined + } + } + + test('update root boolean property', async () => { + const settings = new Settings(new StorageAreaMock('some-key', 'local')) + + await settings.update({ enabled: true }) + expect((await settings.get()).enabled).toBeTruthy() + + await settings.update({ enabled: undefined }) + expect((await settings.get()).enabled).toBeTruthy() + + await settings.update({ enabled: false }) + expect((await settings.get()).enabled).toBeFalsy() + + await settings.update({ enabled: undefined }) + expect((await settings.get()).enabled).toBeFalsy() + }) + + test('update nested property', async () => { + const settings = new Settings(new StorageAreaMock('some-key', 'local')) + + await settings.update({ blacklist: { domains: ['foo'] }, renew: { intervalMillis: 30001 } }) + expect((await settings.get()).blacklist.domains).toEqual(['foo']) + expect((await settings.get()).renew.intervalMillis).toEqual(30001) + + await settings.update({ blacklist: { domains: undefined }, renew: { intervalMillis: undefined } }) + expect((await settings.get()).blacklist.domains).toEqual(['foo']) + expect((await settings.get()).renew.intervalMillis).toEqual(30001) + + await settings.update({ blacklist: { domains: ['bar', 'baz'] }, renew: { intervalMillis: 666 } }) + expect((await settings.get()).blacklist.domains).toEqual(['bar', 'baz']) + expect((await settings.get()).renew.intervalMillis).toEqual(30000) + }) + + test('onChange listener', async () => { + const settings = new Settings(new StorageAreaMock('some-key', 'local')) + let execCount = 0 + + settings.onChange(() => { + execCount++ + }) + + const defaults = await settings.get() + await settings.update({}) + expect(execCount).toBe(0) + + await settings.update({ enabled: defaults.enabled }) + expect(execCount).toBe(0) + + await settings.update({ enabled: !defaults.enabled }) + expect(execCount).toBe(1) + + await settings.update({ enabled: undefined, generator: { types: undefined } }) + expect(execCount).toBe(1) // not changed + + await settings.update({ blacklist: { domains: ['foo'] } }) + expect(execCount).toBe(2) + + await settings.update({ blacklist: { domains: ['bar'] } }) + expect(execCount).toBe(3) + }) +}) diff --git a/src/entrypoints/background/persistent/settings.ts b/src/entrypoints/background/persistent/settings.ts new file mode 100644 index 00000000..7984d155 --- /dev/null +++ b/src/entrypoints/background/persistent/settings.ts @@ -0,0 +1,182 @@ +import structuredClone from '@ungap/structured-clone' +import { deepFreeze } from '~/shared' +import type { PartialSettingsState, ReadonlySettingsState } from '~/shared/types' +import { type DeepPartial, type DeepWriteable } from '~/types' +import type StorageArea from './storage-area' + +type SettingsState = DeepWriteable + +/** Extension settings */ +export default class { + private readonly storage: StorageArea + + /** Initial (default) extension settings */ + private readonly defaults: SettingsState = { + enabled: true, + renew: { + enabled: true, + intervalMillis: 10 * 60 * 1000, // once in 10 minutes + onStartup: true, + }, + customUseragent: { + enabled: false, + list: [], + }, + remoteUseragentList: { + enabled: false, + uri: '', + updateIntervalMillis: 60 * 60 * 1000, // hourly + }, + jsProtection: { + enabled: true, + }, + generator: { + types: ['chrome_win', 'chrome_linux', 'chrome_mac'], + syncOsWithHost: false, + }, + blacklist: { + mode: 'blacklist', + domains: ['localhost', '127.0.0.1'], + }, + } + + /** A list of change listeners */ + private changeListeners: Array<(newState: ReadonlySettingsState) => void> = [] + + constructor(storage: StorageArea, browserName?: 'chrome' | 'firefox' | 'opera' | 'edge') { + this.storage = storage + + switch (browserName) { + case 'firefox': + this.defaults.generator.types = ['firefox_win', 'firefox_linux', 'firefox_mac'] + break + + case 'opera': + this.defaults.generator.types = ['opera_win', 'opera_mac'] + break + + case 'edge': + this.defaults.generator.types = ['edge_win', 'edge_mac'] + break + } + } + + /** Adds a change listener. */ + onChange(callback: (newState: ReadonlySettingsState) => void): void { + this.changeListeners.push(callback) + } + + /** + * Retrieves the current settings. + * + * @throws {Error} If the settings cannot be loaded. + */ + async get(): Promise { + const loaded = await this.storage.get() + + if (loaded) { + const [merged] = this.merge(structuredClone(this.defaults), loaded) + + // 'custom' is deprecated and should be removed + if (merged.blacklist && 'custom' in merged.blacklist) { + delete merged.blacklist.custom + } + + // the minimum interval for auto-renewal is 30 seconds (depends on alarms API) + merged.renew.intervalMillis = Math.max(30 * 1000, merged.renew.intervalMillis) + + return deepFreeze(merged) + } + + return deepFreeze(structuredClone(this.defaults)) + } + + /** + * Updates the settings. The changes are merged with the current settings. Listeners are notified about the + * changes only if there are any. + * + * @throws {Error} If the settings cannot be saved. + */ + async update(updated: PartialSettingsState): Promise { + // 'custom' is deprecated and should be removed + if (updated.blacklist && 'custom' in updated.blacklist) { + delete updated.blacklist.custom + } + + const current = await this.storage.get() + const [merged, changes] = this.merge(structuredClone(current ?? this.defaults), updated) + + if (changes > 0) { + // to clean in the storage + if ('custom' in merged.blacklist) { + delete merged.blacklist.custom + } + + await this.storage.set(merged) + + const clone = deepFreeze(structuredClone(merged)) + + this.changeListeners.forEach((listener) => listener(clone)) + } + + return deepFreeze(merged) + } + + /** Merge two settings states and return the merged state and the number of changes. */ + private merge(current: T, updated: DeepPartial): [T, number] { + let changes = 0 + + for (const [key, value] of Object.entries(updated) as [keyof T, T[keyof T]][]) { + if (value === undefined) { + continue + } + + if (!(key in current)) { + continue + } + + const currentValue = current[key] + + if ( + typeof value === 'object' && + value !== null && + !Array.isArray(value) && + typeof currentValue === 'object' && + currentValue !== null && + !Array.isArray(currentValue) + ) { + const [newState, changedCount] = this.merge(currentValue as T, value) + + current[key] = newState as T[keyof T] + changes += changedCount + } else if (Array.isArray(value) && Array.isArray(currentValue)) { + if (!this.arraysEqual(value, currentValue)) { + current[key] = value + changes++ + } + } else if (currentValue !== value) { + current[key] = value + changes++ + } + } + + return [current, changes] + } + + /** Compares two arrays. The order of elements is not important. */ + private arraysEqual>(arr1: T, arr2: T): boolean { + if (arr1.length !== arr2.length) { + return false + } + + const [sorted1, sorted2] = [structuredClone(arr1).sort(), structuredClone(arr2).sort()] + + for (let i = 0; i < sorted1.length; i++) { + if (sorted1[i] !== sorted2[i]) { + return false + } + } + + return true + } +} diff --git a/src/entrypoints/background/persistent/storage-area.test.ts b/src/entrypoints/background/persistent/storage-area.test.ts new file mode 100644 index 00000000..0b06c196 --- /dev/null +++ b/src/entrypoints/background/persistent/storage-area.test.ts @@ -0,0 +1,264 @@ +import { afterEach, describe, expect, test, vi } from 'vitest' +import StorageArea from './storage-area' +import BrowserStorageArea = chrome.storage.StorageArea + +describe('storage', () => { + afterEach(() => { + delete (global as { chrome: unknown }).chrome + }) + + const mockChromeStorage = ( + localMock: Partial, + syncMock: Partial, + runtime?: { lastError?: chrome.runtime.LastError } + ) => { + Object.defineProperty(global, 'chrome', { + value: { + storage: { + local: localMock, + sync: syncMock, + }, + runtime, + }, + configurable: true, + }) + } + + test('get using sync storage', async () => { + mockChromeStorage( + {}, + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async (key) => { + if (key === 'some-key') { + return { [key]: { some: 'data' } } + } + + return {} + }), + }, + { lastError: undefined } + ) + + const syncGetMock = vi.spyOn(global.chrome.storage.sync, 'get') + const storage = new StorageArea('some-key', 'sync') + + try { + expect(await storage.get()).toStrictEqual({ some: 'data' }) + expect(global.chrome.storage.sync.get).toHaveBeenCalledTimes(2) + expect(global.chrome.storage.sync.get).toHaveBeenCalledWith(null) + expect(global.chrome.storage.sync.get).toHaveBeenCalledWith('some-key') + + // the second shouldn't make an additional call to chrome.storage.sync.get + expect(await storage.get()).toStrictEqual({ some: 'data' }) + expect(global.chrome.storage.sync.get).toHaveBeenCalledTimes(3) + expect(global.chrome.storage.sync.get).toHaveBeenCalledWith('some-key') + } finally { + syncGetMock.mockRestore() + } + }) + + test('fallback to local storage', async () => { + let lastErrorCallCount = 0 + + mockChromeStorage( + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async (key) => { + if (key === 'some-key') { + return { [key]: { some: 'data' } } + } + + return {} + }), + }, + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async () => { + return {} + }), + }, + { + get lastError() { + if (lastErrorCallCount++ === 0) { + // return error only once + return { message: 'Some error' } + } + + return undefined + }, + } + ) + + const syncGetMock = vi.spyOn(global.chrome.storage.sync, 'get') + const localGetMock = vi.spyOn(global.chrome.storage.local, 'get') + + try { + expect(await new StorageArea('some-key', 'sync', 'local').get()).toStrictEqual({ some: 'data' }) + expect(global.chrome.storage.sync.get).toHaveBeenCalledTimes(1) + expect(global.chrome.storage.sync.get).toHaveBeenCalledWith(null) + expect(global.chrome.storage.local.get).toHaveBeenCalledTimes(2) + expect(global.chrome.storage.local.get).toHaveBeenCalledWith(null) + expect(global.chrome.storage.local.get).toHaveBeenCalledWith('some-key') + } finally { + syncGetMock.mockRestore() + localGetMock.mockRestore() + } + }) + + test('get using sync storage throws an error', async () => { + let lastErrorCallCount = 0 + + mockChromeStorage( + {}, + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async () => { + return {} + }), + }, + { + get lastError() { + if (lastErrorCallCount++ === 1) { + // return error only on second call + return { message: 'Some error' } + } + + return undefined + }, + } + ) + + await expect(new StorageArea('some-key', 'sync').get()).rejects.toThrow('Some error') + }) + + test('set using sync storage', async () => { + mockChromeStorage( + {}, + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async () => { + return {} + }), + set: vi.fn<[Parameters[0]], Promise>().mockImplementation(async (value) => { + expect(value).toStrictEqual({ 'some-key': { some: 'data' } }) + }), + }, + { lastError: undefined } + ) + + const syncSetMock = vi.spyOn(global.chrome.storage.sync, 'set') + + try { + await new StorageArea('some-key', 'sync').set({ some: 'data' }) + expect(global.chrome.storage.sync.set).toHaveBeenCalledTimes(1) + expect(global.chrome.storage.sync.set).toHaveBeenCalledWith({ 'some-key': { some: 'data' } }) + } finally { + syncSetMock.mockRestore() + } + }) + + test('set using sync storage when lastError is set', async () => { + let lastErrorCallCount = 0 + + mockChromeStorage( + {}, + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async () => { + return {} + }), + set: vi.fn<[Parameters[0]], Promise>().mockImplementation(async (value) => { + expect(value).toStrictEqual({ 'some-key': { some: 'data' } }) + }), + }, + { + get lastError() { + if (lastErrorCallCount++ === 1) { + // return error only on second call + return { message: 'Some error' } + } + + return undefined + }, + } + ) + + const syncSetMock = vi.spyOn(global.chrome.storage.sync, 'set') + + try { + await expect(new StorageArea('some-key', 'sync').set({ some: 'data' })).rejects.toThrow('Some error') + expect(global.chrome.storage.sync.set).toHaveBeenCalledTimes(1) + expect(global.chrome.storage.sync.set).toHaveBeenCalledWith({ 'some-key': { some: 'data' } }) + } finally { + syncSetMock.mockRestore() + } + }) + + test('clear using sync storage', async () => { + mockChromeStorage( + {}, + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async () => { + return {} + }), + remove: vi + .fn<[Parameters[0]], Promise>() + .mockImplementation(async (key) => { + expect(key).toBe('some-key') + }), + }, + { lastError: undefined } + ) + + const syncRemoveMock = vi.spyOn(global.chrome.storage.sync, 'remove') + + try { + await new StorageArea('some-key', 'sync').clear() + expect(global.chrome.storage.sync.remove).toHaveBeenCalledTimes(1) + expect(global.chrome.storage.sync.remove).toHaveBeenCalledWith('some-key') + } finally { + syncRemoveMock.mockRestore() + } + }) + + test('clear using sync storage when lastError is set', async () => { + let lastErrorCallCount = 0 + + mockChromeStorage( + {}, + { + get: vi + .fn<[Parameters[0]], Promise<{ [key: string]: unknown }>>() + .mockImplementation(async () => { + return {} + }), + remove: vi + .fn<[Parameters[0]], Promise>() + .mockImplementation(async (key) => { + expect(key).toBe('some-key') + }), + }, + { + get lastError() { + if (lastErrorCallCount++ === 1) { + // return error only on second call + return { message: 'Some error' } + } + + return undefined + }, + } + ) + + await expect(new StorageArea('some-key', 'sync').clear()).rejects.toThrow('Some error') + }) +}) diff --git a/src/entrypoints/background/persistent/storage-area.ts b/src/entrypoints/background/persistent/storage-area.ts new file mode 100644 index 00000000..e3bcc9e3 --- /dev/null +++ b/src/entrypoints/background/persistent/storage-area.ts @@ -0,0 +1,116 @@ +import BrowserStorageArea = chrome.storage.StorageArea + +type AreaName = 'sync' | 'local' + +/** + * This class provides a simple way to store and retrieve data in the browser's storage. It's important to note + * that this is distinct from local or session storage; it specifically refers to browser storage. + * + * @link https://developer.chrome.com/docs/extensions/reference/api/storage + */ +export default class = Record> { + /** The key used to store the data */ + private readonly key: string + /** The storage area to use and fallback to if the main area is not available */ + private readonly areaName: { main: AreaName; fallback?: AreaName } + /** Do not use this property directly, use getStorage() method instead */ + private storage?: BrowserStorageArea + + constructor(key: string, mainArea: AreaName, fallbackArea?: AreaName) { + this.key = key + this.areaName = { main: mainArea, fallback: fallbackArea } + } + + /** + * Returns the storage area (sync or local, depending on the availability). + * + * @throws {Error} If neither sync nor local storage is available. + */ + private async getStorage(): Promise { + if (this.storage) { + return this.storage // return cached storage area + } + + try { + const main = this.areaName.main === 'sync' ? chrome.storage.sync : chrome.storage.local + + await main.get(null) // try to get main storage + + if (!chrome.runtime.lastError) { + this.storage = main + + return this.storage // return main storage + } + } catch (syncErr) { + // ignore any errors, proceed to fallback storage + } + + if (this.areaName.fallback && this.areaName.fallback !== this.areaName.main) { + const fallback = this.areaName.fallback === 'sync' ? chrome.storage.sync : chrome.storage.local + + try { + await fallback.get(null) // try to get fallback storage + } catch (err) { + throw new Error(String(err)) + } + + if (!chrome.runtime.lastError) { + this.storage = fallback + + return this.storage // return fallback storage + } + + throw new Error('Neither main nor fallback storage is available') + } + + throw new Error('Main storage is not available') + } + + /** + * Retrieves the data from the storage. If the data is not found, it returns `undefined`. + * + * @throws {Error} If the data cannot be retrieved. + */ + async get(): Promise { + const items = await (await this.getStorage()).get(this.key) + const lastError = chrome.runtime.lastError + + if (lastError) { + throw new Error(lastError.message) + } + + if (this.key in items) { + return items[this.key] + } + + return undefined // storage does not contains expected data + } + + /** + * Sets the data in the storage. + * + * @throws {Error} If the data cannot be set. + */ + async set(value: TState): Promise { + await (await this.getStorage()).set({ [this.key]: value }) + const lastError = chrome.runtime.lastError + + if (lastError) { + throw new Error(lastError.message) + } + } + + /** + * Removes the data from the storage, associated with the key only. + * + * @throws {Error} If the data cannot be removed. + */ + async clear(): Promise { + await (await this.getStorage()).remove(this.key) + const lastError = chrome.runtime.lastError + + if (lastError) { + throw new Error(lastError.message) + } + } +} diff --git a/src/entrypoints/background/persistent/user-id.ts b/src/entrypoints/background/persistent/user-id.ts new file mode 100644 index 00000000..250a5015 --- /dev/null +++ b/src/entrypoints/background/persistent/user-id.ts @@ -0,0 +1,40 @@ +import structuredClone from '@ungap/structured-clone' +import type { DeepReadonly } from '~/types' +import type StorageArea from './storage-area' + +type UserIDState = { + userID: string +} + +export default class { + private readonly storage: StorageArea + private state?: UserIDState // cache + + constructor(storage: StorageArea) { + this.storage = storage + } + + /** + * Retrieves the user ID state, or generates a new one if it doesn't exist. + * + * @throws {Error} If the state cannot be loaded or saved. + */ + async get(): Promise> { + // if we have the state in the cache, return it + if (this.state) { + return structuredClone(this.state) + } + + // otherwise, load it from the storage + this.state = await this.storage.get() + + // if we still don't have the state, generate a new one + if (!this.state) { + this.state = { userID: crypto.randomUUID() } + + await this.storage.set(this.state) + } + + return structuredClone(this.state) + } +} diff --git a/src/entrypoints/background/stats/ga-collector.ts b/src/entrypoints/background/stats/ga-collector.ts new file mode 100644 index 00000000..7c6d2854 --- /dev/null +++ b/src/entrypoints/background/stats/ga-collector.ts @@ -0,0 +1,120 @@ +import type { StatsEvent } from '~/shared/stats' +import type { Collector } from './types' + +const domains: Readonly> = [ + 'www.google-analytics.com', // default domain + 'ga.random-user-agent.com', // a custom proxy (deployed on CF workers) to bypass the domain block +] + +/** + * Google Analytics collector. + * + * @link + */ +export default class implements Collector { + private readonly userID: string + private readonly extVersion: string | undefined + private readonly osFamily: string | undefined + private readonly browser: string | undefined + private readonly sessionId: string = crypto.randomUUID() + + /** the last domain that the request was sent to with success */ + private lastWorkedDomain: string | undefined + + constructor(userID: string, opts: Partial<{ extVersion: string; osFamily: string; browser: string }> = {}) { + this.userID = userID + this.extVersion = opts.extVersion + this.osFamily = opts.osFamily + this.browser = opts.browser + } + + async send(...events: Array): Promise { + if (events.length === 0) { + return + } + + // test if the GA settings is set in the vite config + if (typeof __GA_MEASUREMENT_ID__ !== 'string' || __GA_MEASUREMENT_ID__.length === 0) { + return + } else if (typeof __GA_API_SECRET__ !== 'string' || __GA_API_SECRET__.length === 0) { + return + } + + // docs: https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events + // guide: https://developer.chrome.com/docs/extensions/how-to/integrate/google-analytics-4 + const gaEvents: Array<{ + name: string + params: { + [key: string]: unknown // allow any other properties + } + }> = [] + + for (const event of events) { + if (!event.name) { + continue + } + + gaEvents.push({ + name: event.name, + params: { + session_id: this.sessionId, // a special parameter to track the session + engagement_time_msec: 100, // a special parameter to track the engagement time + current_time: Date.now(), + ext_os: this.osFamily ?? 'unknown', + ext_version: this.extVersion ?? 'unknown', + ext_browser: this.browser ?? 'unknown', + ...event.props, + }, + }) + } + + if (gaEvents.length === 0) { + return + } + + const payload = JSON.stringify({ client_id: this.userID, events: gaEvents }) + let lastError: Error | undefined = undefined + + for (const domain of this.lastWorkedDomain ? [this.lastWorkedDomain] : domains) { + const url = new URL( + `/mp/collect?measurement_id=${__GA_MEASUREMENT_ID__}&api_secret=${__GA_API_SECRET__}&_=${Date.now().toString()}`, + `https://${domain}` + ) + + try { + const resp = await fetch(url, { + method: 'POST', + priority: 'low', + cache: 'no-cache', + headers: { accept: 'text/plain', 'content-type': 'application/json' }, + body: payload, + }) + + if (!resp.ok) { + lastError = new Error(`Failed to send events: ${resp.statusText}`) + continue + } + + lastError = undefined // unset the last error, if we reached this point, then the request was successful + this.lastWorkedDomain = domain // save the last domain that the request was sent to with success + + break + } catch (e) { + if (e instanceof Error) { + // if you got an error here with the message "TypeError: NetworkError when attempting to fetch resource" + // and something about "CORS policy", then it's probably because the FireFox browser needs an additional + // permission (https://discourse.mozilla.org/t/permissions-not-being-asked-upon-add-on-installation/110570/3) + lastError = e + } else { + lastError = new Error(`Failed to send events: ${e}`) + } + } + + if (!lastError) { + break + } + } + + return lastError + } +} diff --git a/src/entrypoints/background/stats/index.ts b/src/entrypoints/background/stats/index.ts new file mode 100644 index 00000000..0bca8746 --- /dev/null +++ b/src/entrypoints/background/stats/index.ts @@ -0,0 +1,4 @@ +export type { Collector } from './types' +export { default as GaCollector } from './ga-collector' +export { default as MixCollector } from './mixpanel-collector' +export { default as NoopCollector } from './noop-collector' diff --git a/src/entrypoints/background/stats/mixpanel-collector.ts b/src/entrypoints/background/stats/mixpanel-collector.ts new file mode 100644 index 00000000..85b39458 --- /dev/null +++ b/src/entrypoints/background/stats/mixpanel-collector.ts @@ -0,0 +1,123 @@ +import type { StatsEvent } from '~/shared/stats' +import type { Collector } from './types' + +const domains: Readonly> = [ + 'api-eu.mixpanel.com', // european region + 'api.mixpanel.com', // us region + 'mx.random-user-agent.com', // a custom proxy (deployed on CF workers) to bypass the mixpanel domain block +] + +/** Mixpanel collector */ +export default class implements Collector { + private readonly userID: string + private readonly extVersion: string | undefined + private readonly osFamily: string | undefined + private readonly browser: string | undefined + + /** the last domain that the request was sent to with success */ + private lastWorkedDomain: string | undefined + + constructor(userID: string, opts: Partial<{ extVersion: string; osFamily: string; browser: string }> = {}) { + this.userID = userID + this.extVersion = opts.extVersion + this.osFamily = opts.osFamily + this.browser = opts.browser + } + + async send(...events: Array): Promise { + if (events.length === 0) { + return + } + + // test if the project token is set in the vite config + if (typeof __MIXPANEL_PROJECT_TOKEN__ !== 'string' || __MIXPANEL_PROJECT_TOKEN__.length === 0) { + return + } + + // https://developer.mixpanel.com/reference/track-event + const mixEvents: Array<{ + event: string + properties: { + token: string // project token + time: number // the time at which the event occurred, in seconds or milliseconds since UTC epoch + distinct_id: string // the unique identifier for the user + // data structure properties - https://docs.mixpanel.com/docs/data-structure/property-reference + $os: string // the operating system of the user's device + $app_version_string: string // the version of the extension + [key: string]: unknown // allow any other properties + } + }> = [] + + for (const event of events) { + if (!event.name) { + continue + } + + mixEvents.push({ + event: event.name, + properties: { + token: __MIXPANEL_PROJECT_TOKEN__, + time: Date.now(), + distinct_id: this.userID, + $os: this.osFamily ?? 'unknown', + $app_version_string: this.extVersion ?? 'unknown', + $browser: this.browser ?? 'unknown', + ...event.props, + }, + }) + } + + if (mixEvents.length === 0) { + return + } + + const payload = JSON.stringify(mixEvents) + let lastError: Error | undefined = undefined + + for (const domain of this.lastWorkedDomain ? [this.lastWorkedDomain] : domains) { + const url = new URL(`/track?_=${Date.now().toString()}&ip=1`, `https://${domain}`) + + try { + const resp = await fetch(url, { + method: 'POST', + priority: 'low', + cache: 'no-cache', + headers: { accept: 'text/plain', 'content-type': 'application/json' }, + body: payload, + }) + + if (!resp.ok) { + lastError = new Error(`Failed to send events: ${resp.statusText}`) + continue + } + + const text = await resp.text() + + if (text.trim() !== '1') { + lastError = new Error(`Failed to send events: unexpected response: ${text}`) + continue + } + + lastError = undefined // unset the last error, if we reached this point, then the request was successful + this.lastWorkedDomain = domain // save the last domain that the request was sent to with success + + break + } catch (e) { + if (e instanceof Error) { + // if you got an error here with the message "TypeError: NetworkError when attempting to fetch resource" + // and something about "CORS policy", then it's probably because the FireFox browser needs an additional + // permission (https://discourse.mozilla.org/t/permissions-not-being-asked-upon-add-on-installation/110570/3) + lastError = e + } else { + lastError = new Error(`Failed to send events: ${e}`) + } + } + + if (!lastError) { + break + } + } + + return lastError + } +} diff --git a/src/entrypoints/background/stats/noop-collector.ts b/src/entrypoints/background/stats/noop-collector.ts new file mode 100644 index 00000000..134bbe55 --- /dev/null +++ b/src/entrypoints/background/stats/noop-collector.ts @@ -0,0 +1,10 @@ +import type { StatsEvent } from '~/shared/stats' +import type { Collector } from './types' + +/** Noop collector does nothing */ +export default class implements Collector { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async send(..._: Array): Promise { + return + } +} diff --git a/src/entrypoints/background/stats/types.d.ts b/src/entrypoints/background/stats/types.d.ts new file mode 100644 index 00000000..757a4a1a --- /dev/null +++ b/src/entrypoints/background/stats/types.d.ts @@ -0,0 +1,10 @@ +import type { StatsEvent } from '~/shared/stats' + +/** + * Collector is an interface that defines the contract for a class that sends events to a stats collector. + * + * It returns a promise that resolves to an error or undefined (if the operation was successful). + */ +export interface Collector { + send(...events: Array): Promise +} diff --git a/src/entrypoints/background/timer/index.ts b/src/entrypoints/background/timer/index.ts new file mode 100644 index 00000000..f61720c5 --- /dev/null +++ b/src/entrypoints/background/timer/index.ts @@ -0,0 +1 @@ +export { default as Timer } from './timer' diff --git a/src/entrypoints/background/timer/timer.ts b/src/entrypoints/background/timer/timer.ts new file mode 100644 index 00000000..e2b9f0ae --- /dev/null +++ b/src/entrypoints/background/timer/timer.ts @@ -0,0 +1,76 @@ +export default class Timer { + // Chrome 120: Starting in Chrome 120, the minimum alarm interval has been reduced from 1 minute to 30 seconds + // for an alarm to trigger in 30 seconds, set periodInMinutes: 0.5 + // https://developer.chrome.com/docs/extensions/reference/api/alarms + // + // for FireFox, the minimum interval is 1 minute + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/alarms/create#alarminfo + private readonly minDelayInSeconds: number = 30 + + // is set only after the timer is started + private listener: ((alarm: chrome.alarms.Alarm) => void) | undefined + private intervalSec: number + + private readonly name: string + private readonly handler: (timer: this) => void + + /** + * Create a new timer. Keep in mind that the minimum interval is 30 seconds, and the timer should be started + * manually. The name of the timer should be unique. + */ + constructor(name: string, intervalSec: number, handler: (timer: Timer) => void) { + this.intervalSec = Math.max(this.minDelayInSeconds, intervalSec) + + this.name = name + this.handler = handler + } + + /** Start the timer */ + async start(): Promise { + await chrome.alarms.create(this.name, { periodInMinutes: this.intervalSec / 60 }) + + this.listener = (alarm) => { + if (alarm.name === this.name) { + this.handler(this) + } + } + + chrome.alarms.onAlarm.addListener(this.listener) + } + + /** Stop the timer */ + async stop(): Promise { + if (this.listener) { + chrome.alarms.onAlarm.removeListener(this.listener) + + this.listener = undefined + } + + return await chrome.alarms.clear(this.name) + } + + /** Restart the timer */ + async restart(): Promise { + await this.stop() + await this.start() + } + + /** Change the timer interval (in seconds) */ + async changeInterval(intervalSec: number): Promise { + this.intervalSec = Math.max(this.minDelayInSeconds, intervalSec) + + if (this.listener) { + await this.restart() + } + } + + /** Get the timer interval (in seconds) */ + get getIntervalSec(): number { + return this.intervalSec + } + + /** Is the timer started? */ + get isStarted(): boolean { + return !!this.listener + } +} diff --git a/src/entrypoints/background/ui/extension-icon.ts b/src/entrypoints/background/ui/extension-icon.ts new file mode 100644 index 00000000..fcc1bf3c --- /dev/null +++ b/src/entrypoints/background/ui/extension-icon.ts @@ -0,0 +1,77 @@ +import type { ReadonlyUserAgentState } from '~/shared/types' + +/** + * Set the extension icon, depending on the state. Can be limited to a specific tab. + * + * @link https://developer.chrome.com/docs/extensions/reference/api/action#method-setIcon + * @link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction/setIcon + */ +export const setExtensionIcon = async (active: boolean, tabId?: number): Promise => { + await chrome.action.setIcon({ + path: active + ? { + 16: '/assets/icons/16.png', + 32: '/assets/icons/32.png', + 48: '/assets/icons/48.png', + 128: '/assets/icons/128.png', + } + : { + 16: '/assets/icons/16-gray.png', + 32: '/assets/icons/32-gray.png', + 48: '/assets/icons/48-gray.png', + 128: '/assets/icons/128-gray.png', + }, + tabId, + }) +} + +/** + * Set the extension icon title. Can be limited to a specific tab. + * + * @link https://developer.chrome.com/docs/extensions/reference/api/action#method-setTitle + * @link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction/setTitle + */ +export const setExtensionTitle = async (title: ReadonlyUserAgentState | string, tabId?: number): Promise => { + if (typeof title === 'string') { + return await chrome.action.setTitle({ title, tabId }) + } + + return await chrome.action.setTitle({ + title: [ + ((): string => { + switch (title.browser) { + case 'chrome': + return '๐ŸŒ Chrome' + case 'firefox': + return '๐ŸฆŠ FireFox' + case 'opera': + return 'โญ• Opera' + case 'safari': + return '๐Ÿงญ Safari' + case 'edge': + return '๐Ÿ›ธ Edge' + default: + return '๐Ÿ‘ป Browser' + } + })(), + `(v${title.version.browser.major})`, + ((): string => { + switch (title.os) { + case 'windows': + return '๐Ÿ–ฅ Windows' + case 'linux': + return '๐Ÿง Linux' + case 'macOS': + return '๐Ÿ macOS' + case 'iOS': + return '๐Ÿ iOS' + case 'android': + return '๐Ÿ“ฑ Android' + default: + return '๐Ÿงฎ Device' + } + })(), + ].join(' '), + tabId, + }) +} diff --git a/src/entrypoints/background/ui/index.ts b/src/entrypoints/background/ui/index.ts new file mode 100644 index 00000000..8ef46382 --- /dev/null +++ b/src/entrypoints/background/ui/index.ts @@ -0,0 +1 @@ +export { setExtensionIcon, setExtensionTitle } from './extension-icon' diff --git a/src/entrypoints/content/content.ts b/src/entrypoints/content/content.ts new file mode 100644 index 00000000..29d876ae --- /dev/null +++ b/src/entrypoints/content/content.ts @@ -0,0 +1,26 @@ +// โš  DO NOT IMPORT ANYTHING EXCEPT TYPES HERE DUE THE `import()` ERRORS โš  + +// wrap everything to avoid polluting the global scope +// eslint-disable-next-line no-extra-semi +;(() => { + try { + // Important Note: + // + // Chromium-based browsers (like Chrome, Edge, Opera, etc.) support the `world` property in the + // `chrome.scripting.registerContentScripts` API. However, FireFox does not. Therefore, I need to ensure that the + // "inject" script code is executed in both environments. + // + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/RegisteredContentScript + + const script = document.createElement('script') + const parent = document.head || document.documentElement + + script.type = 'module' + script.setAttribute('id', __UNIQUE_INJECT_FILENAME__) + script.src = chrome.runtime.getURL(__UNIQUE_INJECT_FILENAME__) + + parent.prepend(script) + } catch (err) { + console.warn('๐Ÿงจ RUA: An error occurred in the content script', err) + } +})() diff --git a/src/entrypoints/content/inject.ts b/src/entrypoints/content/inject.ts new file mode 100644 index 00000000..7a7b8685 --- /dev/null +++ b/src/entrypoints/content/inject.ts @@ -0,0 +1,399 @@ +// โš  DO NOT IMPORT ANYTHING EXCEPT TYPES HERE DUE THE `import()` ERRORS โš  +import type { ContentScriptPayload } from '~/shared/types' +import type { DeepWriteable } from '~/types' + +// wrap everything to avoid polluting the global scope +// eslint-disable-next-line no-extra-semi +;(() => { + // prevent the script from running multiple times + { + const [key, ds, flag] = [__UNIQUE_HEADER_KEY_NAME__.toLowerCase(), document.documentElement.dataset, 'true'] + if (ds[key] === flag) { + return + } + + ds[key] = flag + + setTimeout(() => delete ds[key], 1000) // remove the dataset attribute after 1 second + } + + /** Extracts the payload from the performance entries (which are sent by the background script) */ + const extractPayload = (): ContentScriptPayload | undefined => { + for (const entry of performance.getEntriesByType('navigation')) { + if (entry instanceof PerformanceNavigationTiming) { + for (const timing of entry.serverTiming) { + if (timing.name === __UNIQUE_HEADER_KEY_NAME__) { + return JSON.parse(atob(timing.description.replace(/_/g, '='))) + } + } + } + } + + return + } + + /** Finds and removes the injected script */ + const findAndRemoveScriptTag = (): boolean => { + const injectedScript = document.getElementById(__UNIQUE_INJECT_FILENAME__) as HTMLScriptElement | null + if (injectedScript) { + injectedScript.remove() + + return true + } + + return false + } + + /** Overloads the object property with the new value. */ + const overload = ( + t: T, + prop: T extends Navigator ? keyof T | 'oscpu' : keyof T, + value: unknown, + options: { force?: boolean; configurable?: boolean; writable?: boolean } = { + force: false, + configurable: false, + writable: false, + } + ): void => { + let target: T = t + + try { + while (target !== null) { + const descriptor = Object.getOwnPropertyDescriptor(target, prop) + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty + if (descriptor && descriptor.configurable) { + const newAttributes: PropertyDescriptor = { configurable: options.configurable, enumerable: true } + + // respect the original value getting method + if (descriptor.get) { + newAttributes.get = () => value + } else { + newAttributes.value = value + newAttributes.writable = options.writable + } + + Object.defineProperty(target, prop, newAttributes) + } else if (options.force && Object.getPrototypeOf(t) === Object.getPrototypeOf(target)) { + Object.defineProperty(target, prop, { + value, + configurable: options.configurable, + enumerable: true, + writable: options.writable, + }) + } + + target = Object.getPrototypeOf(target) + } + } catch (_) { + // do nothing + } + } + + try { + // first of all, remove the injected script + findAndRemoveScriptTag() + + // check the payload existence and do nothing if it is not found + const payload = extractPayload() + if (!payload) { + // no payload = no fun + // + // probably, the page was already patched and the script tag was removed by this script, but registered with + // the `world: 'MAIN'` property (Chromium-based browsers only) + return + } + + /** + * Function to patch the navigator object. + * + * @link https://developer.mozilla.org/en-US/docs/Web/API/Navigator + */ + const patchNavigator = (n: Navigator): void => { + if (n === null || typeof n !== 'object' || !('userAgent' in n)) { + return + } + + // to test, execute in the console: `console.log(navigator.userAgent)` + overload( + n, + 'userAgent', + ((): string => { + switch (payload.current.browser) { + case 'chrome': + case 'opera': + case 'edge': // blink engine + // mask the browser (and under the hood) versions, keeping only the major version (e.g., 92.0.4515.107 -> 92.0.0.0) + const masked = payload.current.userAgent.replaceAll( + payload.current.version.browser.full, + payload.current.version.browser.major + + '.0'.repeat(Math.max(0, payload.current.version.browser.full.split('.').length - 1)) + ) + + if (payload.current.version.underHood) { + return masked.replaceAll( + payload.current.version.underHood.full || '', + payload.current.version.underHood.major + + '.0'.repeat(Math.max(0, payload.current.version.underHood.full.split('.').length - 1)) + ) + } + + return masked + } + + return payload.current.userAgent + })() + ) + + // to test, execute in the console: `console.log(navigator.appVersion)` + overload( + n, + 'appVersion', + ((): string => { + if (payload.current.browser === 'firefox') { + switch (payload.current.os) { + case 'windows': + return '5.0 (Windows)' + case 'linux': + return '5.0 (X11)' + } + + return '5.0' + } + + return payload.current.userAgent.replace(/^Mozilla\//i, '') + })() + ) + + // to test, execute in the console: `console.log(navigator.platform, navigator.oscpu)` + switch (payload.current.os) { + case 'windows': + overload(n, 'platform', 'Win32') + overload(n, 'oscpu', payload.current.browser === 'firefox' ? 'Windows NT; Win64; x64' : undefined, { + force: true, + }) + break + + case 'linux': + overload(n, 'platform', 'Linux x86_64') + overload(n, 'oscpu', payload.current.browser === 'firefox' ? 'Linux x86_64' : undefined, { force: true }) + break + + case 'android': + overload(n, 'platform', 'Linux armv8l') + overload(n, 'oscpu', payload.current.browser === 'firefox' ? 'Linux armv8l' : undefined, { force: true }) + break + + case 'macOS': + overload(n, 'platform', 'MacIntel') + overload(n, 'oscpu', payload.current.browser === 'firefox' ? 'Mac OS X' : undefined, { force: true }) + break + + case 'iOS': + overload(n, 'platform', 'iPhone') + overload(n, 'oscpu', payload.current.browser === 'firefox' ? 'Mac OS X' : undefined, { force: true }) + break + + default: + overload(n, 'oscpu', undefined, { force: true }) + } + + // to test, execute in the console: `console.log(navigator.vendor)` + switch (payload.current.browser) { + case 'chrome': + case 'opera': + case 'edge': // blink engine + overload(n, 'vendor', 'Google Inc.') + break + + case 'firefox': // gecko engine + overload(n, 'vendor', '') // firefox always with an empty vendor + break + + case 'safari': // webkit engine + overload(n, 'vendor', 'Apple Computer, Inc.') + break + + default: + overload(n, 'vendor', undefined) + } + + /** + * @link https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData#browser_compatibility + * @link https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/core/frame/navigator_ua_data.cc + */ + switch (payload.current.browser) { + case 'firefox': + case 'safari': + // FireFox and Safari does not support the `userAgentData` property yet + overload(n, 'userAgentData', undefined, { force: true }) + break + + default: + // check the `userAgentData` property availability in current (real) browser + const isAvailable = 'userAgentData' in n && typeof n.userAgentData === 'object' + + // store the original `userAgentData`, or craft a mock object if it does not exist + const agentDataObject: NavigatorUAData = isAvailable + ? n.userAgentData + : { + brands: [], + mobile: false, + platform: '', + toJSON(): UALowEntropyJSON { + return { brands: [], mobile: false, platform: '' } + }, + getHighEntropyValues(): Promise { + return Promise.resolve({ brands: [], mobile: false, platform: '' }) + }, + } + + // if the real browser does not support the `userAgentData` property, then overload it with the mock object + // this is necessary to avoid errors during overload the `userAgentData` properties + if (!isAvailable) { + overload(n, 'userAgentData', agentDataObject, { force: true, configurable: true }) + } + + // to test, execute in the console: `console.log(navigator.userAgentData.brands)` + overload( + n.userAgentData, + 'brands', + payload.brands.major.map(({ brand, version }) => ({ brand, version })) + ) + + // to test, execute in the console: `console.log(navigator.userAgentData.mobile)` + overload(n.userAgentData, 'mobile', payload.isMobile) + + // to test, execute in the console: `console.log(navigator.userAgentData.platform)` + overload(n.userAgentData, 'platform', payload.platform) + + // to test, execute in the console: `console.log(navigator.userAgentData.toJSON())` + overload( + n.userAgentData, + 'toJSON', + new Proxy(agentDataObject.toJSON, { + apply(target, self, args) { + return { + ...Reflect.apply(target, self, args), + brands: payload.brands.major.map(({ brand, version }) => ({ brand, version })), + mobile: payload.isMobile, + platform: payload.platform, + } + }, + }) + ) + + // to test, execute in the console: `console.log(await navigator.userAgentData.getHighEntropyValues([...]))` + overload( + n.userAgentData, + 'getHighEntropyValues', + new Proxy(agentDataObject.getHighEntropyValues, { + apply(target, self, args) { + return new Promise((resolve: (v: UADataValues) => void, reject: () => void): void => { + // get the original high entropy values + Reflect.apply(target, self, args) + .then((values: UADataValues): void => { + const data: DeepWriteable = { + ...values, + brands: payload.brands.major.map(({ brand, version }) => ({ brand, version })), + fullVersionList: payload.brands.full.map(({ brand, version }) => ({ brand, version })), + mobile: payload.isMobile, + model: '', + platform: payload.platform, + platformVersion: ((): string => { + switch (payload.platform) { + case 'Windows': + return '10.0.0' + case 'Linux': + return '6.5.0' + case 'Android': + return '13.0.0' + case 'macOS': + case 'iOS': + return '14.2.1' + } + + return '' + })(), + } + + if ('uaFullVersion' in values) { + data.uaFullVersion = payload.current.version.browser.full + } + + resolve(data) + }) + .catch(reject) + }) + }, + }) + ) + } + } + + /** Patches the navigator object for the iframe. */ + const patchNavigatorInIframe = (node: Node): void => { + if (typeof node !== 'object' || node == null || node.nodeName !== 'IFRAME' || !('contentWindow' in node)) { + return + } + + try { + const iFrame = node as HTMLIFrameElement + + if (typeof iFrame.contentWindow !== 'object' || iFrame.contentWindow == null) { + return + } + + const [key, ds, flag] = [__UNIQUE_HEADER_KEY_NAME__.toLowerCase(), iFrame.dataset, 'true'] + if (ds[key] === flag) { + return // already patched + } + + ds[key] = flag + + iFrame.contentWindow && patchNavigator(iFrame.contentWindow.navigator) + } catch (_) { + // An error occurred while patching the navigator object in the iframe + } + } + + // patch the current navigator object + patchNavigator(navigator) + + // patch iframes navigators + { + // currently existing + Array(...document.getElementsByTagName('iframe')).forEach(patchNavigatorInIframe) + + const overloadOpts: Parameters[3] = { configurable: true, force: true, writable: true } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const proxyInvoke = unknown>(what: T): T => + new Proxy(what, { + apply(target, thisArg, args) { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply + const result = Reflect.apply(target, thisArg, args) + + // patch the navigator object in the appended node + Array.isArray(args) && args.forEach((node) => patchNavigatorInIframe(node)) + + return result + }, + }) + + // patch the methods that can add new nodes to the DOM + // TY @Certseeds for the idea (https://github.com/tarampampam/random-user-agent/pull/173) + overload(Node.prototype, 'appendChild', proxyInvoke(Node.prototype.appendChild), overloadOpts) + overload(Node.prototype, 'insertBefore', proxyInvoke(Node.prototype.insertBefore), overloadOpts) + overload(Element.prototype, 'append', proxyInvoke(Element.prototype.append), overloadOpts) + overload(Element.prototype, 'prepend', proxyInvoke(Element.prototype.prepend), overloadOpts) + + // watch for the new dynamically created iframes + new MutationObserver((mutations): void => { + mutations.forEach((mutation): void => mutation.addedNodes.forEach(patchNavigatorInIframe)) + }).observe(document, { childList: true, subtree: true }) + } + } catch (err) { + console.warn('๐Ÿ’ฃ RUA: An error occurred in the injected script', err) + } +})() diff --git a/src/entrypoints/onboard/components/button/component.module.scss b/src/entrypoints/onboard/components/button/component.module.scss new file mode 100644 index 00000000..63d7e112 --- /dev/null +++ b/src/entrypoints/onboard/components/button/component.module.scss @@ -0,0 +1,33 @@ +@forward '~/theme/theme'; + +.button { + display: block; + font-size: 1.5em; + margin: 0.7em 1em; + text-align: center; + cursor: pointer; + + background-color: var(--color-bg-info); + color: var(--color-text-info); + padding: 0.5em 1em; + border-radius: 0.3em; + border: 2px solid var(--color-ui-border-info); + + animation: pulse 2s infinite; + + @keyframes pulse { + 0% { + box-shadow: 0 0 0 0 rgba(125, 125, 125, 0.25); + } + 70% { + box-shadow: 0 0 0 17px rgba(125, 125, 125, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(125, 125, 125, 0); + } + } + + &:hover { + text-decoration: none; + } +} diff --git a/src/entrypoints/onboard/components/button/component.tsx b/src/entrypoints/onboard/components/button/component.tsx new file mode 100644 index 00000000..2ced3b4a --- /dev/null +++ b/src/entrypoints/onboard/components/button/component.tsx @@ -0,0 +1,10 @@ +import type React from 'react' +import styles from './component.module.scss' + +export default function Button({ title, onClick }: { title: string; onClick: () => void }): React.JSX.Element { + return ( + + ) +} diff --git a/src/entrypoints/onboard/components/button/index.ts b/src/entrypoints/onboard/components/button/index.ts new file mode 100644 index 00000000..0d3b5381 --- /dev/null +++ b/src/entrypoints/onboard/components/button/index.ts @@ -0,0 +1 @@ +export { default } from './component' diff --git a/src/entrypoints/onboard/components/container/component.module.scss b/src/entrypoints/onboard/components/container/component.module.scss new file mode 100644 index 00000000..5d7ff32c --- /dev/null +++ b/src/entrypoints/onboard/components/container/component.module.scss @@ -0,0 +1,56 @@ +@forward '~/theme/theme'; + +.center { + text-align: center; +} + +.container { + display: flex; + width: 100vw; + height: 100vh; + justify-content: center; + align-items: center; + font-size: 1.3em; + + .wrapper { + width: 100%; + max-width: 1100px; + display: flex; + flex-direction: row; + + .left { + box-sizing: border-box; + display: flex; + justify-content: center; + align-items: center; + + width: 42%; + min-width: 100px; + padding-right: 2em; + + .logo { + width: 100%; + } + } + + .options { + width: 100%; + min-width: 300px; + + li { + margin-bottom: 0.6em; + } + } + } +} + +.embeddedContent { + display: flex; + justify-content: center; +} + +@media (max-width: 850px) { + .container { + font-size: 1em; + } +} diff --git a/src/entrypoints/onboard/components/container/component.tsx b/src/entrypoints/onboard/components/container/component.tsx new file mode 100644 index 00000000..b40115a1 --- /dev/null +++ b/src/entrypoints/onboard/components/container/component.tsx @@ -0,0 +1,29 @@ +import type React from 'react' +import i18n from '~/i18n/i18n' +import logo from '~/shared/assets/logo.svg' +import styles from './component.module.scss' + +export default function Container({ children = null }: { children?: React.ReactNode }): React.JSX.Element { + return ( +
+
+
+ logo +
+
+

{i18n('manifest_name')}

+ +

{i18n('why_we_need_permissions')}:

+ +
    +
  • + {i18n('read_and_modify_data') + ' '}({i18n('read_and_modify_data_reason')}) +
  • +
+ +
{children}
+
+
+
+ ) +} diff --git a/src/entrypoints/onboard/components/container/index.ts b/src/entrypoints/onboard/components/container/index.ts new file mode 100644 index 00000000..0d3b5381 --- /dev/null +++ b/src/entrypoints/onboard/components/container/index.ts @@ -0,0 +1 @@ +export { default } from './component' diff --git a/src/entrypoints/onboard/index.html b/src/entrypoints/onboard/index.html new file mode 100644 index 00000000..10be1e9d --- /dev/null +++ b/src/entrypoints/onboard/index.html @@ -0,0 +1,12 @@ + + + + + + Random User-Agent - Onboarding + + +
+ + + diff --git a/src/entrypoints/onboard/index.scss b/src/entrypoints/onboard/index.scss new file mode 100644 index 00000000..8e0b4058 --- /dev/null +++ b/src/entrypoints/onboard/index.scss @@ -0,0 +1,27 @@ +@forward '~/theme/theme'; + +html, +body { + background-color: var(--color-bg-primary); + color: var(--color-text-primary); + margin: 0; + padding: 0; + font-family: + 'Open Sans', + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Ubuntu, + Arial, + sans-serif; + font-weight: 400; +} + +body { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + font-size: 16px; +} diff --git a/src/entrypoints/onboard/index.tsx b/src/entrypoints/onboard/index.tsx new file mode 100644 index 00000000..b414e20f --- /dev/null +++ b/src/entrypoints/onboard/index.tsx @@ -0,0 +1,46 @@ +import type React from 'react' +import { StrictMode, useEffect } from 'react' +import { createRoot } from 'react-dom/client' +import { i18n } from '~/i18n' +import { askForPermissions, checkPermissions } from '~/shared/permissions' +import Button from './components/button' +import Container from './components/container' +import './index.scss' + +const App = (): React.JSX.Element => { + // watch for permissions and close the window when granted automatically + useEffect(() => { + const check = () => { + checkPermissions().then((has) => { + if (has) { + window.close() + } + }) + } + + const t = setInterval(check, 1000) + + check() + + return () => clearInterval(t) + }, []) + + return ( + + + ) + } + + render() { + return + } +} diff --git a/src/entrypoints/options/shared/components/button/index.ts b/src/entrypoints/options/shared/components/button/index.ts new file mode 100644 index 00000000..0d3b5381 --- /dev/null +++ b/src/entrypoints/options/shared/components/button/index.ts @@ -0,0 +1 @@ +export { default } from './component' diff --git a/src/entrypoints/options/shared/components/grid/component.module.scss b/src/entrypoints/options/shared/components/grid/component.module.scss new file mode 100644 index 00000000..d6433fa4 --- /dev/null +++ b/src/entrypoints/options/shared/components/grid/component.module.scss @@ -0,0 +1,32 @@ +.grid { + display: block; + + //background-color: rgba(255,0,0,0.5); // for debugging +} + +.row { + display: flex; + justify-content: space-between; + padding: 1.5em 0; + + &:not(:last-child) { + border: solid var(--color-ui-border-light); + border-width: 0 0 1px 0; + } + + //background-color: rgba(0,255,0,0.5); // for debugging +} + +.column { + display: flex; + flex-direction: column; + justify-content: center; + + //background-color: rgba(0,0,255,0.5); // for debugging +} + +.hint { + opacity: 0.7; + font-size: 0.8em; + margin: 1em 0; +} diff --git a/src/entrypoints/options/shared/components/grid/component.tsx b/src/entrypoints/options/shared/components/grid/component.tsx new file mode 100644 index 00000000..ce0e7f4d --- /dev/null +++ b/src/entrypoints/options/shared/components/grid/component.tsx @@ -0,0 +1,49 @@ +import React from 'react' +import styles from './component.module.scss' + +export default class Grid extends React.Component<{ children: React.ReactNode }> { + static Row = ({ children, style }: { children: React.ReactNode; style?: React.CSSProperties }): React.JSX.Element => { + return ( +
+ {children} +
+ ) + } + + static Column = ({ + children, + fullWidth, + style, + }: { + children: React.ReactNode + fullWidth?: boolean + style?: { + inner?: React.CSSProperties + outer?: React.CSSProperties + } + }): React.JSX.Element => { + return ( +
+
{children}
+
+ ) + } + + static Hint = ({ + children, + style, + }: { + children: React.ReactNode + style?: React.CSSProperties + }): React.JSX.Element => { + return ( +
+ {children} +
+ ) + } + + render() { + return
{this.props.children}
+ } +} diff --git a/src/entrypoints/options/shared/components/grid/index.ts b/src/entrypoints/options/shared/components/grid/index.ts new file mode 100644 index 00000000..0d3b5381 --- /dev/null +++ b/src/entrypoints/options/shared/components/grid/index.ts @@ -0,0 +1 @@ +export { default } from './component' diff --git a/src/entrypoints/options/shared/components/index.ts b/src/entrypoints/options/shared/components/index.ts new file mode 100644 index 00000000..12687d99 --- /dev/null +++ b/src/entrypoints/options/shared/components/index.ts @@ -0,0 +1,5 @@ +export { default as Button } from './button' +export { default as Grid } from './grid' +export { default as Input } from './input' +export { default as Selector } from './selector' +export { default as Switch } from './switch' diff --git a/src/entrypoints/options/shared/components/input/component.module.scss b/src/entrypoints/options/shared/components/input/component.module.scss new file mode 100644 index 00000000..79b6ed35 --- /dev/null +++ b/src/entrypoints/options/shared/components/input/component.module.scss @@ -0,0 +1,79 @@ +@forward '~/theme/theme'; + +.number { + padding: 0.5em; + margin: 0; + background-color: var(--color-ui-bg-primary); + border: 1px solid var(--color-ui-border-primary); + color: var(--color-text-primary); + box-sizing: border-box; + + &::placeholder { + color: var(--color-text-light); + } + + &:focus, + &:focus-visible { + outline: none; + } + + &::-webkit-inner-spin-button, + &::-webkit-outer-spin-button { + opacity: 1; + } + + &:disabled { + background-color: var(--color-ui-bg-disabled); + cursor: not-allowed; + } +} + +.text { + padding: 0.5em; + margin: 0; + background-color: var(--color-ui-bg-primary); + border: 1px solid var(--color-ui-border-primary); + color: var(--color-text-primary); + box-sizing: border-box; + + &::placeholder { + color: var(--color-text-light); + } + + &:focus, + &:focus-visible { + outline: none; + } + + &:disabled { + background-color: var(--color-ui-bg-disabled); + cursor: not-allowed; + } +} + +.textarea { + display: block; + width: 100%; + min-height: 4em; + resize: vertical; + padding: 0.7em 0.5em; + + box-sizing: border-box; + background-color: var(--color-ui-bg-primary); + border: 1px solid var(--color-ui-border-primary); + color: var(--color-text-primary); + + &::placeholder { + color: var(--color-text-light); + } + + &:focus, + &:focus-visible { + outline: none; + } + + &:disabled { + background-color: var(--color-ui-bg-disabled); + cursor: not-allowed; + } +} diff --git a/src/entrypoints/options/shared/components/input/component.tsx b/src/entrypoints/options/shared/components/input/component.tsx new file mode 100644 index 00000000..d23c816a --- /dev/null +++ b/src/entrypoints/options/shared/components/input/component.tsx @@ -0,0 +1,149 @@ +import type React from 'react' +import { useId } from 'react' +import styles from './component.module.scss' + +export default class Input { + static Number = ({ + id, + value = 0, + size, + min, + max, + step, + placeholder, + disabled = false, + style, + onChange, + }: { + id?: string + value?: number + size?: number + min?: number + max?: number + step?: number + placeholder?: string + disabled?: boolean + style?: React.CSSProperties + onChange?: (newValue: number) => void + }): React.JSX.Element => { + return ( + { + let newValue = e.currentTarget.valueAsNumber + + if (min && newValue < min) { + newValue = min + } else if (max && newValue > max) { + newValue = max + } else if (isNaN(newValue)) { + newValue = min ?? 0 + } + + onChange?.(newValue) + }} + /> + ) + } + + static Text = ({ + id, + value = '', + size, + maxLength, + placeholder, + disabled = false, + style, + onChange, + }: { + id?: string + value?: string + size?: number + maxLength?: number + placeholder?: string + disabled?: boolean + style?: React.CSSProperties + onChange?: (newValue: string) => void + }) => { + return ( + { + let newValue = e.currentTarget.value + + if (maxLength && newValue.length > maxLength) { + newValue = newValue.slice(0, maxLength) + } + + onChange?.(newValue) + }} + /> + ) + } + + static Textarea = ({ + id, + value, + placeholder, + maxLength, + cols, + rows, + disabled = false, + style, + onChange, + }: { + id?: string + value?: string + placeholder?: string + maxLength?: number + cols?: number + rows?: number + disabled?: boolean + style?: React.CSSProperties + onChange?: (newValue: string) => void + }): React.JSX.Element => { + return ( + - - - - - diff --git a/src/views/options/common/toggle.vue b/src/views/options/common/toggle.vue deleted file mode 100644 index 7f747605..00000000 --- a/src/views/options/common/toggle.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/src/views/options/controls/blacklist-custom-rules-list.vue b/src/views/options/controls/blacklist-custom-rules-list.vue deleted file mode 100644 index 703712a0..00000000 --- a/src/views/options/controls/blacklist-custom-rules-list.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/src/views/options/controls/blacklist-domains-list.vue b/src/views/options/controls/blacklist-domains-list.vue deleted file mode 100644 index 25152b88..00000000 --- a/src/views/options/controls/blacklist-domains-list.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/src/views/options/controls/blacklist-mode.vue b/src/views/options/controls/blacklist-mode.vue deleted file mode 100644 index eeda9b53..00000000 --- a/src/views/options/controls/blacklist-mode.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - diff --git a/src/views/options/controls/control-item.vue b/src/views/options/controls/control-item.vue deleted file mode 100644 index 6d9e71f6..00000000 --- a/src/views/options/controls/control-item.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - diff --git a/src/views/options/controls/custom-ua-list.vue b/src/views/options/controls/custom-ua-list.vue deleted file mode 100644 index 7399c36b..00000000 --- a/src/views/options/controls/custom-ua-list.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/src/views/options/controls/enable-switcher.vue b/src/views/options/controls/enable-switcher.vue deleted file mode 100644 index 5872324f..00000000 --- a/src/views/options/controls/enable-switcher.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/src/views/options/controls/generator-types.vue b/src/views/options/controls/generator-types.vue deleted file mode 100644 index 8b4bb8d9..00000000 --- a/src/views/options/controls/generator-types.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - diff --git a/src/views/options/controls/js-protection.vue b/src/views/options/controls/js-protection.vue deleted file mode 100644 index ee4dca0b..00000000 --- a/src/views/options/controls/js-protection.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/src/views/options/controls/remote-ua-list.vue b/src/views/options/controls/remote-ua-list.vue deleted file mode 100644 index 13131bf0..00000000 --- a/src/views/options/controls/remote-ua-list.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - diff --git a/src/views/options/controls/renew-interval.vue b/src/views/options/controls/renew-interval.vue deleted file mode 100644 index 44b2f07d..00000000 --- a/src/views/options/controls/renew-interval.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/src/views/options/controls/renew-on-startup.vue b/src/views/options/controls/renew-on-startup.vue deleted file mode 100644 index 46645410..00000000 --- a/src/views/options/controls/renew-on-startup.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/src/views/options/extended/footer-block.vue b/src/views/options/extended/footer-block.vue deleted file mode 100644 index d4d843d6..00000000 --- a/src/views/options/extended/footer-block.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/src/views/options/options.vue b/src/views/options/options.vue deleted file mode 100644 index c7f8302d..00000000 --- a/src/views/options/options.vue +++ /dev/null @@ -1,273 +0,0 @@ - - - - - diff --git a/src/views/options/styles/main.scss b/src/views/options/styles/main.scss deleted file mode 100644 index 94e81762..00000000 --- a/src/views/options/styles/main.scss +++ /dev/null @@ -1,41 +0,0 @@ -$scrollbar-width: 8px; - -::-webkit-scrollbar { - width: $scrollbar-width; - height: $scrollbar-width; -} - -::-webkit-scrollbar-thumb { - border: 2px solid rgba(0, 0, 0, 0); - background-clip: padding-box; - border-radius: $scrollbar-width; - background-color: var(--color-scrollbar-thumb); -} - -html, body { - margin: 0; - padding: 0; -} - -body { - font-family: 'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Ubuntu, Arial, sans-serif; - font-size: 16px; - background-color: var(--color-bg-primary); - color: var(--color-text-primary); - - a { - color: var(--color-link-primary); - } -} - -label { - cursor: pointer; -} - -.fade-enter-active, .fade-leave-active { - transition: opacity 290ms ease; -} - -.fade-enter-from, .fade-leave-to { - opacity: 0; -} diff --git a/src/views/popup/common/browser-icon.vue b/src/views/popup/common/browser-icon.vue deleted file mode 100644 index 0ffa15cf..00000000 --- a/src/views/popup/common/browser-icon.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/src/views/popup/common/control-icon.vue b/src/views/popup/common/control-icon.vue deleted file mode 100644 index 24bbdabd..00000000 --- a/src/views/popup/common/control-icon.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - diff --git a/src/views/popup/common/device-icon.vue b/src/views/popup/common/device-icon.vue deleted file mode 100644 index 6563cbed..00000000 --- a/src/views/popup/common/device-icon.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/src/views/popup/common/ios-checkbox.vue b/src/views/popup/common/ios-checkbox.vue deleted file mode 100644 index e3080b45..00000000 --- a/src/views/popup/common/ios-checkbox.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/src/views/popup/extended/actions.vue b/src/views/popup/extended/actions.vue deleted file mode 100644 index 85cc6c02..00000000 --- a/src/views/popup/extended/actions.vue +++ /dev/null @@ -1,149 +0,0 @@ - - - - - diff --git a/src/views/popup/extended/active-user-agent.vue b/src/views/popup/extended/active-user-agent.vue deleted file mode 100644 index c42108db..00000000 --- a/src/views/popup/extended/active-user-agent.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - - diff --git a/src/views/popup/extended/footer.vue b/src/views/popup/extended/footer.vue deleted file mode 100644 index 3df2540e..00000000 --- a/src/views/popup/extended/footer.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/src/views/popup/extended/header.vue b/src/views/popup/extended/header.vue deleted file mode 100644 index ade2f9f5..00000000 --- a/src/views/popup/extended/header.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - diff --git a/src/views/popup/extended/quick-select.vue b/src/views/popup/extended/quick-select.vue deleted file mode 100644 index e1234b1c..00000000 --- a/src/views/popup/extended/quick-select.vue +++ /dev/null @@ -1,276 +0,0 @@ - - - - - diff --git a/src/views/popup/extended/rate-extension.vue b/src/views/popup/extended/rate-extension.vue deleted file mode 100644 index d3e63337..00000000 --- a/src/views/popup/extended/rate-extension.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - - diff --git a/src/views/popup/extended/war-hint.vue b/src/views/popup/extended/war-hint.vue deleted file mode 100644 index 8aab370f..00000000 --- a/src/views/popup/extended/war-hint.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - - - diff --git a/src/views/popup/popup.vue b/src/views/popup/popup.vue deleted file mode 100644 index c5851a66..00000000 --- a/src/views/popup/popup.vue +++ /dev/null @@ -1,192 +0,0 @@ - - - - - diff --git a/src/views/shims-vue.d.ts b/src/views/shims-vue.d.ts deleted file mode 100644 index aafcc95d..00000000 --- a/src/views/shims-vue.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module '*.vue' { - import type { DefineComponent } from 'vue' - const component: DefineComponent<{}, {}, any> - - export default component -} diff --git a/src/views/shims-vuex.d.ts b/src/views/shims-vuex.d.ts deleted file mode 100644 index 7fe1d8ed..00000000 --- a/src/views/shims-vuex.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {Store} from 'vuex' -import {State} from './store/state' - -declare module '@vue/runtime-core' { - // provide typings for `this.$store` - interface ComponentCustomProperties { - $store: Store - } -} diff --git a/src/views/store/actions.ts b/src/views/store/actions.ts deleted file mode 100644 index 7b468911..00000000 --- a/src/views/store/actions.ts +++ /dev/null @@ -1,100 +0,0 @@ -import {RuntimeSender, Sender} from '../../messaging/runtime' -import {getSettings, GetSettingsResponse} from '../../messaging/handlers/get-settings' -import {updateSettings} from '../../messaging/handlers/update-settings' -import {Mutation} from './mutations' -import {ActionTree, Commit} from 'vuex' -import {State} from './state' -import {BlacklistMode} from '../../settings/settings' - -export enum Actions { - LoadSettings = 'LoadSettings', - SaveSettings = 'SaveSettings', -} - -const backend: Sender = new RuntimeSender - -export const actions: ActionTree = { - [Actions.LoadSettings]({commit}: { commit: Commit }): Promise { - return new Promise((resolve: () => void, reject: (err: Error) => void) => { - backend - .send(getSettings()) - .then((resp): void => { - const settings = (resp[0] as GetSettingsResponse).payload - - commit(Mutation.UpdateEnabled, settings.enabled) - commit(Mutation.UpdateRenew, { - enabled: settings.renew.enabled, - intervalSec: Math.round(settings.renew.intervalMillis / 1000), - onStartup: settings.renew.onStartup, - }) - commit(Mutation.UpdateJSProtection, { - enabled: settings.jsProtection.enabled, - }) - commit(Mutation.UpdateCustomUserAgent, { - enabled: settings.customUseragent.enabled, - list: settings.customUseragent.list, - }) - commit(Mutation.UpdateRemoteUserAgent, { - enabled: settings.remoteUseragentList.enabled, - uri: settings.remoteUseragentList.uri, - intervalSec: Math.round(settings.remoteUseragentList.updateIntervalMillis / 1000), - }) - commit(Mutation.UpdateGeneratorOptions, { - types: settings.generator.types, - }) - commit(Mutation.UpdateBlacklist, { - whitelistMode: settings.blacklist.mode === BlacklistMode.WhiteList, - domains: settings.blacklist.domains, - customRules: settings.blacklist.custom.rules, - }) - - commit(Mutation.SaveSettings) // just a little "logic" hack :) - - resolve() - }) - .catch(reject) - }) - }, - - [Actions.SaveSettings]({commit, state}: { commit: Commit, state: State }): Promise { - return new Promise((resolve: () => void, reject: (err: Error) => void) => { - backend - .send(updateSettings({ - enabled: state.settings.enabled, - renew: { - enabled: state.settings.renew.enabled, - intervalMillis: Math.round(state.settings.renew.intervalSec * 1000), - onStartup: state.settings.renew.onStartup, - }, - customUseragent: { - enabled: state.settings.customUseragent.enabled, - list: state.settings.customUseragent.list.slice(0), // proxy object to the plain array - }, - remoteUseragentList: { - enabled: state.settings.remoteUseragentList.enabled, - uri: state.settings.remoteUseragentList.uri, - updateIntervalMillis: Math.round(state.settings.remoteUseragentList.updateIntervalSec * 1000), - }, - jsProtection: { - enabled: state.settings.jsProtection.enabled, - }, - generator: { - types: state.settings.generator.types.slice(0), // proxy object to the plain array - }, - blacklist: { - mode: state.settings.blacklist.modeWhitelist ? BlacklistMode.WhiteList : BlacklistMode.BlackList, - domains: state.settings.blacklist.domains.slice(0), // proxy object to the plain array - custom: { - rules: state.settings.blacklist.custom.rules.slice(0), // proxy object to the plain array - }, - }, - })) - .then((): void => { - commit(Mutation.SaveSettings) - - resolve() - }) - .catch(reject) - }) - }, -} diff --git a/src/views/store/mutations.ts b/src/views/store/mutations.ts deleted file mode 100644 index c488698b..00000000 --- a/src/views/store/mutations.ts +++ /dev/null @@ -1,153 +0,0 @@ -import {MutationTree} from 'vuex' -import {State} from './state' -import {GeneratorType, isValidType} from '../../useragent/generator' - -export enum Mutation { - SaveSettings = 'SaveSettings', - UpdateEnabled = 'UpdateEnabled', - UpdateRenew = 'UpdateRenew', - UpdateJSProtection = 'UpdateJSProtection', - UpdateCustomUserAgent = 'UpdateCustomUserAgent', - UpdateRemoteUserAgent = 'UpdateRemoteUserAgent', - UpdateGeneratorOptions = 'UpdateGeneratorOptions', - UpdateBlacklist = 'UpdateBlacklist', -} - -export const mutations: MutationTree = { - [Mutation.SaveSettings](state: State): void { - state.settingsSaved = true - }, - - [Mutation.UpdateEnabled](state: State, enabled: boolean): void { - if (state.settings.enabled !== enabled) { - state.settings.enabled = enabled - state.settingsSaved = false - } - }, - - [Mutation.UpdateRenew](state: State, payload: { enabled?: boolean, intervalSec?: number, onStartup?: boolean }): void { - if (typeof payload !== 'object') { - return - } - - if (typeof payload.enabled === 'boolean' && state.settings.renew.enabled !== payload.enabled) { - state.settings.renew.enabled = payload.enabled - state.settingsSaved = false - } - - if (typeof payload.intervalSec === 'number' && state.settings.renew.intervalSec !== payload.intervalSec) { - state.settings.renew.intervalSec = Math.min(Math.max(1, payload.intervalSec), 86400) - state.settingsSaved = false - } - - if (typeof payload.onStartup === 'boolean' && state.settings.renew.onStartup !== payload.onStartup) { - state.settings.renew.onStartup = payload.onStartup - state.settingsSaved = false - } - }, - - [Mutation.UpdateJSProtection](state: State, payload: { enabled?: boolean }): void { - if (typeof payload !== 'object') { - return - } - - if (typeof payload.enabled === 'boolean' && state.settings.jsProtection.enabled !== payload.enabled) { - state.settings.jsProtection.enabled = payload.enabled - state.settingsSaved = false - } - }, - - [Mutation.UpdateCustomUserAgent](state: State, payload: { enabled?: boolean, list?: string[] }): void { - if (typeof payload !== 'object') { - return - } - - if (typeof payload.enabled === 'boolean' && state.settings.customUseragent.enabled !== payload.enabled) { - state.settings.customUseragent.enabled = payload.enabled - state.settingsSaved = false - } - - if (Array.isArray(payload.list)) { - state.settings.customUseragent.list = payload.list - .filter((s: unknown): boolean => typeof s === 'string') - .map((s: string): string => s.trim()) - .filter((s: string): boolean => s.length > 0) - - state.settingsSaved = false - } - }, - - [Mutation.UpdateRemoteUserAgent](state: State, payload: { enabled?: boolean, uri?: string, intervalSec?: number }): void { - if (typeof payload !== 'object') { - return - } - - if (typeof payload.enabled === 'boolean' && state.settings.remoteUseragentList.enabled !== payload.enabled) { - state.settings.remoteUseragentList.enabled = payload.enabled - state.settingsSaved = false - } - - if (typeof payload.uri === 'string' && state.settings.remoteUseragentList.uri !== payload.uri) { - try { - const url = new URL(payload.uri) // validate - - state.settings.remoteUseragentList.uri = url.toString() - } catch (_) { // invalid uri - state.settings.remoteUseragentList.uri = '' - } - state.settingsSaved = false - } - - if (typeof payload.intervalSec === 'number' && state.settings.remoteUseragentList.updateIntervalSec !== payload.intervalSec) { - state.settings.remoteUseragentList.updateIntervalSec = Math.min(Math.max(0, payload.intervalSec), 604800) - state.settingsSaved = false - } - }, - - [Mutation.UpdateGeneratorOptions](state: State, payload: { types?: GeneratorType[] } ): void { - if (typeof payload !== 'object') { - return - } - - if (Array.isArray(payload.types)) { - state.settings.generator.types = payload.types - .filter((s: unknown): boolean => typeof s === 'string') - .filter((t): boolean => isValidType(t)) - .filter((value, index, self): boolean => self.indexOf(value) === index) - .sort() - - state.settingsSaved = false - } - }, - - [Mutation.UpdateBlacklist](state: State, payload: { whitelistMode?: boolean, domains?: string[], customRules?: string[] } ): void { - if (typeof payload !== 'object') { - return - } - - if (typeof payload.whitelistMode === 'boolean' && state.settings.blacklist.modeWhitelist !== payload.whitelistMode) { - state.settings.blacklist.modeWhitelist = payload.whitelistMode - state.settingsSaved = false - } - - if (Array.isArray(payload.domains)) { - state.settings.blacklist.domains = payload.domains - .filter((s: unknown): boolean => typeof s === 'string') - .map((s: string): string => s.trim()) - .filter((s: string): boolean => s.length > 0) - .filter((value, index, self): boolean => self.indexOf(value) === index) - - state.settingsSaved = false - } - - if (Array.isArray(payload.customRules)) { - state.settings.blacklist.custom.rules = payload.customRules - .filter((s: unknown): boolean => typeof s === 'string') - .map((s: string): string => s.trim()) - .filter((s: string): boolean => s.length > 0) - .filter((value, index, self): boolean => self.indexOf(value) === index) - - state.settingsSaved = false - } - }, -} diff --git a/src/views/store/state.ts b/src/views/store/state.ts deleted file mode 100644 index 75cb74aa..00000000 --- a/src/views/store/state.ts +++ /dev/null @@ -1,71 +0,0 @@ -import {GeneratorType} from '../../useragent/generator' - -export interface State { - settingsSaved: boolean - - settings: { - enabled: boolean - renew: { - enabled: boolean - intervalSec: number - onStartup: boolean - } - jsProtection: { - enabled: boolean - } - customUseragent: { - enabled: boolean - list: string[] - } - remoteUseragentList: { - enabled: boolean - uri: string - updateIntervalSec: number - } - generator: { - types: GeneratorType[] - } - blacklist: { - modeWhitelist: boolean - domains: string[] - custom: { - rules: string[] - } - } - } -} - -export const state: State = { // default state - settingsSaved: true, - - settings: { - enabled: false, - renew: { - enabled: false, - intervalSec: 0, - onStartup: false, - }, - jsProtection: { - enabled: false, - }, - customUseragent: { - enabled: false, - list: [], - }, - remoteUseragentList: { - enabled: false, - uri: '', - updateIntervalSec: 0, - }, - generator: { - types: [], - }, - blacklist: { - modeWhitelist: false, - domains: [], - custom: { - rules: [], - }, - }, - }, -} diff --git a/src/views/store/store.ts b/src/views/store/store.ts deleted file mode 100644 index 1e7cbb7a..00000000 --- a/src/views/store/store.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {createStore} from 'vuex' -import {mutations} from './mutations' -import {actions} from './actions' -import {State, state} from './state' - -export const store = createStore({ - state: state, - mutations: mutations, - actions: actions, -}) diff --git a/static/assets/icons/128-gray.png b/static/assets/icons/128-gray.png new file mode 100644 index 00000000..f63a79b1 Binary files /dev/null and b/static/assets/icons/128-gray.png differ diff --git a/static/assets/icons/128.png b/static/assets/icons/128.png new file mode 100644 index 00000000..98b42a95 Binary files /dev/null and b/static/assets/icons/128.png differ diff --git a/static/assets/icons/16-gray.png b/static/assets/icons/16-gray.png new file mode 100644 index 00000000..e5dda30a Binary files /dev/null and b/static/assets/icons/16-gray.png differ diff --git a/static/assets/icons/16.png b/static/assets/icons/16.png new file mode 100644 index 00000000..6e80e10b Binary files /dev/null and b/static/assets/icons/16.png differ diff --git a/static/assets/icons/32-gray.png b/static/assets/icons/32-gray.png new file mode 100644 index 00000000..8aa1b0c4 Binary files /dev/null and b/static/assets/icons/32-gray.png differ diff --git a/static/assets/icons/32.png b/static/assets/icons/32.png new file mode 100644 index 00000000..f2ecaa97 Binary files /dev/null and b/static/assets/icons/32.png differ diff --git a/static/assets/icons/48-gray.png b/static/assets/icons/48-gray.png new file mode 100644 index 00000000..6d4ef021 Binary files /dev/null and b/static/assets/icons/48-gray.png differ diff --git a/static/assets/icons/48.png b/static/assets/icons/48.png new file mode 100644 index 00000000..61a551c5 Binary files /dev/null and b/static/assets/icons/48.png differ diff --git a/tsconfig.json b/tsconfig.json index 7dfa1b71..a22bf5ae 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,32 +1,32 @@ { "compilerOptions": { - "strict": true, - "module": "ES2020", "target": "ES2020", - "esModuleInterop": true, - "moduleResolution": "node", - "sourceMap": false, - "jsx": "preserve", - "rootDir": "src", - "outDir": "dist/js", - "noEmitOnError": false, - "noEmit": false, - "noImplicitAny": false, - "typeRoots": [ - "node_modules/@types" + "types": ["vite/client", "node", "chrome", "user-agent-data-types"], + "useDefineForClassFields": true, + "lib": [ + "ES2022", + "DOM", + "DOM.Iterable" ], - "types": [ - "chrome", - "jest", - "node", - "./node_modules/user-agent-data-types" - ] + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "~/*": ["./src/*"] + } }, "include": [ - "src/**/*.ts", - "src/**/*.vue" - ], - "exclude": [ - "node_modules" + "vite.config.ts", + "node_modules/vite/client.d.ts", + "src/**/*", ] } diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..ec76b169 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,272 @@ +import { defineConfig, type PluginOption, type ResolvedConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { join, resolve } from 'path' +import { + cpSync, + rmSync, + linkSync, + readdirSync, + statSync, + createWriteStream, + mkdirSync, + writeFileSync, + renameSync, +} from 'fs' +import archiver from 'archiver' +import randomstring from 'randomstring' +import manifestJson from './manifest.json' +import packageJson from './package.json' +import { locales } from './src/i18n/locales' +import ManifestV3 = chrome.runtime.ManifestV3 + +const distDir = resolve(__dirname, 'dist') +const distChromeDir = join(distDir, 'chrome') +const distFireFoxDir = join(distDir, 'firefox') +const srcDir = resolve(__dirname, 'src') +const entrypointDir = join(srcDir, 'entrypoints') +const staticDir = resolve(__dirname, 'static') + +const uniqueInjectFileName: string = randomstring.generate({ length: 8, charset: 'alphabetic' }) +const uniqueHeaderKeyName: string = randomstring.generate({ length: 8, charset: 'alphabetic' }) + +enum ProjectURLs { + GITHUB = 'https://github.com/tarampampam/random-user-agent', + BUGREPORT = 'https://github.com/tarampampam/random-user-agent/issues/new/choose', + CHROME = 'https://chromewebstore.google.com/detail/random-user-agent-switche/einpaelgookohagofgnnkcfjbkkgepnp', + FIREFOX = 'https://addons.mozilla.org/firefox/addon/random_user_agent', + OPERA = 'https://addons.opera.com/extensions/details/random-user-agent', + MICROSOFT = 'https://microsoftedge.microsoft.com/addons/detail/random-useragent-switch/addfjgllfhpnacoahmmcafmaacjloded', +} + +/** Create _locales directory with messages.json files */ +const createLocalesPlugin: PluginOption = { + name: 'create-locale-files', + generateBundle() { + for (const locale in locales) { + const name = locale as keyof typeof locales + const data = locales[name] + const result: Record = {} + + for (const key in data) { + result[key] = { message: data[key as keyof typeof data] } + } + + const dirPath = join(distChromeDir, '_locales', name) + + mkdirSync(dirPath, { recursive: true }) + writeFileSync(join(dirPath, 'messages.json'), JSON.stringify(result), { flag: 'w' }) + } + }, +} + +/** Copy static content as is */ +const copyStaticContentAsIsPlugin: PluginOption = { + name: 'copy-static-content', + generateBundle() { + cpSync(staticDir, distChromeDir, { recursive: true }) + }, +} + +/** Rename inject.js file to a unique name */ +const renameInjectFilePlugin: PluginOption = { + name: 'rename-inject-file', + writeBundle() { + const from = join(distChromeDir, 'inject.js') + const to = join(distChromeDir, `${uniqueInjectFileName}.js`) + + renameSync(from, to) + }, +} + +/** Split dist into chrome and firefox */ +const splitChromeAndFirefoxPlugin: PluginOption = { + name: 'split-chrome-and-firefox', + writeBundle: { + sequential: true, // https://rollupjs.org/plugin-development/#build-hooks + handler() { + // remove "./dist/firefox" directory + rmSync(distFireFoxDir, { recursive: true, force: true }) + mkdirSync(distFireFoxDir, { recursive: true }) + + const mirror = (from: string, to: string): void => { + readdirSync(from, { withFileTypes: true }) + .sort() + .forEach((file) => { + if (file.name === 'manifest.json') { + return // skip the manifest.json file + } + + const fromPath = join(from, file.name) + const toPath = join(to, file.name) + const stat = statSync(fromPath) + + if (stat.isDirectory()) { + mkdirSync(toPath, { recursive: true }) + mirror(fromPath, toPath) + } else if (stat.isFile() || stat.isSymbolicLink()) { + linkSync(fromPath, toPath) + } + }) + } + + // make a hardlinks of each file in "./dist/chrome" to "./dist/firefox" recursively + mirror(distChromeDir, distFireFoxDir) + }, + }, +} + +/** Create manifest.json file with version from package.json (including other changes) */ +const copyAndModifyManifestPlugin: PluginOption = { + name: 'copy-and-modify-manifest', + writeBundle: { + sequential: true, + handler() { + const content: Partial & { version: string }> = { + ...manifestJson, + } + + for (const key in content) { + if (key.startsWith('$')) { + delete content[key as keyof typeof content] // remove each key starting with `$` (e.g.: $schema, $docs, etc.) + } + } + + // set the version from package.json + content.version = packageJson.version + + // make injection file accessible from the content script + content.web_accessible_resources = [{ resources: [`/${uniqueInjectFileName}.js`], matches: [''] }] + + // for chrome-based browsers + writeFileSync(join(distChromeDir, 'manifest.json'), JSON.stringify(content), { flag: 'w' }) + + // for firefox + // https://extensionworkshop.com/documentation/develop/manifest-v3-migration-guide/ + writeFileSync( + join(distFireFoxDir, 'manifest.json'), + JSON.stringify({ + ...content, + // override background.service_worker with background.scripts + background: { scripts: [content.background.service_worker], type: content.background.type }, + browser_specific_settings: { + // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/declarativeNetRequest/updateDynamicRules + gecko: { strict_min_version: '113.0', id: '{b43b974b-1d3a-4232-b226-eaa2ac6ebb69}' }, + gecko_android: { strict_min_version: '120.0' }, + }, + }), + { flag: 'w' } + ) + }, + }, +} + +/** Create dist.zip file */ +const zipDistPlugin = (): PluginOption => { + let config: ResolvedConfig + + return { + name: 'zip-dist', + configResolved(cfg) { + config = cfg + }, + writeBundle: { + sequential: true, + async handler() { + if (config.command !== 'build' || process.argv.includes('--watch')) { + return // do nothing in dev/watch mode + } + + { + // chrome + const archive = archiver('zip', { zlib: { level: 9 } }) + + archive.pipe(createWriteStream(resolve(distDir, 'chrome.zip'))) + archive.directory(distChromeDir, false) + + await archive.finalize() + } + + { + // firefox + const archive = archiver('zip', { zlib: { level: 9 } }) + + archive.pipe(createWriteStream(resolve(distDir, 'firefox.zip'))) + archive.directory(distFireFoxDir, false) + + await archive.finalize() + } + }, + }, + } +} + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + [createLocalesPlugin, copyStaticContentAsIsPlugin, renameInjectFilePlugin], + splitChromeAndFirefoxPlugin, + [copyAndModifyManifestPlugin, zipDistPlugin()], + ], + resolve: { + alias: { + '~': srcDir, + }, + }, + define: { + __UNIQUE_INJECT_FILENAME__: JSON.stringify(`${uniqueInjectFileName}.js`), + __UNIQUE_HEADER_KEY_NAME__: JSON.stringify(uniqueHeaderKeyName), + + __GITHUB_URL__: JSON.stringify(ProjectURLs.GITHUB), + __BUGREPORT_URL__: JSON.stringify(ProjectURLs.BUGREPORT), + __CHROME_STORE_URL__: JSON.stringify(ProjectURLs.CHROME), + __MOZILLA_STORE_URL__: JSON.stringify(ProjectURLs.FIREFOX), + __OPERA_STORE_URL__: JSON.stringify(ProjectURLs.OPERA), + __MICROSOFT_STORE_URL__: JSON.stringify(ProjectURLs.MICROSOFT), + + // The events dashboard located here: https://bit.ly/448MU9g + __MIXPANEL_PROJECT_TOKEN__: JSON.stringify(atob('MGIyYjZhZjJjOTRjYjRiNTcwNmIxMDU3YTUyZjFmYTk=')), + + // The events dashboard located here: https://bit.ly/4aLsR3i + __GA_MEASUREMENT_ID__: JSON.stringify(atob('Ry0xVjVLNlE2R1A2')), // https://bit.ly/3W5dVZd -> Stream details -> Measurement ID + __GA_API_SECRET__: JSON.stringify(atob('b1lUTjFvU0ZTeS1OVWJvLUwyZVl3QQ==')), // https://bit.ly/3W5dVZd -> Measurement Protocol API secrets + }, + root: entrypointDir, + assetsInclude: 'public/**/*', + build: { + outDir: distChromeDir, + emptyOutDir: true, + rollupOptions: { + input: { + popup: join(entrypointDir, 'popup', 'index.html'), + options: join(entrypointDir, 'options', 'index.html'), + onboard: join(entrypointDir, 'onboard', 'index.html'), + background: join(entrypointDir, 'background', 'index.ts'), + content: join(entrypointDir, 'content', 'content.ts'), + inject: join(entrypointDir, 'content', 'inject.ts'), + }, + output: { + entryFileNames: '[name].js', + chunkFileNames: 'js/[name].js', + assetFileNames: 'assets/[name].[ext]', + }, + }, + sourcemap: false, + }, + esbuild: { + legalComments: 'none', + banner: ` +/** + * Hey there! ๐Ÿ‘‹ Nothing to hide from your scrutiny, right? ๐Ÿ˜† This file is + * part of the Random User-Agent extension, essential for enhancing your + * anonymity online (not by much, but still). + * + * If you encounter any issues, please feel free to file a new issue here: + * + * \t${ProjectURLs.BUGREPORT} + */`.trim(), + }, + test: { + root: __dirname, + }, +}) diff --git a/webpack/plugins/manifest-version-sync.js b/webpack/plugins/manifest-version-sync.js deleted file mode 100644 index 622e9229..00000000 --- a/webpack/plugins/manifest-version-sync.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @author https://github.com/ElForastero - * @link https://github.com/ElForastero/webpack-manifest-version-sync-plugin/blob/master/index.js - */ -const fs = require('fs') -const webpack = require('webpack') - -class ManifestVersionSyncPlugin { - constructor(options) { - const defaultOptions = { - manifestPath: 'manifest.json', - packagePath: 'package.json', - } - - this.options = { ...defaultOptions, ...options } - } - - apply(compiler) { - const pluginName = 'ManifestVersionSyncPlugin' - const { Compilation } = webpack - const { RawSource } = webpack.sources - const { packagePath, manifestPath } = this.options - - compiler.hooks.thisCompilation.tap(pluginName, (compilation) => { - compilation.hooks.processAssets.tap( - { - name: pluginName, - stage: Compilation.PROCESS_ASSETS_STAGE_PRE_PROCESS, - }, - (assets) => { - const { version } = JSON.parse(fs.readFileSync(packagePath).toString()) - const manifest = JSON.parse(assets[manifestPath].source().toString()) - const content = JSON.stringify({ ...manifest, version }, undefined, 2) - - compilation.updateAsset( - manifestPath, - new RawSource(content) - ) - } - ) - }) - } -} - -module.exports = ManifestVersionSyncPlugin diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js deleted file mode 100644 index 940ebfde..00000000 --- a/webpack/webpack.common.js +++ /dev/null @@ -1,91 +0,0 @@ -const path = require('path') -const webpack = require('webpack') -const CopyPlugin = require('copy-webpack-plugin') -const ManifestVersionSyncPlugin = require('./plugins/manifest-version-sync') -const JsonMinimizerPlugin = require('json-minimizer-webpack-plugin') -const TerserPlugin = require('terser-webpack-plugin') -const randomstring = require('randomstring') -const {VueLoaderPlugin} = require('vue-loader') -const srcDir = path.join(__dirname, '..', 'src') - -module.exports = { - node: { - global: false, - }, - entry: { - popup: path.join(srcDir, 'popup.ts'), - options: path.join(srcDir, 'options.ts'), - 'content-script': path.join(srcDir, 'content-script.ts'), - background: path.join(srcDir, 'background.ts'), - }, - output: { - path: path.join(__dirname, '..', 'dist', 'js'), - filename: '[name].js', - }, - optimization: { - minimize: true, - splitChunks: { - name: 'vendor', - chunks(chunk) { - return chunk.name !== 'content-script' - } - }, - minimizer: [ - new TerserPlugin({ - extractComments: false, - }), - new JsonMinimizerPlugin({ - test: /\.json$/i, - }), - ] - }, - module: { - rules: [ - { - test: /\.ts$/, - use: { - loader: 'ts-loader', - options: { - appendTsSuffixTo: [/\.vue$/], - }, - }, - exclude: /node_modules/, - }, - { - test: /\.css$/, - use: ['vue-style-loader', 'css-loader'], - }, - { - test: /\.scss$/, - use: ['vue-style-loader', 'css-loader', 'sass-loader'], - }, - { - test: /\.vue$/, - loader: 'vue-loader' - }, - ], - }, - resolve: { - extensions: ['.ts', '.js'], - }, - plugins: [ - new webpack.DefinePlugin({ - __UNIQUE_RUA_COOKIE_NAME__: JSON.stringify(randomstring.generate({ - length: Math.floor(Math.random() * 12 + 5), - charset: 'alphabetic', - })), - }), - new webpack.DefinePlugin({ // https://github.com/vuejs/vue-next/tree/master/packages/vue#bundler-build-feature-flags - __VUE_OPTIONS_API__: true, - __VUE_PROD_DEVTOOLS__: false, - }), - new VueLoaderPlugin(), - new CopyPlugin({ - patterns: [{from: '.', to: '../', context: 'public', globOptions: {ignore: ['**/*.md', '**/*.txt']}}], - }), - new ManifestVersionSyncPlugin({ - packagePath: path.join(__dirname, '..', 'package.json'), - manifestPath: '../manifest.json', - }), - ], -} diff --git a/webpack/webpack.dev.js b/webpack/webpack.dev.js deleted file mode 100644 index 78e80546..00000000 --- a/webpack/webpack.dev.js +++ /dev/null @@ -1,10 +0,0 @@ -const { merge } = require('webpack-merge') -const common = require('./webpack.common.js') - -module.exports = merge(common, { - devtool: 'inline-source-map', - mode: 'development', - optimization: { - minimize: false, - } -}) diff --git a/webpack/webpack.prod.js b/webpack/webpack.prod.js deleted file mode 100644 index 5fdbbd0d..00000000 --- a/webpack/webpack.prod.js +++ /dev/null @@ -1,40 +0,0 @@ -const { merge } = require('webpack-merge') -const common = require('./webpack.common.js') -const FileManagerPlugin = require('filemanager-webpack-plugin') -const path = require('path') - -module.exports = merge(common, { - mode: 'production', - optimization: { - minimize: true, - }, - plugins: [ - new FileManagerPlugin({ - events: { - onEnd: { - archive: [ - { - source: path.join(__dirname, '..', 'dist'), - destination: path.join(__dirname, '..', 'dist.zip') - }, - // { - // source: path.join(__dirname, '..', 'dist'), - // destination: path.join(__dirname, '..', 'dist.tar.gz'), - // format: 'tar', - // options: { - // // see https://www.archiverjs.com/docs/archiver - // gzip: true, - // gzipOptions: { - // level: 7, - // }, - // globOptions: { - // dot: true, // https://github.com/Yqnn/node-readdir-glob#options - // } - // }, - // }, - ], - }, - }, - }) - ], -}) diff --git a/website/cf-challenge-test/apple-touch-icon.png b/website/cf-challenge-test/apple-touch-icon.png new file mode 100644 index 00000000..cf324fc7 Binary files /dev/null and b/website/cf-challenge-test/apple-touch-icon.png differ diff --git a/website/cf-challenge-test/favicon-16x16.png b/website/cf-challenge-test/favicon-16x16.png new file mode 100644 index 00000000..72195853 Binary files /dev/null and b/website/cf-challenge-test/favicon-16x16.png differ diff --git a/website/cf-challenge-test/favicon-32x32.png b/website/cf-challenge-test/favicon-32x32.png new file mode 100644 index 00000000..f8f4a5e6 Binary files /dev/null and b/website/cf-challenge-test/favicon-32x32.png differ diff --git a/website/cf-challenge-test/favicon.ico b/website/cf-challenge-test/favicon.ico new file mode 100644 index 00000000..6162b908 Binary files /dev/null and b/website/cf-challenge-test/favicon.ico differ diff --git a/website/cf-challenge-test/index.html b/website/cf-challenge-test/index.html new file mode 100644 index 00000000..e4cd5850 --- /dev/null +++ b/website/cf-challenge-test/index.html @@ -0,0 +1,124 @@ + + + + + + + + + + + CloudFlare challenge test page + + +
+

CloudFlare challenge test page

+

+ This page is used to test whether the CloudFlare challenge can be successfully passed. +

+

+ If you can see this text and the extension is enabled, it means that the challenge has been successfully completed. +

+

+ +

+
+
+ + + + + diff --git a/website/cf-challenge-test/robots.txt b/website/cf-challenge-test/robots.txt new file mode 100644 index 00000000..1f53798b --- /dev/null +++ b/website/cf-challenge-test/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/website/cf-challenge-test/safari-pinned-tab.svg b/website/cf-challenge-test/safari-pinned-tab.svg new file mode 100644 index 00000000..1f79ec69 --- /dev/null +++ b/website/cf-challenge-test/safari-pinned-tab.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/website/index/apple-touch-icon.png b/website/index/apple-touch-icon.png new file mode 100644 index 00000000..9bf6a7f1 Binary files /dev/null and b/website/index/apple-touch-icon.png differ diff --git a/website/index/assets/browsers/chrome.svg b/website/index/assets/browsers/chrome.svg new file mode 100644 index 00000000..0d396123 --- /dev/null +++ b/website/index/assets/browsers/chrome.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/website/index/assets/browsers/edge.svg b/website/index/assets/browsers/edge.svg new file mode 100644 index 00000000..8a02962d --- /dev/null +++ b/website/index/assets/browsers/edge.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/website/index/assets/browsers/firefox.svg b/website/index/assets/browsers/firefox.svg new file mode 100644 index 00000000..2e20b397 --- /dev/null +++ b/website/index/assets/browsers/firefox.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/index/assets/browsers/opera.svg b/website/index/assets/browsers/opera.svg new file mode 100644 index 00000000..8fe6b3a0 --- /dev/null +++ b/website/index/assets/browsers/opera.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/website/index/assets/browsers/safari.svg b/website/index/assets/browsers/safari.svg new file mode 100644 index 00000000..a4e3c0f4 --- /dev/null +++ b/website/index/assets/browsers/safari.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/website/index/assets/logo.svg b/website/index/assets/logo.svg new file mode 100644 index 00000000..8426f4fe --- /dev/null +++ b/website/index/assets/logo.svg @@ -0,0 +1,22 @@ + + + + + + + diff --git a/website/index/assets/og-card.png b/website/index/assets/og-card.png new file mode 100644 index 00000000..cfcd7029 Binary files /dev/null and b/website/index/assets/og-card.png differ diff --git a/website/index/browserconfig.xml b/website/index/browserconfig.xml new file mode 100644 index 00000000..74bb89ac --- /dev/null +++ b/website/index/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/website/index/favicon-16x16.png b/website/index/favicon-16x16.png new file mode 100644 index 00000000..50a3a560 Binary files /dev/null and b/website/index/favicon-16x16.png differ diff --git a/website/index/favicon-32x32.png b/website/index/favicon-32x32.png new file mode 100644 index 00000000..915c22c2 Binary files /dev/null and b/website/index/favicon-32x32.png differ diff --git a/website/index/favicon.ico b/website/index/favicon.ico new file mode 100644 index 00000000..53c4c7a1 Binary files /dev/null and b/website/index/favicon.ico differ diff --git a/website/index/index.html b/website/index/index.html new file mode 100644 index 00000000..a86de5a5 --- /dev/null +++ b/website/index/index.html @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + Random User-Agent and Switcher (browser extension) + + + + + + + + + + + + + + + +
+
+
+

Random User-Agent and switcher

+

Boost your privacy in one click

+ +
+ +
+ + +
+
+ +
+ + + diff --git a/website/index/mstile-150x150.png b/website/index/mstile-150x150.png new file mode 100644 index 00000000..cfe44c45 Binary files /dev/null and b/website/index/mstile-150x150.png differ diff --git a/website/index/site.webmanifest b/website/index/site.webmanifest new file mode 100644 index 00000000..17ddafb8 --- /dev/null +++ b/website/index/site.webmanifest @@ -0,0 +1,7 @@ +{ + "name": "", + "short_name": "", + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/website/sandbox/apple-touch-icon.png b/website/sandbox/apple-touch-icon.png new file mode 100644 index 00000000..9bf6a7f1 Binary files /dev/null and b/website/sandbox/apple-touch-icon.png differ diff --git a/website/sandbox/favicon-16x16.png b/website/sandbox/favicon-16x16.png new file mode 100644 index 00000000..50a3a560 Binary files /dev/null and b/website/sandbox/favicon-16x16.png differ diff --git a/website/sandbox/favicon-32x32.png b/website/sandbox/favicon-32x32.png new file mode 100644 index 00000000..915c22c2 Binary files /dev/null and b/website/sandbox/favicon-32x32.png differ diff --git a/website/sandbox/favicon.ico b/website/sandbox/favicon.ico new file mode 100644 index 00000000..53c4c7a1 Binary files /dev/null and b/website/sandbox/favicon.ico differ diff --git a/website/sandbox/index.html b/website/sandbox/index.html new file mode 100644 index 00000000..e62d2390 --- /dev/null +++ b/website/sandbox/index.html @@ -0,0 +1,550 @@ + + + + + + + + + + + + + User-agent test + + +
+ +
+

+ This test checks the user-agent and its data every 5 milliseconds using JavaScript and displays it in a table + below. +

+

+ If you see more than one item in the list, it indicates that the user-agent data has changed during the page + load. Sometimes, you may need to refresh the page multiple times to see the changes. If you see + only one item, it means that the user-agent data has not changed once the page is loaded + (ensure it's spoofed if the extension is enabled). +

+

+ Items marked with ๐Ÿ—‘๏ธ are deprecated, ๐Ÿงช denotes experimental features, and (!๐ŸฆŠ !๐Ÿงญ) indicates features + not supported in Firefox and Safari (unless marked with ๐ŸฆŠ, which means supported + only in Firefox at the time this test was created). +

+
+
    +
  • Waiting for the first check...
  • +
+
+ + + + + + diff --git a/website/sandbox/robots.txt b/website/sandbox/robots.txt new file mode 100644 index 00000000..e69de29b diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 27c12d2f..00000000 --- a/yarn.lock +++ /dev/null @@ -1,4294 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" - integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/compat-data@^7.16.4": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" - integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== - -"@babel/core@^7.1.0", "@babel/core@^7.7.2": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" - integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== - dependencies: - "@babel/code-frame" "^7.15.8" - "@babel/generator" "^7.15.8" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.8" - "@babel/helpers" "^7.15.4" - "@babel/parser" "^7.15.8" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/core@^7.12.3", "@babel/core@^7.8.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" - integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.7" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.15.8", "@babel/generator@^7.7.2": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" - integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== - dependencies: - "@babel/types" "^7.15.6" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.16.7": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== - dependencies: - "@babel/types" "^7.16.8" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" - integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== - dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" - -"@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== - dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helpers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" - integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" - integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" - integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== - -"@babel/parser@^7.14.7", "@babel/parser@^7.16.7": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.8.tgz#61c243a3875f7d0b0962b0543a33ece6ff2f1f17" - integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/parser@^7.24.4": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/template@^7.15.4", "@babel/template@^7.3.3": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.15.4", "@babel/traverse@^7.16.7", "@babel/traverse@^7.7.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@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.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@babel/types@^7.16.7", "@babel/types@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" - integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" - integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz#1c1c9a91419f804e59ae8df316a07dd1c3a76b94" - integrity sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/archiver@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.1.tgz#02991e940a03dd1a32678fead4b4ca03d0e387ca" - integrity sha512-wKYZaSXaDvTZuInAWjCeGG7BEAgTWG2zZW0/f7IYFcoHB2X2d9lkVFnrOlXl3W6NrvO6Ml3FLLu8Uksyymcpnw== - dependencies: - "@types/glob" "*" - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.16" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" - integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/chrome@^0.0.267": - version "0.0.267" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.267.tgz#eefb7d2085993437d8109eb495431dfc0e3dbda1" - integrity sha512-vnCWPpYjazSPRMNmybRH+0q4f738F+Pbbls4ZPFsPr9/4TTNJyK1OLZDpSnghnEWb4stfmIUtq/GegnlfD4sPA== - dependencies: - "@types/filesystem" "*" - "@types/har-format" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "7.28.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.1.tgz#50b07747f1f84c2ba8cd394cf0fe0ba07afce320" - integrity sha512-XhZKznR3i/W5dXqUhgU9fFdJekufbeBd5DALmkuXoeFcjbQcPk+2cL+WLHf6Q81HWAnM2vrslIHpGVyCAviRwg== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/filesystem@*": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf" - integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== - dependencies: - "@types/filewriter" "*" - -"@types/filewriter@*": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee" - integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== - -"@types/glob@*": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" - integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/har-format@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.7.tgz#debfe36378f26c4fc2abca1df99f00a8ff94fd29" - integrity sha512-/TPzUG0tJn5x1TUcVLlDx2LqbE58hyOzDVAc9kf8SpOEmguHjU6bKUyfqb211AdqLOmU/SNyXvLKPNP5qTlfRw== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^27.4.1": - version "27.4.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" - integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== - dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" - -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/node@*": - version "16.11.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.0.tgz#4b95f2327bacd1ef8f08d8ceda193039c5d7f52e" - integrity sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg== - -"@types/prettier@^2.1.5": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.1.tgz#e1303048d5389563e130f5bdd89d37a99acb75eb" - integrity sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/ua-parser-js@^0.7.39": - version "0.7.39" - resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz#832c58e460c9435e4e34bb866e85e9146e12cdbb" - integrity sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg== - -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== - -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - -"@vue/compiler-core@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.26.tgz#d507886520e83a6f8339ed55ed0b2b5d84b44b73" - integrity sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ== - dependencies: - "@babel/parser" "^7.24.4" - "@vue/shared" "3.4.26" - entities "^4.5.0" - estree-walker "^2.0.2" - source-map-js "^1.2.0" - -"@vue/compiler-dom@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.26.tgz#acc7b788b48152d087d4bb9e655b795e3dbec554" - integrity sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA== - dependencies: - "@vue/compiler-core" "3.4.26" - "@vue/shared" "3.4.26" - -"@vue/compiler-sfc@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.26.tgz#c679f206829954c3c078d8a9be76d0098b8377ae" - integrity sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw== - dependencies: - "@babel/parser" "^7.24.4" - "@vue/compiler-core" "3.4.26" - "@vue/compiler-dom" "3.4.26" - "@vue/compiler-ssr" "3.4.26" - "@vue/shared" "3.4.26" - estree-walker "^2.0.2" - magic-string "^0.30.10" - postcss "^8.4.38" - source-map-js "^1.2.0" - -"@vue/compiler-ssr@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.26.tgz#22842d8adfff972d87bb798b8d496111f7f814b5" - integrity sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ== - dependencies: - "@vue/compiler-dom" "3.4.26" - "@vue/shared" "3.4.26" - -"@vue/devtools-api@^6.0.0-beta.11": - version "6.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.tgz#b5405c9a84fb44687d05e7c4c7854b1639141106" - integrity sha512-21u2jFOk8jbAneeGpDwZQ0W66RJa0IBDUyVl6SgKnn2cRFjLWzKj+ukXjpLhYr1KASyCe5E5U4jXwChVo0YUAw== - -"@vue/reactivity@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.26.tgz#1191f543809d4c93e5b3e842ba83022350a3f205" - integrity sha512-E/ynEAu/pw0yotJeLdvZEsp5Olmxt+9/WqzvKff0gE67tw73gmbx6tRkiagE/eH0UCubzSlGRebCbidB1CpqZQ== - dependencies: - "@vue/shared" "3.4.26" - -"@vue/runtime-core@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.26.tgz#51ee971cb700370a67e5a510c4a84eff7491d658" - integrity sha512-AFJDLpZvhT4ujUgZSIL9pdNcO23qVFh7zWCsNdGQBw8ecLNxOOnPcK9wTTIYCmBJnuPHpukOwo62a2PPivihqw== - dependencies: - "@vue/reactivity" "3.4.26" - "@vue/shared" "3.4.26" - -"@vue/runtime-dom@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.26.tgz#179aa7c8dc964112e6d096bc8ec5f361111009a1" - integrity sha512-UftYA2hUXR2UOZD/Fc3IndZuCOOJgFxJsWOxDkhfVcwLbsfh2CdXE2tG4jWxBZuDAs9J9PzRTUFt1PgydEtItw== - dependencies: - "@vue/runtime-core" "3.4.26" - "@vue/shared" "3.4.26" - csstype "^3.1.3" - -"@vue/server-renderer@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.26.tgz#6d0c6b0366bfe0232579aea00e3ff6784e5a1c60" - integrity sha512-xoGAqSjYDPGAeRWxeoYwqJFD/gw7mpgzOvSxEmjWaFO2rE6qpbD1PC172YRpvKhrihkyHJkNDADFXTfCyVGhKw== - dependencies: - "@vue/compiler-ssr" "3.4.26" - "@vue/shared" "3.4.26" - -"@vue/shared@3.4.26": - version "3.4.26" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.26.tgz#f17854fb1faf889854aed4b23b60e86a8cab6403" - integrity sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ== - -"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" - integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" - integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" - integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.12.1" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" - integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-opt" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - "@webassemblyjs/wast-printer" "1.12.1" - -"@webassemblyjs/wasm-gen@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" - integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" - integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@webassemblyjs/helper-buffer" "1.12.1" - "@webassemblyjs/wasm-gen" "1.12.1" - "@webassemblyjs/wasm-parser" "1.12.1" - -"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" - integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@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" - -"@webassemblyjs/wast-printer@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" - integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== - dependencies: - "@webassemblyjs/ast" "1.12.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" - integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== - -"@webpack-cli/info@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" - integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== - -"@webpack-cli/serve@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" - integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - 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" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" - integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -archiver-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" - integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== - dependencies: - glob "^7.1.4" - graceful-fs "^4.2.0" - lazystream "^1.0.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.union "^4.6.0" - normalize-path "^3.0.0" - readable-stream "^2.0.0" - -archiver@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6" - integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w== - dependencies: - archiver-utils "^2.1.0" - async "^3.2.3" - buffer-crc32 "^0.2.1" - readable-stream "^3.6.0" - readdir-glob "^1.0.0" - tar-stream "^2.2.0" - zip-stream "^4.1.0" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@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-top-level-await" "^7.8.3" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.21.10: - version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" - integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== - dependencies: - caniuse-lite "^1.0.30001580" - electron-to-chromium "^1.4.648" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-lite@^1.0.30001580: - version "1.0.30001582" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001582.tgz#db3070547ce0b48d9f44a509b86c4a02ba5d9055" - integrity sha512-vsJG3V5vgfduaQGVxL53uSX/HUzxyr2eA8xCo36OLal7sRcSZbibJtLeh0qja4sFOr/QQGt4opB4tOy+eOgAxg== - -chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - 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" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -"chokidar@>=3.0.0 <4.0.0": - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - 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" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== - dependencies: - buffer-crc32 "^0.2.13" - crc32-stream "^4.0.2" - normalize-path "^3.0.0" - readable-stream "^3.6.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" - 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" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" - -crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== - dependencies: - crc-32 "^1.2.0" - readable-stream "^3.4.0" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-loader@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.1.tgz#de4163c0cb765c03d7957eb9e0a49c7f354948c7" - integrity sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.33" - postcss-modules-extract-imports "^3.1.0" - postcss-modules-local-by-default "^4.0.5" - postcss-modules-scope "^3.2.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.5.4" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -del@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - 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" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -drange@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/drange/-/drange-1.1.1.tgz#b2aecec2aab82fcef11dbbd7b9e32b83f8f6c0b8" - integrity sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA== - -electron-to-chromium@^1.4.648: - version "1.4.653" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.653.tgz#832ab25e80ad698ac09c1ca547bd9ee6cce7df10" - integrity sha512-wA2A2LQCqnEwQAvwADQq3KpMpNwgAUBnRmrFgRzHnPhbQUFArTR32Ab46f4p0MovDLcg4uqd4nCsN2hTltslpA== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - 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" - -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.12: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - 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" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -filemanager-webpack-plugin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/filemanager-webpack-plugin/-/filemanager-webpack-plugin-8.0.0.tgz#d9a6683122504a9a47ac1fb8551f241dbb8d017d" - integrity sha512-TYwu62wgq2O2c3K80Sfj8vEys/tP5wdgYoySHgUwWoc2hPbQY3Mq3ahcAW634JvHCTcSV7IAfRxMI3wTXRt2Vw== - dependencies: - "@types/archiver" "^5.3.1" - archiver "^5.3.1" - del "^6.1.1" - fast-glob "^3.2.12" - fs-extra "^10.1.0" - is-glob "^4.0.3" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.1.tgz#7c44a93869b0b7612e38f22ed532bfe37b25ea6f" - integrity sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-sum@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" - integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= - -hash-sum@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" - integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immutable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" - integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== - -import-local@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" - integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -istanbul-lib-coverage@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz#36786d4d82aad2ea5911007e255e2da6b5f80d86" - integrity sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g== - -istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" - integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-util@^27.0.0, jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-worker@^27.4.5, jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== - dependencies: - "@jest/core" "^27.5.1" - import-local "^3.0.2" - jest-cli "^27.5.1" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-minimizer-webpack-plugin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/json-minimizer-webpack-plugin/-/json-minimizer-webpack-plugin-4.0.0.tgz#35e9567db969e06ba291dcfad756acbbae3cdca2" - integrity sha512-PJaNiSeZlZStdyLtJo/QOOC7uHRW9qvc//7F8M0ZH1huPSvmX5kR2qrq2Tn1ODYLi128bTkKepqtgYmtEOkPzQ== - dependencies: - schema-utils "^4.0.0" - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@2.x, json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= - dependencies: - readable-stream "^2.0.5" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -loader-utils@^1.0.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.union@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" - integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= - -lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.30.10: - version "0.30.10" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.0, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.50.0: - version "1.50.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" - integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== - -mime-types@^2.1.12, mime-types@^2.1.27: - version "2.1.33" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" - integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== - dependencies: - mime-db "1.50.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - 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" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pirates@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" - integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -postcss-modules-extract-imports@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" - integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== - -postcss-modules-local-by-default@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" - integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" - integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.33: - version "8.4.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" - integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -pretty-format@^27.0.0, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randexp@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.5.3.tgz#f31c2de3148b30bdeb84b7c3f59b0ebb9fec3738" - integrity sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w== - dependencies: - drange "^1.0.2" - ret "^0.2.0" - -randombytes@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" - integrity sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew= - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomstring@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.3.0.tgz#1bf9d730066899e70aee3285573f84708278683d" - integrity sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg== - dependencies: - randombytes "2.0.3" - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -readable-stream@^2.0.0, readable-stream@^2.0.5: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdir-glob@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" - integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== - dependencies: - minimatch "^3.0.4" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -ret@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" - integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-loader@^14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-14.2.1.tgz#db9ad96b56dc1c1ea546101e76375d5b008fec70" - integrity sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ== - dependencies: - neo-async "^2.6.2" - -sass@^1.76.0: - version "1.76.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.76.0.tgz#fe15909500735ac154f0dc7386d656b62b03987d" - integrity sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3, source-map@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - 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" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar-stream@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - 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" - -terser@^5.26.0: - version "5.26.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" - 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" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -tmpl@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -ts-jest@^27.1.4: - version "27.1.4" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00" - integrity sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "20.x" - -ts-loader@^9.5.1: - version "9.5.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" - integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - source-map "^0.7.4" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.18.1.tgz#47e8d4e493cf7ed6c643bad698d5810d72cbdf79" - integrity sha512-qXhgeNsX15bM63h5aapNFcQid9jRF/l3ojDoDFmekDQEUufZ9U4ErVt6SjDxnHp48Ltrw616R8yNc3giJ3KvVQ== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -ua-parser-js@^1.0.37: - version "1.0.37" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" - integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -user-agent-data-types@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz#3bbd3662022c3fb9d0c2f7449b6cdd412a3f9e0d" - integrity sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -v8-to-istanbul@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" - integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -vue-loader@^17.4.2: - version "17.4.2" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-17.4.2.tgz#f87f0d8adfcbbe8623de9eba1979d41ba223c6da" - integrity sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w== - dependencies: - chalk "^4.1.0" - hash-sum "^2.0.0" - watchpack "^2.4.0" - -vue-style-loader@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" - integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== - dependencies: - hash-sum "^1.0.2" - loader-utils "^1.0.2" - -vue@^3.4.26: - version "3.4.26" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.26.tgz#936c97e37672c737705d7bdfa62c31af18742269" - integrity sha512-bUIq/p+VB+0xrJubaemrfhk1/FiW9iX+pDV+62I/XJ6EkspAO9/DXEjbDFoe8pIfOZBqfk45i9BMc41ptP/uRg== - dependencies: - "@vue/compiler-dom" "3.4.26" - "@vue/compiler-sfc" "3.4.26" - "@vue/runtime-dom" "3.4.26" - "@vue/server-renderer" "3.4.26" - "@vue/shared" "3.4.26" - -vuex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vuex/-/vuex-4.1.0.tgz#aa1b3ea5c7385812b074c86faeeec2217872e36c" - integrity sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ== - dependencies: - "@vue/devtools-api" "^6.0.0-beta.11" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -watchpack@^2.4.0, watchpack@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" - integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-cli@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" - integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.1.1" - "@webpack-cli/info" "^2.0.2" - "@webpack-cli/serve" "^2.0.5" - colorette "^2.0.14" - commander "^10.0.1" - cross-spawn "^7.0.3" - envinfo "^7.7.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^5.7.3" - -webpack-merge@^5.10.0, webpack-merge@^5.7.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.91.0: - version "5.91.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.5" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.21.10" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.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.11" - 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.10" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - 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" - -ws@^7.4.6: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@20.x, yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== - dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" - readable-stream "^3.6.0"