diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index dad6b582..00000000 --- a/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -# editorconfig.org - -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 57d00579..00000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -assets/js/index.js -assets/js/katex.js -assets/js/vendor -node_modules \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index c926994d..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "env": { - "browser": true, - "commonjs": true, - "es6": true, - "node": true - }, - "extends": "eslint:recommended", - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, - "rules": { - "no-console": 0, - "quotes": ["error", "single"], - "comma-dangle": [ - "error", - { - "arrays": "always-multiline", - "objects": "always-multiline", - "imports": "always-multiline", - "exports": "always-multiline", - "functions": "ignore" - } - ] - } -} \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index b15c6e6b..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: doks # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug-report---.md b/.github/ISSUE_TEMPLATE/bug-report---.md deleted file mode 100644 index 6a8b3a84..00000000 --- a/.github/ISSUE_TEMPLATE/bug-report---.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -name: "Bug report \U0001F41E" -about: Create a report to help us improve - ---- - -## Description - -Describe the issue that you're seeing. - -### Steps to reproduce - -Clear steps describing how to reproduce the issue. Please please please link to a demo project if possible, this makes your issue _much_ easier to diagnose (seriously). - -### Expected result - -What should happen? - -### Actual result - -What happened. - -### Environment - -Paste the information here as shown by `npm run check` diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index e3766187..00000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,4 +0,0 @@ -contact_links: - - name: Question 🙋 - url: https://github.com/h-enk/doks/discussions/categories/q-a - about: Ask your question in Doks Discussions \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request---.md b/.github/ISSUE_TEMPLATE/feature-request---.md deleted file mode 100644 index 74da274c..00000000 --- a/.github/ISSUE_TEMPLATE/feature-request---.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: "Feature request \U0001F680" -about: Suggest an idea for Doks - ---- - -## Summary - -Brief explanation of the feature. - -### Basic example - -Include a basic example or links here. - -### Motivation - -Why are we doing this? What use cases does it support? What is the expected outcome? diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 8abca405..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "npm" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "daily" diff --git a/.github/workflows/dco.yaml b/.github/workflows/dco.yaml deleted file mode 100644 index 531eaf55..00000000 --- a/.github/workflows/dco.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: DCO -on: - pull_request: -jobs: - check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.x - uses: actions/setup-python@v1 - with: - python-version: '3.x' - - name: Check DCO - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - pip3 install -U dco-check - dco-check -e "49699333+dependabot[bot]@users.noreply.github.com" diff --git a/.github/workflows/deploy-github.yml b/.github/workflows/deploy-github.yml deleted file mode 100644 index aca2b21c..00000000 --- a/.github/workflows/deploy-github.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: GitHub Pages - -on: - push: - branches: - - main - -jobs: - deploy: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - - - name: Install dependencies - run: npm install - -# - name: Check for linting errors -# run: npm test - - - name: Build production website - run: npm run build - - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./public diff --git a/.github/workflows/node.js-ci.yml b/.github/workflows/node.js-ci.yml deleted file mode 100644 index f692a7a5..00000000 --- a/.github/workflows/node.js-ci.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Cloud Hypervisor Website Test - -on: - push: - branches: main - pull_request: - branches: main - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Check out - uses: actions/checkout@v2 - - - name: Set up Node.js ${{ matrix.node }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node }} - - - name: Install dependencies - run: npm ci - -# - name: Run test script -# run: npm test - - - name: Build production website - run: npm run build diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 8f187f04..00000000 --- a/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -public -resources -# Local Netlify folder -.netlify -TODO \ No newline at end of file diff --git a/.markdownlint.json b/.markdownlint.json deleted file mode 100644 index a8b885d0..00000000 --- a/.markdownlint.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "comment": "Hyas rules", - - "default": true, - "line_length": false, - "no-inline-html": false, - "no-trailing-punctuation": false, - "no-duplicate-heading": false, - "no-bare-urls": false -} \ No newline at end of file diff --git a/.markdownlintignore b/.markdownlintignore deleted file mode 100644 index a0380d65..00000000 --- a/.markdownlintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -CHANGELOG.md -README.md \ No newline at end of file diff --git a/assets/fonts/.gitkeep b/.nojekyll similarity index 100% rename from assets/fonts/.gitkeep rename to .nojekyll diff --git a/.stylelintignore b/.stylelintignore deleted file mode 100644 index 3972095a..00000000 --- a/.stylelintignore +++ /dev/null @@ -1,3 +0,0 @@ -assets/scss/components/_syntax.scss -assets/scss/vendor -node_modules \ No newline at end of file diff --git a/.stylelintrc.json b/.stylelintrc.json deleted file mode 100644 index 1490802c..00000000 --- a/.stylelintrc.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "extends": "stylelint-config-standard", - "rules": { - "no-empty-source": null, - "string-quotes": "double", - "at-rule-no-unknown": [ - true, - { - "ignoreAtRules": [ - "extend", - "at-root", - "debug", - "warn", - "error", - "if", - "else", - "for", - "each", - "while", - "mixin", - "include", - "content", - "return", - "function", - "tailwind", - "apply", - "responsive", - "variants", - "screen" - ] - } - ] - } -} \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 00000000..ea49f859 --- /dev/null +++ b/404.html @@ -0,0 +1,5 @@ +404 Page not found - Cloud Hypervisor

Page not found :(

The page you are looking for doesn't exist or has been moved.

+ + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 084c3b31..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,409 +0,0 @@ -### Changelog - -All notable changes to this project will be documented in this file. Dates are displayed in UTC. - -Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - -#### [v0.3.5](https://github.com/h-enk/doks/compare/v0.3.4...v0.3.5) - -- feat: add versioning setup [`#478`](https://github.com/h-enk/doks/pull/478) -- feat: adjust latex svg image to dark theme [`#460`](https://github.com/h-enk/doks/pull/460) -- fix: edit-page multi-language support [`#459`](https://github.com/h-enk/doks/pull/459) -- feat: add docsRepoBranch config [`#458`](https://github.com/h-enk/doks/pull/458) -- feat: image max width [`#457`](https://github.com/h-enk/doks/pull/457) -- fix: docs url [`#456`](https://github.com/h-enk/doks/pull/456) -- chore(deps-dev): bump @babel/cli from 7.15.4 to 7.15.7 [`#463`](https://github.com/h-enk/doks/pull/463) -- feat: add multilingual support [`#454`](https://github.com/h-enk/doks/pull/454) -- deps: bump versions to latest [`94bacd3`](https://github.com/h-enk/doks/commit/94bacd3492e7b4d1e46aef13f86e5924ac645f4e) -- deps: bump @babel/cli from 7.15.4 to 7.15.7 [`130a13b`](https://github.com/h-enk/doks/commit/130a13bd9d3891d995e7373cc9a64fa527b4ce26) -- deps: bump versions to latest [`2503f5a`](https://github.com/h-enk/doks/commit/2503f5adf6d2650b82928a8770c2a1ccdc368a0c) - -#### [v0.3.4](https://github.com/h-enk/doks/compare/v0.3.3...v0.3.4) - -> 7 September 2021 - -- chore: update edit page default branch from master to main [`#426`](https://github.com/h-enk/doks/pull/426) -- Update index.js [`#417`](https://github.com/h-enk/doks/pull/417) -- Make id unique collapsible sidebar [`#378`](https://github.com/h-enk/doks/pull/378) -- deps: bump versions to latest [`8a98716`](https://github.com/h-enk/doks/commit/8a9871654e03b79082cfd9ebdf49a0a8ce7e21eb) -- deps: bump version to latest [`23d9dd7`](https://github.com/h-enk/doks/commit/23d9dd75c381b0440f4db717d63bea61baa0c584) -- deps: bump versions to latest [`700e566`](https://github.com/h-enk/doks/commit/700e56611d3a83f33e786f51a191728db7267248) - -#### [v0.3.3](https://github.com/h-enk/doks/compare/v0.3.2...v0.3.3) - -> 5 July 2021 - -- Add Mermaid support [`#369`](https://github.com/h-enk/doks/pull/369) -- Fix lint tests on Linux. [`#373`](https://github.com/h-enk/doks/pull/373) -- feat: add mermaid [`f1fa5c5`](https://github.com/h-enk/doks/commit/f1fa5c5936558ff0b62d8a150bf303629bf50840) -- content: remove temporary mermaid examples [`e4fc868`](https://github.com/h-enk/doks/commit/e4fc8681623685bf20f8e6568a69b5b6c4d81d16) -- fix: update package-lock.json [`3797685`](https://github.com/h-enk/doks/commit/379768538d584676d40c99432f8b49f20c2c0562) - -#### [v0.3.2](https://github.com/h-enk/doks/compare/v0.3.1...v0.3.2) - -> 5 July 2021 - -- feat: update netlify workflow [`692efd6`](https://github.com/h-enk/doks/commit/692efd66692173a651c4b91d2ff3bc5f584a8a31) - -#### [v0.3.1](https://github.com/h-enk/doks/compare/v0.3.0...v0.3.1) - -> 2 July 2021 - -- fix: update theme.toml [`a0d4a76`](https://github.com/h-enk/doks/commit/a0d4a76d2a8187eae70b394905889a37e14b7a47) -- fix: update permalinks setting [`4894d96`](https://github.com/h-enk/doks/commit/4894d96a69eb2c70b7059c90ee02594286b1122e) - -#### [v0.3.0](https://github.com/h-enk/doks/compare/v0.2.3...v0.3.0) - -> 25 June 2021 - -- ✨ Adds video shortcode [`#244`](https://github.com/h-enk/doks/pull/244) -- ✨ Adds collapsible sidebar as an option [`#243`](https://github.com/h-enk/doks/pull/243) -- 🐛 Fixes scrollbar in code blocks [`#231`](https://github.com/h-enk/doks/pull/231) -- fix: add crossorigin attribute to webmanifest link [`#306`](https://github.com/h-enk/doks/pull/306) -- ✨ Uses inline shortcode in alerts for large texts [`#235`](https://github.com/h-enk/doks/pull/235) -- Fix issue where page bundle images fail to load [`#238`](https://github.com/h-enk/doks/pull/238) -- Replace highlightBlock with highlightElement [`#240`](https://github.com/h-enk/doks/pull/240) -- replaces possible backslash for win environments [`#217`](https://github.com/h-enk/doks/pull/217) -- feat: add hugo-installer + auto-changelog [`93f7598`](https://github.com/h-enk/doks/commit/93f7598f872509805287b24d7d06fa3e6f745fbf) -- deps: bump versions to latest [`33ccb71`](https://github.com/h-enk/doks/commit/33ccb717cb4b2fe859e79df36597cfa01cad08a9) -- deps: bump versions to latest [`7b2bea1`](https://github.com/h-enk/doks/commit/7b2bea1bff290389b2a098d13100e1c4dfa3a4d5) - -#### [v0.2.3](https://github.com/h-enk/doks/compare/v0.2.2...v0.2.3) - -> 2 April 2021 - -- feat: update for netlify dev support [`10d0b45`](https://github.com/h-enk/doks/commit/10d0b45203003a43727521dc9f5c35e655500309) -- content: update for doks v0.2.3 [`b505b24`](https://github.com/h-enk/doks/commit/b505b2412bc59fa271f7bf33ca6c835f66ca2936) -- content: update readme [`52cd0c6`](https://github.com/h-enk/doks/commit/52cd0c6e6c902381c5775d5c719c5cdf1ff64111) - -#### [v0.2.2](https://github.com/h-enk/doks/compare/v0.2.1...v0.2.2) - -> 26 March 2021 - -- deps: bump bootstrap to 5.0.0-beta3 [`f76e68e`](https://github.com/h-enk/doks/commit/f76e68e832737c5fbc2421f164988767dddc5d99) -- feat: update default highlight style [`28a3b39`](https://github.com/h-enk/doks/commit/28a3b39fb9653db3f627cd55d610f28ed95860b3) -- chore(release): 0.2.2 [`c332b4d`](https://github.com/h-enk/doks/commit/c332b4d315431da4d94e98f0c2e6649fea0c8219) - -#### [v0.2.1](https://github.com/h-enk/doks/compare/v0.2.0...v0.2.1) - -> 18 March 2021 - -- chore(release): 0.2.1 [`41f9d0e`](https://github.com/h-enk/doks/commit/41f9d0ee49077b3440c119eaf6c5d955f56127f2) -- fix: update package.json for npm workflow [`83b2c0e`](https://github.com/h-enk/doks/commit/83b2c0e002e09aabc0f4b1e8fb30353151707d8b) -- Updating the README! [`d36a6cc`](https://github.com/h-enk/doks/commit/d36a6ccaa8a99aa022cca641eb4d4d6f126ef8a4) - -#### [v0.2.0](https://github.com/h-enk/doks/compare/v0.1.6...v0.2.0) - -> 18 March 2021 - -- Add katex math typesetting [`#181`](https://github.com/h-enk/doks/pull/181) -- Add highlight.js as an option [`#180`](https://github.com/h-enk/doks/pull/180) -- Add optional breadcrumb trail [`#166`](https://github.com/h-enk/doks/pull/166) -- Add table support in markdown [`#165`](https://github.com/h-enk/doks/pull/165) -- Update bootstrap to 5.0.0-beta2 [`#164`](https://github.com/h-enk/doks/pull/164) -- chore(release): 0.2.0 [`c80a5da`](https://github.com/h-enk/doks/commit/c80a5dab1dead3108011793a0777dc6d94a47d70) -- ux: improve contrast text searchbar dark mode [`57fee17`](https://github.com/h-enk/doks/commit/57fee179f8b8ee0c45d90456703230e1e7edeb84) -- Updating the README! [`884d44e`](https://github.com/h-enk/doks/commit/884d44e0f7e3187a6431b8bdf8501993a6f80ac8) - -#### [v0.1.6](https://github.com/h-enk/doks/compare/v0.1.5...v0.1.6) - -> 1 March 2021 - -- build(deps-dev): bump postcss from 8.2.4 to 8.2.6 [`#132`](https://github.com/h-enk/doks/pull/132) -- deps: bump versions to latest [`857906c`](https://github.com/h-enk/doks/commit/857906c69b2d9779abd158dd88c1057f84c8eb6f) -- chore(release): 0.1.6 [`a83f039`](https://github.com/h-enk/doks/commit/a83f0392638c0c8fb775187a4b251c106921cef9) -- scripts: add release:dry-run script [`686d0eb`](https://github.com/h-enk/doks/commit/686d0eb40da535c6907cf97c1d5c9353a1535b8c) - -#### [v0.1.5](https://github.com/h-enk/doks/compare/v0.1.4...v0.1.5) - -> 12 January 2021 - -- chore(release): 0.1.5 [`ff85a1d`](https://github.com/h-enk/doks/commit/ff85a1daecfff2aa21ddbc425c8d67b5e4cd6d9b) -- Updating the README! [`d50ed1e`](https://github.com/h-enk/doks/commit/d50ed1ec0f37d178e1aef133d280b91d5473cd14) -- feat: add hugo extended as a dependency [`258224c`](https://github.com/h-enk/doks/commit/258224c7880911c709f80e478cacf265fafbbb5c) - -#### [v0.1.4](https://github.com/h-enk/doks/compare/v0.1.3...v0.1.4) - -> 3 December 2020 - -- deps: bump versions to latest [`7ce56d0`](https://github.com/h-enk/doks/commit/7ce56d0a362c5099c0a6c50f6ad0f1c7ba969218) -- deps: bump versions to latest [`0377b0d`](https://github.com/h-enk/doks/commit/0377b0de75a3cc8027bd255961f6d0c184d82575) -- deps: bump versions [`c254be6`](https://github.com/h-enk/doks/commit/c254be61754071600665858d6a7d2e2fbc105af3) - -#### [v0.1.3](https://github.com/h-enk/doks/compare/v0.1.2...v0.1.3) - -> 17 November 2020 - -- chore(release): 0.1.3 [`abaaaef`](https://github.com/h-enk/doks/commit/abaaaef6d6056133737d285868e8f8c748b6cc46) -- deps: update doks version file [`d326669`](https://github.com/h-enk/doks/commit/d326669c1d170cd5a76df1faafea472f3132fdf5) -- deps: add doks version file [`f8dcfbe`](https://github.com/h-enk/doks/commit/f8dcfbeebfda5fef533b9b7bc2463fa0dfafd5fa) - -#### [v0.1.2](https://github.com/h-enk/doks/compare/v0.1.1...v0.1.2) - -> 17 November 2020 - -- deps: bump versions [`6ce5813`](https://github.com/h-enk/doks/commit/6ce5813543417f2328846a78b971201d7611781d) -- style: update fonts+ [`41d63a2`](https://github.com/h-enk/doks/commit/41d63a2528f574e3934d58fb30811ce9fb879798) -- chore(release): 0.1.2 [`646f0c8`](https://github.com/h-enk/doks/commit/646f0c87f0ee5a9a97d357753e86647519f3d1ed) - -#### [v0.1.1](https://github.com/h-enk/doks/compare/v0.1.0...v0.1.1) - -> 10 November 2020 - -- deps: reinstall [`6705f4b`](https://github.com/h-enk/doks/commit/6705f4bbc4da4cd967e7165ab3681137014633bb) -- docs: update content [`c4c83eb`](https://github.com/h-enk/doks/commit/c4c83eb9b68674553c6a7e988249a808d75250b4) -- docs: update reasons [`1cec423`](https://github.com/h-enk/doks/commit/1cec4237b395ff306b765d47b29b8410c2884921) - -#### v0.1.0 - -> 6 November 2020 - -- build(deps-dev): bump postcss from 8.1.4 to 8.1.6 [`#18`](https://github.com/h-enk/doks/pull/18) -- Bump lodash from 4.17.15 to 4.17.20 [`#8`](https://github.com/h-enk/doks/pull/8) -- [Security] Bump elliptic from 6.5.2 to 6.5.3 [`#6`](https://github.com/h-enk/doks/pull/6) -- [Security] Bump lazysizes from 5.2.0 to 5.2.1 [`#7`](https://github.com/h-enk/doks/pull/7) -- test: update ci [`d16a94d`](https://github.com/h-enk/doks/commit/d16a94db755deff04e56da96f4e84d339a094236) -- deps: bump postcss [`12411c3`](https://github.com/h-enk/doks/commit/12411c38a98fb362ff348e5c151fcb7813e8691e) -- Initial commit [`67f0a6e`](https://github.com/h-enk/doks/commit/67f0a6e623169a99a71c51c2434e14041c9211aa) - - - -### [0.2.3](https://github.com/h-enk/doks/compare/v0.2.2...v0.2.3) (2021-04-02) - - -### Features - -* update for netlify dev support ([10d0b45](https://github.com/h-enk/doks/commit/10d0b45203003a43727521dc9f5c35e655500309)) - - -### Bug Fixes - -* add class user added to img-simple shortcode ([bce8863](https://github.com/h-enk/doks/commit/bce8863269dd036146d5b6e447d67a23de70227d)) -* drop npm workflow ([977bbda](https://github.com/h-enk/doks/commit/977bbdad82e8e21599e1fcfc0d93fc4e448cf2af)) - - -### Dependencies - -* bump versions to latest ([171293a](https://github.com/h-enk/doks/commit/171293a692450d45348be2870434db2a01578de9)) - -### [0.2.2](https://github.com/h-enk/doks/compare/v0.2.1...v0.2.2) (2021-03-26) - - -### Features - -* update default highlight style ([28a3b39](https://github.com/h-enk/doks/commit/28a3b39fb9653db3f627cd55d610f28ed95860b3)) - - -### Dependencies - -* bump bootstrap to 5.0.0-beta3 ([f76e68e](https://github.com/h-enk/doks/commit/f76e68e832737c5fbc2421f164988767dddc5d99)) -* bump versions to latest ([843e8d4](https://github.com/h-enk/doks/commit/843e8d45252bc596f8422fbce6938b38976373f9)) - -### [0.2.1](https://github.com/h-enk/doks/compare/v0.2.0...v0.2.1) (2021-03-18) - - -### Bug Fixes - -* update package.json for npm workflow ([83b2c0e](https://github.com/h-enk/doks/commit/83b2c0e002e09aabc0f4b1e8fb30353151707d8b)) - -## [0.2.0](https://github.com/h-enk/doks/compare/v0.1.6...v0.2.0) (2021-03-18) - - -### Features - -* add doks default style + examples ([ad91b05](https://github.com/h-enk/doks/commit/ad91b0523e6e240c98710bfedfd31342cb2389dc)) -* add highlight.js as an option ([5180bd5](https://github.com/h-enk/doks/commit/5180bd53c6349372916907783fa9d0d3b22755af)) -* add katex math typesetting ([253b938](https://github.com/h-enk/doks/commit/253b938a2e303a06d07488c6eae79c74442e56d6)) -* add npm-package workflow ([e2ba008](https://github.com/h-enk/doks/commit/e2ba0086f780380fa171cfc2efaa1e868cfc5fc5)) -* add npm-package workflow ([be4b68c](https://github.com/h-enk/doks/commit/be4b68c3d85a04251a9cdcbf1e5a3639b9c53144)) -* add optional breadcrumb trail ([9c67aca](https://github.com/h-enk/doks/commit/9c67aca368f68ab916ff61caa36e0de69c43dec3)) -* add table support in markdown ([5ee11a8](https://github.com/h-enk/doks/commit/5ee11a80e274d5e71ff7a4809516101e7e7ea214)) -* added options lazySizes, clipBoard, instantPage, flexSearch, and darkMode ([5f03d61](https://github.com/h-enk/doks/commit/5f03d61e81aff6f8a0a194cb23bcf821c3476481)) -* added options lazySizes, clipBoard, instantPage, flexSearch, and darkMode ([5099c47](https://github.com/h-enk/doks/commit/5099c4773195aab0a39bd160330bc25f3173c3b0)) -* added options lazySizes, clipBoard, instantPage, flexSearch, and darkMode ([226f661](https://github.com/h-enk/doks/commit/226f661966ebb68f595541b31e6605d1c71efbdd)) -* preload key katex fonts ([6c4d45d](https://github.com/h-enk/doks/commit/6c4d45d248ee9b58745105d91259fc2dfb9540b3)) -* update bootstrap to 5.0.0-beta2 ([22afec7](https://github.com/h-enk/doks/commit/22afec709a1f11ef010d3436eca401cd4d5fd62f)) -* update netlify.toml for netlify-cli use ([9581fc4](https://github.com/h-enk/doks/commit/9581fc4c44d2fdfe6b6093365fdbf5dcd2b869a2)) -* update netlify.toml for netlify-cli use ([20bac2a](https://github.com/h-enk/doks/commit/20bac2a25bcdb3156120afd0d1b6543c0235f3c7)) - - -### Bug Fixes - -* linting error ([92798c9](https://github.com/h-enk/doks/commit/92798c92cd300bf1ed953c2a25bcbe0f8b24c1b2)) -* script loading + script order ([89784d9](https://github.com/h-enk/doks/commit/89784d9656712ce31d83c038a87821f78aa07a3c)) -* update content security header ([64efe3f](https://github.com/h-enk/doks/commit/64efe3ff00c5d315b43d40a4dc056ef7a3f88151)) -* update content security header ([e0996b3](https://github.com/h-enk/doks/commit/e0996b36cbdc439bf0ad6595342c0f965f31c119)) -* update content security header ([b54cae0](https://github.com/h-enk/doks/commit/b54cae0621211bce0754c17fdc302c96b6e50f6c)) -* update content security header ([6d38761](https://github.com/h-enk/doks/commit/6d387614d584607d07c3f944ee55b8a2d6a4ce4e)) -* update content security headers ([c70baa4](https://github.com/h-enk/doks/commit/c70baa448770d39d5c8f0842f742f5f8828a31ca)) -* update content security headers ([8df0fdd](https://github.com/h-enk/doks/commit/8df0fdd8c311752de685ed10f7e8ec1d5d22f69c)) -* update content security headers ([d1008a7](https://github.com/h-enk/doks/commit/d1008a736639e731679fd1e18eba4e6d437f00ad)) - - -### Dependencies - -* bump versions to latest ([e43f982](https://github.com/h-enk/doks/commit/e43f9821e49792e2e06f2e18ac419d58befc7723)) -* bump versions to latest ([9cdd693](https://github.com/h-enk/doks/commit/9cdd69352bb02c12a6174cea5d7d6b330e47f1b5)) - -### [0.1.6](https://github.com/h-enk/doks/compare/v0.1.5...v0.1.6) (2021-03-01) - - -### Features - -* add check commands ([85baab4](https://github.com/h-enk/doks/commit/85baab47ff06557051f373aa6afeb114fb40f50f)) -* match active class docs menu on identifier ([7384cfe](https://github.com/h-enk/doks/commit/7384cfe8f1652b8053f077c964633d4ad12cf281)) -* update package-lock.json ([8c73d74](https://github.com/h-enk/doks/commit/8c73d741fd789e829c35bf51cfc25c6d790b0dbb)) - - -### Bug Fixes - -* convert tabs to spaces ([6511531](https://github.com/h-enk/doks/commit/6511531c5e3f4ae1a9ad5e64972bd34c8e62cb0d)) -* remove extra space in else statement ([03637e5](https://github.com/h-enk/doks/commit/03637e547ef7afa1dcea853746634df3161656db)) -* update urls for deploy to github+ ([8c10161](https://github.com/h-enk/doks/commit/8c101613fa488518152675bb0916e74d444df1e2)) - - -### Documentation - -* update faq ([555fd17](https://github.com/h-enk/doks/commit/555fd17bb21d94764688f8f0c818d352183244b7)) -* update faq ([f751f3f](https://github.com/h-enk/doks/commit/f751f3ff02b736b36854e396b2536a9fef311c50)) -* update readme ([f32c60f](https://github.com/h-enk/doks/commit/f32c60f1ff6fe7f898efa7dc5ff97bd4b60148a6)) -* update requirement sections ([22a8bfb](https://github.com/h-enk/doks/commit/22a8bfbc87b20ae4d03b733b32f1e1f956e3671c)) -* update requirements sections ([3767e8b](https://github.com/h-enk/doks/commit/3767e8bfa0893d9bb827c35b5b2694c023e78ceb)) -* update requirements sections ([8e14777](https://github.com/h-enk/doks/commit/8e14777805500abbf7cbc840a4a19c7635ce5b96)) -* update requirements sections ([49f803e](https://github.com/h-enk/doks/commit/49f803e7e3d905d01ff00f5d02357defb885fe7e)) -* update requirements sections ([4791d5a](https://github.com/h-enk/doks/commit/4791d5a0ba464c57f74d3bd6736985830f0d9e71)) -* update requirements sections ([5321e8d](https://github.com/h-enk/doks/commit/5321e8d3c1094074c2503c3895579ebe32846176)) -* update requirements sections ([920776a](https://github.com/h-enk/doks/commit/920776a6d55167cd8ce40f2edfcc37f2841e3def)) -* update requirements sections ([3420ae9](https://github.com/h-enk/doks/commit/3420ae9c55dedd5424bf7f2f32a3cf1dacaf4e6f)) -* update showcase link ([3e00037](https://github.com/h-enk/doks/commit/3e00037d78b3e980bdbdf005a5c13d9a39d2fa3d)) - - -### Dependencies - -* bump autoprefixer, bootstrap, stylelint, and netlify-lambda to latest versions ([955cb46](https://github.com/h-enk/doks/commit/955cb46a5d4936ce355c28a4a2a8b5c025a8ca1c)) -* bump deps to latest ([05de29a](https://github.com/h-enk/doks/commit/05de29ace1e735840aea04f90924c2c833b00b86)) -* bump postcss-purgecss to 4.0.0 + eslint to 7.18.0 ([44e90f2](https://github.com/h-enk/doks/commit/44e90f2bc944693967c6e3864673d8f21ee07648)) -* bump versions to latest ([857906c](https://github.com/h-enk/doks/commit/857906c69b2d9779abd158dd88c1057f84c8eb6f)) -* bump versions to latest ([5e52acb](https://github.com/h-enk/doks/commit/5e52acbc35db30267867e1b0981c8f4299bdf51d)) -* bump versions to latest ([3087ae0](https://github.com/h-enk/doks/commit/3087ae0f521a780d38ccbd0afbb07e23fa9fad7d)) - -### [0.1.5](https://github.com/h-enk/doks/compare/v0.1.4...v0.1.5) (2021-01-12) - - -### Features - -* add hugo extended as a dependency ([258224c](https://github.com/h-enk/doks/commit/258224c7880911c709f80e478cacf265fafbbb5c)) -* add hugothemes reqs ([b3afb4b](https://github.com/h-enk/doks/commit/b3afb4b4055f5cfe5a28d355ac26f577fc442392)) -* remove exampleSite ([70db6bc](https://github.com/h-enk/doks/commit/70db6bca005c2e2f82e3ac64d9150c4d87889758)) - - -### Documentation - -* update code of conduct ([411123b](https://github.com/h-enk/doks/commit/411123b207cfe0715c31455f9e5cbcfd9a2d93cc)) -* update frontpage ([f2f4937](https://github.com/h-enk/doks/commit/f2f49370a1ecd7d312de1b348e08e26d0a327121)) -* update homepage ([4e65d01](https://github.com/h-enk/doks/commit/4e65d012c5887ff8db9650006d8c6f2303d1b338)) -* update readme ([7283eb9](https://github.com/h-enk/doks/commit/7283eb997da055892d95015f1411b8528f9b2298)) -* update readme ([9dc2f0e](https://github.com/h-enk/doks/commit/9dc2f0ebfe75f968f77290d911e3be035b34e954)) -* update readme ([3ed1ad6](https://github.com/h-enk/doks/commit/3ed1ad6376959a678ceac990310dd51d2f2864f8)) -* update readme ([6a35faf](https://github.com/h-enk/doks/commit/6a35fafe485d82f4a327b8b4ed10a703eac4af1b)) -* update readme ([40dd5e4](https://github.com/h-enk/doks/commit/40dd5e4eea340f2fae24484bb86325f4410378ff)) -* update readme ([7b75c47](https://github.com/h-enk/doks/commit/7b75c47c9e0e5953b781ce4f784a3083361970fb)) -* update readme ([2d33818](https://github.com/h-enk/doks/commit/2d3381885ab6578ed44720e8f99033429034ba2a)) -* update readme ([632623f](https://github.com/h-enk/doks/commit/632623f29401f38e0a853508346a94267372dfa1)) -* update readme for docs discussions ([fb9e340](https://github.com/h-enk/doks/commit/fb9e340f6e48293ed2d32a73754ae081f41a0fc9)) -* update showcase link ([74724eb](https://github.com/h-enk/doks/commit/74724eb4c53d15475492b2b7c103b3056260fd28)) - - -### Dependencies - -* bump to latest versions ([83f4163](https://github.com/h-enk/doks/commit/83f41636f71e547f4928597bdf67128fe954f83e)) -* bump to latest versions ([372d9cb](https://github.com/h-enk/doks/commit/372d9cb64d4d68b6e95b252112e27ff9123b456c)) -* bump versions to latest ([6184067](https://github.com/h-enk/doks/commit/6184067621a33cf0e53a4ae9fab269a91a11b730)) -* bump versions to latest ([940f30d](https://github.com/h-enk/doks/commit/940f30dcebfde1a4a8900118fdf84f57410ed63a)) -* bump versions to latest ([751d6c6](https://github.com/h-enk/doks/commit/751d6c68caa1811be92eaae378e16413f09eb12e)) -* bump versions to latest ([b66c0a6](https://github.com/h-enk/doks/commit/b66c0a6221cddbaf997c032222276185cc910d9d)) -* bump versions to latest ([1d7e3b8](https://github.com/h-enk/doks/commit/1d7e3b873b537e498ef4ef5ce5548b252a62c4bc)) -* bump versions to latest ([0aa2e0f](https://github.com/h-enk/doks/commit/0aa2e0f7e07e930ba507f8652e0d6375c562def7)) -* bump versions to latest ([ce5c733](https://github.com/h-enk/doks/commit/ce5c7336f95c3d6e6be4c7b3fb7db3812b7ac4ac)) -* bump versions to latest ([cc62487](https://github.com/h-enk/doks/commit/cc6248722a91f163359ce42e83f06e0ae5277ef7)) - -### [0.1.4](https://github.com/h-enk/doks/compare/v0.1.3...v0.1.4) (2020-12-03) - - -### Documentation - -* update content ([63ca41e](https://github.com/h-enk/doks/commit/63ca41e1076375eb99aad5ca6d77d95516b6f349)) - - -### Dependencies - -* bump versions ([c254be6](https://github.com/h-enk/doks/commit/c254be61754071600665858d6a7d2e2fbc105af3)) -* bump versions to latest ([831442c](https://github.com/h-enk/doks/commit/831442c1a6f3372b2930681ca9c937d123b5f6a3)) -* bump versions to latest ([0377b0d](https://github.com/h-enk/doks/commit/0377b0de75a3cc8027bd255961f6d0c184d82575)) -* bump versions to latest ([358bad6](https://github.com/h-enk/doks/commit/358bad680156937886f2957b6c6fcdbcdd97782e)) -* bump versions to latest ([7ce56d0](https://github.com/h-enk/doks/commit/7ce56d0a362c5099c0a6c50f6ad0f1c7ba969218)) - -### [0.1.3](https://github.com/h-enk/doks/compare/v0.1.2...v0.1.3) (2020-11-17) - - -### Dependencies - -* add doks version file ([f8dcfbe](https://github.com/h-enk/doks/commit/f8dcfbeebfda5fef533b9b7bc2463fa0dfafd5fa)) -* update doks version file ([d326669](https://github.com/h-enk/doks/commit/d326669c1d170cd5a76df1faafea472f3132fdf5)) - -### [0.1.2](https://github.com/h-enk/doks/compare/v0.1.1...v0.1.2) (2020-11-17) - - -### Dependencies - -* bump versions ([6ce5813](https://github.com/h-enk/doks/commit/6ce5813543417f2328846a78b971201d7611781d)) - -### [0.1.1](https://github.com/h-enk/doks/compare/v0.1.0...v0.1.1) (2020-11-10) - - -### Documentation - -* update content ([c4c83eb](https://github.com/h-enk/doks/commit/c4c83eb9b68674553c6a7e988249a808d75250b4)) -* update reasons ([1cec423](https://github.com/h-enk/doks/commit/1cec4237b395ff306b765d47b29b8410c2884921)) - - -### Dependencies - -* bump eslint ([d794dab](https://github.com/h-enk/doks/commit/d794dabbe389b0f616ccfca564607f9be4670e0c)) -* reinstall ([6705f4b](https://github.com/h-enk/doks/commit/6705f4bbc4da4cd967e7165ab3681137014633bb)) - -## 0.1.0 (2020-11-06) - - -### Features - -* add flexsearch ([97d8e2c](https://github.com/h-enk/doks/commit/97d8e2c0e2568f9f9f653dcc243d06aa25482e70)) -* add standard-version ([6d83ec3](https://github.com/h-enk/doks/commit/6d83ec308e0a9c4db5aa8d2f2c8309ad09673605)) -* update static assets ([1b16e6b](https://github.com/h-enk/doks/commit/1b16e6bb3d87888b51eff2a8ce7d482cc1a5daf6)) - - -### Bug Fixes - -* update badges ([90cea78](https://github.com/h-enk/doks/commit/90cea786c1aec4cc7004fdf9571ad05a739aa96c)) -* update file path ([73004c3](https://github.com/h-enk/doks/commit/73004c3f8eaee87957ab53bb1f27716acde7a361)) - - -### Documentation - -* update ci badge ([7c4373a](https://github.com/h-enk/doks/commit/7c4373a3a9a29f35f858f27ad4b67ad0379a3da0)) -* update content ([c6ea4f3](https://github.com/h-enk/doks/commit/c6ea4f3ae54e1c7b890dffb2243c0a81eb96b295)) -* update content ([c8c403d](https://github.com/h-enk/doks/commit/c8c403dbf9963eeef3c7dca7f6334929bbc5383b)) -* update gist id ([81d7b1a](https://github.com/h-enk/doks/commit/81d7b1a5df91f238378723018a84d0dd4cd12dd5)) -* update README ([a1d2e80](https://github.com/h-enk/doks/commit/a1d2e8091a0a2051fdbb3384ad797d8cd5251ce6)) -* update README ([a9aa6ab](https://github.com/h-enk/doks/commit/a9aa6ab1af1ef5c8619dd3d7c64d96d5a21d956c)) -* update README ([d0bcf8d](https://github.com/h-enk/doks/commit/d0bcf8d69dfd2d28d9f603945efc37a64b8b529b)) -* update README ([f6dcccc](https://github.com/h-enk/doks/commit/f6dcccc458a1a4c5cac655976a665fb66b1f7b7a)) -* update README ([eb4e714](https://github.com/h-enk/doks/commit/eb4e714f4f1fd97117a9fc155df6b6e4be55c0ed)) - - -### Dependencies - -* bump postcss ([12411c3](https://github.com/h-enk/doks/commit/12411c38a98fb362ff348e5c151fcb7813e8691e)) -* bump postcss-cli ([88b49b5](https://github.com/h-enk/doks/commit/88b49b552849ab807f17ff9bfacfc847d9c2dbd2)) -* bump versions ([53cf8ba](https://github.com/h-enk/doks/commit/53cf8ba6e260687c4fc5eea0774a7d0e6aa559f8)) -* update for dependabot PR's ([bad7deb](https://github.com/h-enk/doks/commit/bad7debffa8d8e6b442edf6e51f07f915fdfdd83)) diff --git a/static/CNAME b/CNAME similarity index 100% rename from static/CNAME rename to CNAME diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 77366b2e..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,76 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as -contributors and maintainers pledge to making participation in our project and -our community a harassment-free experience for everyone, regardless of age, body -size, disability, ethnicity, sex characteristics, gender identity and expression, -level of experience, education, socio-economic status, nationality, personal -appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or - advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic - address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable -behavior and are expected to take appropriate and fair corrective action in -response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or -reject comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct, or to ban temporarily or -permanently any contributor for other behaviors that they deem inappropriate, -threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. Examples of -representing a project or community include using an official project e-mail -address, posting via an official social media account, or acting as an appointed -representative at an online or offline event. Representation of a project may be -further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at hello@getdoks.org. All -complaints will be reviewed and investigated and will result in a response that -is deemed necessary and appropriate to the circumstances. The project team is -obligated to maintain confidentiality with regard to the reporter of an incident. -Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, -available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq diff --git a/LICENSE b/LICENSE deleted file mode 100644 index a9431aad..00000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2018-present, Gridsome -Copyright (c) 2020-present, Henk Verlinde - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index a7034517..00000000 --- a/README.md +++ /dev/null @@ -1,142 +0,0 @@ -

- - Doks - -

- -

- Doks -

- -

- Modern Documentation Theme -

- -

- Doks is a Hugo theme for building secure, fast, and SEO-ready documentation websites, which you can easily update and customize. -

- -

- - GitHub - - - GitHub release (latest SemVer including pre-releases) - - - npm (scoped) - - - GitHub Workflow Status (branch) - - - Netlify - -

- -![Doks — Modern Documentation Theme](https://raw.githubusercontent.com/h-enk/doks/master/images/tn.png) - -## Demo - -- [doks.netlify.app](https://doks.netlify.app/) - -## Why Doks? - -Nine main reasons why you should use Doks: - -1. __Security aware__. Get A+ scores on [Mozilla Observatory](https://observatory.mozilla.org/analyze/doks.netlify.app) out of the box. Easily change the default Security Headers to suit your needs. - -2. __Fast by default__. Get 100 scores on [Google Lighthouse](https://googlechrome.github.io/lighthouse/viewer/?gist=7731347bb8ce999eff7428a8e763b637) by default. Doks removes unused css, prefetches links, and lazy loads images. - -3. __SEO-ready__. Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking. - -4. __Development tools__. Code with confidence. Check styles, scripts, and markdown for errors and fix automatically or manually. - -5. __Bootstrap framework__. Build robust, flexible, and intuitive websites with Bootstrap 5. Easily customize your Doks site with the source Sass files. - -6. __Netlify-ready__. Deploy to Netlify with sensible defaults. Easily use Netlify Functions, Netlify Redirects, and Netlify Headers. - -7. __Full text search__. Search your Doks site with FlexSearch. Easily customize index settings and search options to your liking. - -8. __Page layouts__. Build pages with a landing page, blog, or documentation layout. Add custom sections and components to suit your needs. - -9. __Dark mode__. Switch to a low-light UI with the click of a button. Change colors with variables to match your branding. - -### Other features - -- __Multilingual and i18n__ support -- __Versioning__ documentation support -- __KaTeX__ math typesetting -- __Mermaid__ diagrams and visualization -- __highlight.js__ syntax highlighting - -## Requirements - -Doks uses npm to centralize dependency management, making it [easy to update](https://getdoks.org/docs/help/how-to-update/) resources, build tooling, plugins, and build scripts: - -- Download and install [Node.js](https://nodejs.org/) (it includes npm) for your platform. - -## Get started - -Start a new Doks project in three steps: - -### 1. Create a new site - -Doks is available as a child theme, and a starter theme: - -- Use the Doks child theme, if you do __not__ plan to customize a lot, and/or need future Doks updates. -- Use the Doks starter theme, if you plan to customize a lot, and/or do __not__ need future Doks updates. - -Not quite sure? Use the Doks child theme. - -#### Doks child theme - -```bash -git clone https://github.com/h-enk/doks-child-theme.git my-doks-site && cd my-doks-site -``` - -#### Doks starter theme - -```bash -git clone https://github.com/h-enk/doks.git my-doks-site && cd my-doks-site -``` - -### 2. Install dependencies - -```bash -npm install -``` - -### 3. Start development server - -```bash -npm run start -``` - -## Other commands - -Doks comes with [commands](https://getdoks.org/docs/prologue/commands/) for common tasks. - -## Documentation - -- [Netlify](https://docs.netlify.com/) -- [Hugo](https://gohugo.io/documentation/) -- [Doks](https://getdoks.org/) - -## Communities - -- [Netlify Community](https://community.netlify.com/) -- [Hugo Forums](https://discourse.gohugo.io/) -- [Doks Discussions](https://github.com/h-enk/doks/discussions) - -## Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. - -[![OC sponsor 0](https://opencollective.com/doks/sponsor/0/avatar.svg)](https://opencollective.com/doks/sponsor/0/website) - -## Backers - -Support this project by becoming a backer. Your avatar will show up here. - -[![Backers](https://opencollective.com/doks/backers.svg)](https://opencollective.com/doks) diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 4ad3369f..00000000 --- a/SECURITY.md +++ /dev/null @@ -1,7 +0,0 @@ -# Reporting Security Issues - -The Doks team and community take security issues in Doks seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. - -To report a security issue, email [security@getdoks.org](mailto:security@getdoks.org) and include the word "SECURITY" in the subject line. - -We'll endeavor to respond quickly, and will keep you updated throughout the process. diff --git a/layouts/index.headers b/_headers similarity index 100% rename from layouts/index.headers rename to _headers diff --git a/layouts/index.redirects b/_redirects similarity index 79% rename from layouts/index.redirects rename to _redirects index 5d7d6d27..7c08d980 100644 --- a/layouts/index.redirects +++ b/_redirects @@ -1,9 +1,3 @@ -{{- range $p := .Site.Pages -}} -{{- range .Aliases }} -{{ . }} {{ $p.RelPermalink -}} -{{- end }} -{{- end -}} - # /docs/1.0/prologue/ /docs/1.0/prologue/introduction/ # /docs/1.0/help/ /docs/1.0/help/how-to-update/ # /docs/1.0/ /docs/1.0/prologue/introduction/ diff --git a/static/android-chrome-192x192.png b/android-chrome-192x192.png similarity index 100% rename from static/android-chrome-192x192.png rename to android-chrome-192x192.png diff --git a/static/android-chrome-512x512.png b/android-chrome-512x512.png similarity index 100% rename from static/android-chrome-512x512.png rename to android-chrome-512x512.png diff --git a/static/apple-touch-icon.png b/apple-touch-icon.png similarity index 100% rename from static/apple-touch-icon.png rename to apple-touch-icon.png diff --git a/archetypes/blog.md b/archetypes/blog.md deleted file mode 100644 index 78733514..00000000 --- a/archetypes/blog.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -description: "" -lead: "" -date: {{ .Date }} -lastmod: {{ .Date }} -draft: true -weight: 50 -images: ["{{ .Name | urlize }}.jpg"] -contributors: [] ---- - -{{< img src="{{ .Name | urlize }}.jpg" alt="{{ replace .Name "-" " " | title }}" caption="{{ replace .Name "-" " " | title }}" class="wide" >}} diff --git a/archetypes/default.md b/archetypes/default.md deleted file mode 100644 index d8210df1..00000000 --- a/archetypes/default.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -description: "" -date: {{ .Date }} -lastmod: {{ .Date }} -draft: true -images: [] ---- diff --git a/archetypes/docs.md b/archetypes/docs.md deleted file mode 100644 index bb609d26..00000000 --- a/archetypes/docs.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -description: "" -lead: "" -date: {{ .Date }} -lastmod: {{ .Date }} -draft: true -images: [] -menu: - docs: - parent: "" -weight: 999 -toc: true ---- - -{{< img src="{{ .Name | urlize }}.jpg" alt="{{ replace .Name "-" " " | title }}" caption="{{ replace .Name "-" " " | title }}" >}} diff --git a/assets/js/alert.js b/assets/js/alert.js deleted file mode 100644 index 0fb28647..00000000 --- a/assets/js/alert.js +++ /dev/null @@ -1,17 +0,0 @@ -var announcement = document.getElementById('announcement'); - -if (announcement !== null) { - - if (localStorage.getItem('announcement') === null ) { - - announcement.classList.remove('d-none'); - - } - - announcement.addEventListener('closed.bs.alert', () => { - - localStorage.setItem('announcement', 'closed'); - - }); - -} diff --git a/assets/js/app.js b/assets/js/app.js deleted file mode 100644 index e69de29b..00000000 diff --git a/assets/js/bootstrap.js b/assets/js/bootstrap.js deleted file mode 100644 index 8d6da8d9..00000000 --- a/assets/js/bootstrap.js +++ /dev/null @@ -1,2 +0,0 @@ -import 'bootstrap/dist/js/bootstrap.bundle.min.js' -// import 'bootstrap/dist/js/bootstrap.min.js' diff --git a/assets/js/clipboard.js b/assets/js/clipboard.js deleted file mode 100644 index 55eec7b3..00000000 --- a/assets/js/clipboard.js +++ /dev/null @@ -1,37 +0,0 @@ -import Clipboard from 'clipboard'; - -var pre = document.getElementsByTagName('pre'); - -for (var i = 0; i < pre.length; ++ i) -{ - var element = pre[i]; - var mermaid = element.getElementsByClassName('language-mermaid')[0]; - - if (mermaid == null) { - element.insertAdjacentHTML('afterbegin', ''); - } -} - -var clipboard = new Clipboard('.btn-copy', { - - target: function(trigger) { - return trigger.nextElementSibling; - }, - -}); - -clipboard.on('success', function(e) { - - /* - console.info('Action:', e.action); - console.info('Text:', e.text); - console.info('Trigger:', e.trigger); - */ - - e.clearSelection(); -}); - -clipboard.on('error', function(e) { - console.error('Action:', e.action); - console.error('Trigger:', e.trigger); -}); diff --git a/assets/js/darkmode-init.js b/assets/js/darkmode-init.js deleted file mode 100644 index 0f3508de..00000000 --- a/assets/js/darkmode-init.js +++ /dev/null @@ -1,21 +0,0 @@ -const globalDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; -const localMode = localStorage.getItem('theme'); - -if (globalDark && (localMode === null)) { - - localStorage.setItem('theme', 'dark'); - document.documentElement.setAttribute('data-dark-mode', ''); - -} - -if (globalDark && (localMode === 'dark')) { - - document.documentElement.setAttribute('data-dark-mode', ''); - -} - -if (localMode === 'dark') { - - document.documentElement.setAttribute('data-dark-mode', ''); - -} diff --git a/assets/js/darkmode.js b/assets/js/darkmode.js deleted file mode 100644 index e81db47d..00000000 --- a/assets/js/darkmode.js +++ /dev/null @@ -1,38 +0,0 @@ -const mode = document.getElementById('mode'); - -if (mode !== null) { - - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { - - if (event.matches) { - - localStorage.setItem('theme', 'dark'); - document.documentElement.setAttribute('data-dark-mode', ''); - - } else { - - localStorage.setItem('theme', 'light'); - document.documentElement.removeAttribute('data-dark-mode'); - - } - - }) - - mode.addEventListener('click', () => { - - document.documentElement.toggleAttribute('data-dark-mode'); - localStorage.setItem('theme', document.documentElement.hasAttribute('data-dark-mode') ? 'dark' : 'light'); - - }); - - if (localStorage.getItem('theme') === 'dark') { - - document.documentElement.setAttribute('data-dark-mode', ''); - - } else { - - document.documentElement.removeAttribute('data-dark-mode'); - - } - -} diff --git a/assets/js/highlight.js b/assets/js/highlight.js deleted file mode 100644 index c96b781d..00000000 --- a/assets/js/highlight.js +++ /dev/null @@ -1,24 +0,0 @@ -import hljs from 'highlight.js/lib/core'; - -import javascript from 'highlight.js/lib/languages/javascript'; -import json from 'highlight.js/lib/languages/json'; -import bash from 'highlight.js/lib/languages/bash'; -import xml from 'highlight.js/lib/languages/xml'; -import ini from 'highlight.js/lib/languages/ini'; -import yaml from 'highlight.js/lib/languages/yaml'; -import markdown from 'highlight.js/lib/languages/markdown'; - -hljs.registerLanguage('javascript', javascript); -hljs.registerLanguage('json', json); -hljs.registerLanguage('bash', bash); -hljs.registerLanguage('html', xml); -hljs.registerLanguage('ini', ini); -hljs.registerLanguage('toml', ini); -hljs.registerLanguage('yaml', yaml); -hljs.registerLanguage('md', markdown); - -document.addEventListener('DOMContentLoaded', () => { - document.querySelectorAll('pre code:not(.language-mermaid)').forEach((block) => { - hljs.highlightElement(block); - }); -}); diff --git a/assets/js/index.js b/assets/js/index.js deleted file mode 100644 index b99ab905..00000000 --- a/assets/js/index.js +++ /dev/null @@ -1,169 +0,0 @@ -var suggestions = document.getElementById('suggestions'); -var search = document.getElementById('search'); - -if (search !== null) { - document.addEventListener('keydown', inputFocus); -} - -function inputFocus(e) { - if (e.ctrlKey && e.key === '/' ) { - e.preventDefault(); - search.focus(); - } - if (e.key === 'Escape' ) { - search.blur(); - suggestions.classList.add('d-none'); - } -} - -document.addEventListener('click', function(event) { - - var isClickInsideElement = suggestions.contains(event.target); - - if (!isClickInsideElement) { - suggestions.classList.add('d-none'); - } - -}); - -/* -Source: - - https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3 -*/ - -document.addEventListener('keydown',suggestionFocus); - -function suggestionFocus(e) { - const suggestionsHidden = suggestions.classList.contains('d-none'); - if (suggestionsHidden) return; - - const focusableSuggestions= [...suggestions.querySelectorAll('a')]; - if (focusableSuggestions.length === 0) return; - - const index = focusableSuggestions.indexOf(document.activeElement); - - if (e.key === "ArrowUp") { - e.preventDefault(); - const nextIndex = index > 0 ? index - 1 : 0; - focusableSuggestions[nextIndex].focus(); - } - else if (e.key === "ArrowDown") { - e.preventDefault(); - const nextIndex= index + 1 < focusableSuggestions.length ? index + 1 : index; - focusableSuggestions[nextIndex].focus(); - } - -} - -/* -Source: - - https://github.com/nextapps-de/flexsearch#index-documents-field-search - - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html -*/ - -(function(){ - - var index = new FlexSearch.Document({ - tokenize: "forward", - cache: 100, - document: { - id: 'id', - store: [ - "href", "title", "description" - ], - index: ["title", "description", "content"] - } - }); - - - // Not yet supported: https://github.com/nextapps-de/flexsearch#complex-documents - - /* - var docs = [ - {{ range $index, $page := (where .Site.Pages "Section" "docs") -}} - { - id: {{ $index }}, - href: "{{ .Permalink }}", - title: {{ .Title | jsonify }}, - description: {{ .Params.description | jsonify }}, - content: {{ .Content | jsonify }} - }, - {{ end -}} - ]; - */ - - // https://discourse.gohugo.io/t/range-length-or-last-element/3803/2 - - {{ $list := (where .Site.Pages "Section" "docs") -}} - {{ $len := (len $list) -}} - - index.add( - {{ range $index, $element := $list -}} - { - id: {{ $index }}, - href: "{{ .RelPermalink }}", - title: {{ .Title | jsonify }}, - {{ with .Description -}} - description: {{ . | jsonify }}, - {{ else -}} - description: {{ .Summary | plainify | jsonify }}, - {{ end -}} - content: {{ .Plain | jsonify }} - }) - {{ if ne (add $index 1) $len -}} - .add( - {{ end -}} - {{ end -}} - ; - - search.addEventListener('input', show_results, true); - - function show_results(){ - const maxResult = 5; - var searchQuery = this.value; - var results = index.search(searchQuery, {limit: maxResult, enrich: true}); - - // flatten results since index.search() returns results for each indexed field - const flatResults = new Map(); // keyed by href to dedupe results - for (const result of results.flatMap(r => r.result)) { - if (flatResults.has(result.doc.href)) continue; - flatResults.set(result.doc.href, result.doc); - } - - suggestions.innerHTML = ""; - suggestions.classList.remove('d-none'); - - // inform user that no results were found - if (flatResults.size === 0 && searchQuery) { - const noResultsMessage = document.createElement('div') - noResultsMessage.innerHTML = `No results for "${searchQuery}"` - noResultsMessage.classList.add("suggestion__no-results"); - suggestions.appendChild(noResultsMessage); - return; - } - - // construct a list of suggestions - for(const [href, doc] of flatResults) { - const entry = document.createElement('div'); - suggestions.appendChild(entry); - - const a = document.createElement('a'); - a.href = href; - entry.appendChild(a); - - const title = document.createElement('span'); - title.textContent = doc.title; - title.classList.add("suggestion__title"); - a.appendChild(title); - - const description = document.createElement('span'); - description.textContent = doc.description; - description.classList.add("suggestion__description"); - a.appendChild(description); - - suggestions.appendChild(entry); - - if(suggestions.childElementCount == maxResult) break; - } - } -}()); diff --git a/assets/js/instant.page.js b/assets/js/instant.page.js deleted file mode 100644 index b394bcc4..00000000 --- a/assets/js/instant.page.js +++ /dev/null @@ -1 +0,0 @@ -import 'instant.page'; diff --git a/assets/js/katex.js b/assets/js/katex.js deleted file mode 100644 index e0543eaf..00000000 --- a/assets/js/katex.js +++ /dev/null @@ -1,10 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - renderMathInElement(document.body, { - delimiters: [ - {left: '$$', right: '$$', display: true}, - {left: '$', right: '$', display: false}, - {left: '\\(', right: '\\)', display: false}, - {left: '\\[', right: '\\]', display: true}, - ], - }); -}); diff --git a/assets/js/lazysizes.js b/assets/js/lazysizes.js deleted file mode 100644 index c12ed585..00000000 --- a/assets/js/lazysizes.js +++ /dev/null @@ -1 +0,0 @@ -import 'lazysizes'; diff --git a/assets/js/mermaid.js b/assets/js/mermaid.js deleted file mode 100644 index 2ab0b9a7..00000000 --- a/assets/js/mermaid.js +++ /dev/null @@ -1,11 +0,0 @@ -import mermaid from 'mermaid/dist/mermaid'; - -var config = { - theme: 'default', - fontFamily: '"Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";', -}; - -document.addEventListener('DOMContentLoaded', () => { - mermaid.initialize(config); - mermaid.init(undefined, '.language-mermaid'); -}); diff --git a/assets/scss/app.scss b/assets/scss/app.scss deleted file mode 100644 index fc76d8e9..00000000 --- a/assets/scss/app.scss +++ /dev/null @@ -1,34 +0,0 @@ -/** Import Bootstrap functions */ -@import "bootstrap/scss/functions"; - -/** Import theme variables */ -@import "common/variables"; - -/** Import Bootstrap */ -@import "bootstrap/scss/bootstrap"; - -/** Import highlight.js */ -// @import "highlight.js/scss/github-dark-dimmed"; - -/** Import KaTeX */ -@import "katex/dist/katex"; - -/** Import theme styles */ -@import "common/fonts"; -@import "common/global"; -@import "common/dark"; -@import "components/alerts"; -@import "components/buttons"; -@import "components/code"; -@import "components/syntax"; -@import "components/comments"; -@import "components/forms"; -@import "components/images"; -@import "components/mermaid"; -@import "components/search"; -@import "components/tables"; -@import "layouts/footer"; -@import "layouts/header"; -@import "layouts/pages"; -@import "layouts/posts"; -@import "layouts/sidebar"; diff --git a/assets/scss/common/_dark.scss b/assets/scss/common/_dark.scss deleted file mode 100644 index a26936c1..00000000 --- a/assets/scss/common/_dark.scss +++ /dev/null @@ -1,529 +0,0 @@ -/** Theme variables */ - -// Source: https://material.io/design/color/dark-theme.html - -$body-bg-dark: $gray-900; -$body-overlay-dark: darken($body-bg-dark, 2.5%); - -/* -$border-dark: darken($body-bg-dark, 2.5%); -*/ -$border-dark: $gray-800; -$body-color-dark: $gray-300; -$dots-dark: darken($body-color-dark, 50%); - -$link-color-dark: $blue-300; -$button-color-dark: $link-color-dark; -$focus-color-dark: lighten($link-color-dark, 2.5%); - -$navbar-dark-color: $body-color-dark; -$navbar-dark-hover-color: $link-color-dark; -$navbar-dark-active-color: $link-color-dark; - -/** Theme styles */ - -[data-dark-mode] body { - background: $body-bg-dark; - color: $body-color-dark; -} - -[data-dark-mode] body a { - color: $link-color-dark; -} - -[data-dark-mode] body a.text-body { - color: $body-color-dark !important; -} - -[data-dark-mode] body .btn-primary { - @include button-variant($button-color-dark, $button-color-dark); - - color: $body-bg-dark !important; -} - -[data-dark-mode] body .btn-outline-primary { - @include button-outline-variant($button-color-dark, $button-color-dark); - - color: $link-color-dark; -} - -[data-dark-mode] body .btn-outline-primary:hover { - color: $body-bg-dark; -} - -[data-dark-mode] body .btn-doks-light { - color: $navbar-dark-color; -} - -[data-dark-mode] body .show > .btn-doks-light, -[data-dark-mode] body .btn-doks-light:hover, -[data-dark-mode] body .btn-doks-light:active { - color: $link-color-dark; -} - -[data-dark-mode] body .btn-menu svg { - color: $body-color-dark; -} - -[data-dark-mode] body .doks-sidebar-toggle { - color: $navbar-dark-color; -} - -[data-dark-mode] body .btn-menu:hover, -[data-dark-mode] body .btn-doks-light:hover, -[data-dark-mode] body .doks-sidebar-toggle:hover { - background: $body-overlay-dark; -} - -/* -[data-dark-mode] body .dropdown-menu { - @extend .dropdown-menu-dark; -} -*/ - -[data-dark-mode] body .navbar, -[data-dark-mode] body .doks-subnavbar { - background-color: rgba(33, 37, 41, 0.95); - border-bottom: 1px solid $border-dark; -} - -[data-dark-mode] body.home .navbar { - border-bottom: 0; -} - -[data-dark-mode] body .offcanvas-header { - border-bottom: 1px solid $gray-800; -} - -[data-dark-mode] body .offcanvas .nav-link { - color: $body-color-dark; -} - -[data-dark-mode] body .offcanvas .nav-link:hover, -[data-dark-mode] body .offcanvas .nav-link:focus { - color: $link-color-dark; -} - -[data-dark-mode] body .offcanvas .nav-link.active { - color: $link-color-dark; -} - -[data-dark-mode] body .navbar-light .navbar-brand { - color: $navbar-dark-color !important; -} - -[data-dark-mode] body .navbar-light .navbar-nav .nav-link { - color: $navbar-dark-color; -} - -[data-dark-mode] body .navbar-light .navbar-nav .nav-link:hover, -[data-dark-mode] body .navbar-light .navbar-nav .nav-link:focus { - color: $navbar-dark-hover-color; -} - -[data-dark-mode] body .navbar-light .navbar-nav .nav-link.disabled { - color: $navbar-dark-disabled-color; -} - -[data-dark-mode] body .navbar-light .navbar-nav .show > .nav-link, -[data-dark-mode] body .navbar-light .navbar-nav .active > .nav-link, -[data-dark-mode] body .navbar-light .navbar-nav .nav-link.show, -[data-dark-mode] body .navbar-light .navbar-nav .nav-link.active { - color: $navbar-dark-active-color; -} - -[data-dark-mode] body .navbar-light .navbar-text { - color: $navbar-dark-color; -} - -[data-dark-mode] body .alert-primary a { - color: $body-bg-dark; -} - -[data-dark-mode] body .alert-warning { - background: $body-overlay-dark; - color: $body-color-dark; -} - -[data-dark-mode] body .page-links a { - color: $body-color-dark; -} - -[data-dark-mode] body .btn-toggle-nav a { - color: $body-color-dark; -} - -[data-dark-mode] body .showcase-meta a { - color: $body-color-dark; -} - -[data-dark-mode] body .showcase-meta a:hover, -[data-dark-mode] body .showcase-meta a:focus { - color: $link-color-dark; -} - -[data-dark-mode] body .docs-link:hover, -[data-dark-mode] body .docs-link.active, -[data-dark-mode] body .page-links a:hover { - text-decoration: none; - color: $link-color-dark; -} - -[data-dark-mode] body .btn-toggle { - color: $body-color-dark; - background-color: transparent; - border: 0; -} - -[data-dark-mode] body .btn-toggle:hover, -[data-dark-mode] body .btn-toggle:focus { - color: $body-color-dark; -} - -[data-dark-mode] body .btn-toggle::before { - width: 1.25em; - line-height: 0; - content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28222, 226, 230, 0.75%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e"); - transition: transform 0.35s ease; - transform-origin: 0.5em 50%; - margin-bottom: 0.125rem; -} - -[data-dark-mode] body .btn-toggle[aria-expanded="true"] { - color: $body-color-dark; -} - -[data-dark-mode] body .btn-toggle[aria-expanded="true"]::before { - transform: rotate(90deg); -} - -[data-dark-mode] body .btn-toggle-nav a:hover, -[data-dark-mode] body .btn-toggle-nav a:focus { - color: $link-color-dark; -} - -[data-dark-mode] body .btn-toggle-nav a.active { - color: $link-color-dark; -} - -[data-dark-mode] body .navbar-light .navbar-text a { - color: $navbar-dark-active-color; -} - -[data-dark-mode] body .docs-links h3.sidebar-link a, -[data-dark-mode] body .page-links h3.sidebar-link a { - color: $body-color-dark; -} - -[data-dark-mode] body .navbar-light .navbar-text a:hover, -[data-dark-mode] body .navbar-light .navbar-text a:focus { - color: $navbar-dark-active-color; -} - -[data-dark-mode] body .navbar .btn-link { - color: $navbar-dark-color; -} - -[data-dark-mode] body .content .btn-link { - color: $link-color-dark; -} - -[data-dark-mode] body .content .btn-link:hover { - color: $link-color-dark; -} - -[data-dark-mode] body .content img[src^="https://latex.codecogs.com/svg.latex"] { - filter: invert(1); -} - -[data-dark-mode] body .navbar .btn-link:hover { - color: $navbar-dark-hover-color; -} - -[data-dark-mode] body .navbar .btn-link:active { - color: $navbar-dark-active-color; -} - -[data-dark-mode] body .form-control.is-search { - background: $body-overlay-dark; - border: 1px solid transparent; - color: $gray-300; - - /* - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); - */ -} - -[data-dark-mode] body .form-control.is-search:focus { - border: 1px solid $link-color-dark; -} - -[data-dark-mode] body .doks-search::after { - color: $gray-300; - border: 1px solid $gray-700; -} - -[data-dark-mode] body .text-dark { - color: $body-color-dark !important; -} - -/* -[data-dark-mode] body .navbar-form::after { - color: $gray-600; - border: 1px solid $gray-800; -} -*/ - -[data-dark-mode] body .form-control { - color: $gray-300; -} - -[data-dark-mode] body .form-control::placeholder { - color: $gray-400; - opacity: 1; -} - -[data-dark-mode] body .border-top { - border-top: 1px solid $border-dark !important; -} - -@include media-breakpoint-up(lg) { - [data-dark-mode] body .docs-sidebar { - order: 0; - border-right: 1px solid $border-dark; - } -} - -[data-dark-mode] body .docs-navigation { - border-top: 1px solid $border-dark; -} - -[data-dark-mode] body pre code::-webkit-scrollbar-thumb { - background: $gray-400; -} - -[data-dark-mode] body code:not(.hljs) { - background: $body-overlay-dark; - color: $body-color-dark; -} - -[data-dark-mode] body pre code:hover { - scrollbar-width: thin; - scrollbar-color: $border-dark transparent; -} - -[data-dark-mode] body pre code::-webkit-scrollbar-thumb:hover { - background: $gray-500; -} - -[data-dark-mode] body blockquote { - border-left: 3px solid $border-dark; -} - -[data-dark-mode] body .footer { - border-top: 1px solid $border-dark; -} - -[data-dark-mode] body .docs-links, -[data-dark-mode] body .docs-toc { - scrollbar-width: thin; - scrollbar-color: $body-bg-dark $body-bg-dark; -} - -[data-dark-mode] body .docs-links::-webkit-scrollbar, -[data-dark-mode] body .docs-toc::-webkit-scrollbar { - width: 5px; -} - -[data-dark-mode] body .docs-links::-webkit-scrollbar-track, -[data-dark-mode] body .docs-toc::-webkit-scrollbar-track { - background: $body-bg-dark; -} - -[data-dark-mode] body .docs-links::-webkit-scrollbar-thumb, -[data-dark-mode] body .docs-toc::-webkit-scrollbar-thumb { - background: $body-bg-dark; -} - -[data-dark-mode] body .docs-links:hover, -[data-dark-mode] body .docs-toc:hover { - scrollbar-width: thin; - scrollbar-color: $border-dark $body-bg-dark; -} - -[data-dark-mode] body .docs-links:hover::-webkit-scrollbar-thumb, -[data-dark-mode] body .docs-toc:hover::-webkit-scrollbar-thumb { - background: $border-dark; -} - -[data-dark-mode] body .docs-links::-webkit-scrollbar-thumb:hover, -[data-dark-mode] body .docs-toc::-webkit-scrollbar-thumb:hover { - background: $border-dark; -} - -[data-dark-mode] body .docs-links h3:not(:first-child) { - border-top: 1px solid $border-dark; -} - -[data-dark-mode] body a.docs-link { - color: $body-color-dark; -} - -[data-dark-mode] body .page-links li:not(:first-child) { - border-top: 1px dashed $border-dark; -} - -[data-dark-mode] body .card { - background: $body-overlay-dark; - border: 1px solid $border-dark; -} - -[data-dark-mode] body .card.bg-light { - background: $body-overlay-dark !important; -} - -[data-dark-mode] body .card article { - color: $body-color-dark; -} - -[data-dark-mode] body .navbar .menu-icon .navicon { - background: $navbar-dark-color; -} - -[data-dark-mode] body .navbar .menu-icon .navicon::before, -[data-dark-mode] body .navbar .menu-icon .navicon::after { - background: $navbar-dark-color; -} - -[data-dark-mode] body .logo-light { - display: none !important; -} - -[data-dark-mode] body .logo-dark { - display: inline-block !important; -} - -[data-dark-mode] body .bg-light { - background: darken($body-bg-dark, 1.5%) !important; -} - -[data-dark-mode] body .bg-dots { - background-image: radial-gradient($dots-dark 15%, transparent 15%); -} - -[data-dark-mode] body .text-muted { - color: darken($body-color-dark, 7.5%) !important; -} - -[data-dark-mode] body .alert-primary { - background: $link-color-dark; - color: $body-bg-dark; -} - -[data-dark-mode] body .figure-caption { - color: $body-color-dark; -} - -[data-dark-mode] body table { - @extend .table-dark; -} - -[data-dark-mode] body .copy-status::after { - content: "Copy"; - display: block; - color: $body-color-dark; -} - -[data-dark-mode] body .copy-status:hover::after { - content: "Copy"; - display: block; - color: $link-color-dark; -} - -[data-dark-mode] body .copy-status:focus::after, -[data-dark-mode] body .copy-status:active::after { - content: "Copied"; - display: block; - color: $link-color-dark; -} - -/* -[data-dark-mode] body .dropdown-toggle:focus, -[data-dark-mode] body .doks-sidebar-toggle:focus { - box-shadow: 0 0 0 0.2rem $focus-color-dark; -} -*/ - -[data-dark-mode] body .offcanvas { - background-color: $body-bg-dark; -} - -[data-dark-mode] body .btn-close { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNkZWUyZTYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXgiPjxsaW5lIHgxPSIxOCIgeTE9IjYiIHgyPSI2IiB5Mj0iMTgiPjwvbGluZT48bGluZSB4MT0iNiIgeTE9IjYiIHgyPSIxOCIgeTI9IjE4Ij48L2xpbmU+PC9zdmc+"); - background-size: 1.5rem; -} - -@include media-breakpoint-up(md) { - [data-dark-mode] body .alert-dismissible .btn-close { - background-size: 1.25rem; - } -} - -/* -[data-dark-mode] body .btn-close:focus { - box-shadow: 0 0 0 0.2rem $focus-color-dark; -} -*/ - -[data-dark-mode] .dropdown-item { - color: $body-bg-dark; -} - -[data-dark-mode] body hr.text-black-50 { - color: $gray-600 !important; -} - -[data-dark-mode] body .email-form .form-control { - background: $body-overlay-dark; - border: 1px solid transparent; -} - -[data-dark-mode] body .email-form .form-control:focus { - border: 1px solid $link-color-dark; -} - -[data-dark-mode] .page-link { - color: $link-color-dark; - background-color: transparent; - border: $pagination-border-width solid $border-dark; - - &:hover { - color: $body-bg-dark; - background-color: $body-color-dark; - border-color: $body-color-dark; - } - - &:focus { - color: $body-bg-dark; - background-color: $body-color-dark; - } -} - -[data-dark-mode] .page-item { - &.active .page-link { - color: $body-bg-dark; - - @include gradient-bg($link-color-dark); - - border-color: $link-color-dark; - } - - &.disabled .page-link { - color: $pagination-disabled-color; - background-color: $body-overlay-dark; - border-color: $border-dark; - } -} diff --git a/assets/scss/common/_fonts.scss b/assets/scss/common/_fonts.scss deleted file mode 100644 index d2b77252..00000000 --- a/assets/scss/common/_fonts.scss +++ /dev/null @@ -1,71 +0,0 @@ -/* jost-regular - latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: - local("Jost"), - url("fonts/vendor/jost/jost-v4-latin-regular.woff2") format("woff2"), - url("fonts/vendor/jost/jost-v4-latin-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* jost-500 - latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 500; - font-display: swap; - src: - local("Jost"), - url("fonts/vendor/jost/jost-v4-latin-500.woff2") format("woff2"), - url("fonts/vendor/jost/jost-v4-latin-500.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* jost-700 - latin */ -@font-face { - font-family: "Jost"; - font-style: normal; - font-weight: 700; - font-display: swap; - src: - local("Jost"), - url("fonts/vendor/jost/jost-v4-latin-700.woff2") format("woff2"), - url("fonts/vendor/jost/jost-v4-latin-700.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* jost-italic - latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 400; - font-display: swap; - src: - local("Jost"), - url("fonts/vendor/jost/jost-v4-latin-italic.woff2") format("woff2"), - url("fonts/vendor/jost/jost-v4-latin-italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* jost-500italic - latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 500; - font-display: swap; - src: - local("Jost"), - url("fonts/vendor/jost/jost-v4-latin-500italic.woff2") format("woff2"), - url("fonts/vendor/jost/jost-v4-latin-500italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} - -/* jost-700italic - latin */ -@font-face { - font-family: "Jost"; - font-style: italic; - font-weight: 700; - font-display: swap; - src: - local("Jost"), - url("fonts/vendor/jost/jost-v4-latin-700italic.woff2") format("woff2"), - url("fonts/vendor/jost/jost-v4-latin-700italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} diff --git a/assets/scss/common/_global.scss b/assets/scss/common/_global.scss deleted file mode 100644 index 7e6c5721..00000000 --- a/assets/scss/common/_global.scss +++ /dev/null @@ -1,272 +0,0 @@ -.contributors .content, -.blog .content, -.page .content, -.error404 .content, -.docs.list .content, -.tutorial.list .content, -.showcase.list .content { - padding-top: 1rem; - padding-bottom: 3rem; -} - -.content img { - max-width: 100%; -} - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - margin: 2rem 0 1rem; -} - -.offcanvas-header { - border-bottom: 1px solid $gray-300; - padding-top: 1.0625rem; - padding-bottom: 0.8125rem; -} - -h5.offcanvas-title { - margin: 0; -} - -body.docs { - padding-top: 0 !important; -} - -@include media-breakpoint-up(md) { - body { - font-size: $font-size-md; - - /* - padding-top: 4rem !important; - */ - } - - h1, - h2, - h3, - h4, - h5, - h6, - .h1, - .h2, - .h3, - .h4, - .h5, - .h6 { - margin-bottom: 1.125rem; - } -} - -.home h1 { - /* font-size: calc(1.375rem + 1.5vw); */ - font-size: calc(1.875rem + 1.5vw); -} - -a:hover, -a:focus { - text-decoration: underline; -} - -a.btn:hover, -a.btn:focus { - text-decoration: none; -} - -.section { - padding-top: 5rem; - padding-bottom: 5rem; -} - -.section-md { - padding-top: 3rem; - padding-bottom: 3rem; -} - -.section-sm { - padding-top: 1rem; - padding-bottom: 1rem; -} - -/* -.section svg { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-top; -} -*/ - -/* -body { - padding-top: 3.5625rem; -} -*/ - -.docs-sidebar { - order: 2; -} - -@include media-breakpoint-up(lg) { - .docs-sidebar { - order: 0; - border-right: 1px solid $gray-200; - } - - @supports ((position:-webkit-sticky) or (position:sticky)) { - .docs-sidebar { - position: -webkit-sticky; - position: sticky; - top: 4rem; - z-index: 1000; - height: calc(100vh - 4rem); - } - } -} - -@include media-breakpoint-up(xl) { - .docs-sidebar { - flex: 0 1 320px; - } -} - -.docs-links { - padding-bottom: 5rem; -} - -@include media-breakpoint-up(lg) { - @supports ((position: -webkit-sticky) or (position: sticky)) { - .docs-links { - max-height: calc(100vh - 4rem); - overflow-y: scroll; - } - } -} - -@include media-breakpoint-up(lg) { - .docs-links { - display: block; - width: auto; - margin-right: -1.5rem; - padding-bottom: 4rem; - } -} - -.docs-toc { - order: 2; -} - -@supports ((position:-webkit-sticky) or (position:sticky)) { - .docs-toc { - position: -webkit-sticky; - position: sticky; - top: 4rem; - height: calc(100vh - 4rem); - overflow-y: auto; - } -} - -.docs-content { - padding-bottom: 3rem; - order: 1; -} - -.docs-navigation { - border-top: 1px solid $gray-200; - margin-top: 2rem; - margin-bottom: 0; - padding-top: 2rem; -} - -.docs-navigation a { - font-size: $font-size-base * 0.9; -} - -@include media-breakpoint-up(lg) { - .docs-navigation { - margin-bottom: -1rem; - } - - .docs-navigation a { - font-size: $font-size-base; - } -} - -.navbar a:hover, -.navbar a:focus { - text-decoration: none; -} - -#TableOfContents ul { - padding-left: 0; - list-style: none; -} - -::selection { - background: rgba(212, 53, 159, 0.2); -} - -.bg-dots { - background-image: radial-gradient($gray-300 15%, transparent 15%); - background-position: 0 0; - background-size: 1rem 1rem; - -webkit-mask: linear-gradient(to top, #fff, transparent); - mask: linear-gradient(to top, #fff, transparent); - width: 100%; - height: 9rem; - margin-top: -10rem; - z-index: -1; -} - -.bg-dots-md { - margin-top: -11rem; -} - -.bg-dots-lg { - margin-top: -12rem; -} - -// https://fossheim.io/writing/posts/css-text-gradient/ -.gradient-text { - background-color: $primary; - background-image: linear-gradient(90deg, $primary, $blue-300 50%, $pink-500); - background-size: 100%; - background-repeat: repeat; - -webkit-background-clip: text; - -moz-background-clip: text; - -webkit-text-fill-color: transparent; - -moz-text-fill-color: transparent; -} - -.katex { - font-size: $font-size-md; -} - -.card-bar { - border-top: 4px solid; - border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #d32e9d); - border-image-slice: 1; -} - -.modal-backdrop { - background-color: #fff; -} - -.modal-backdrop.show { - opacity: 0.7; -} - -@include media-breakpoint-up(md) { - .modal-backdrop.show { - opacity: 0; - } -} diff --git a/assets/scss/common/_variables.scss b/assets/scss/common/_variables.scss deleted file mode 100644 index 0baa1ece..00000000 --- a/assets/scss/common/_variables.scss +++ /dev/null @@ -1,189 +0,0 @@ -// Color system - -$white: #fff; -$gray-100: #f8f9fa; -$gray-200: #e9ecef; -$gray-300: #dee2e6; -$gray-400: #ced4da; -$gray-500: #adb5bd; -$gray-600: #6c757d; -$gray-700: #495057; -$gray-800: #343a40; -$gray-900: #212529; -$black: #000; - -$yellow: #ffe000; -$black: #1d2d35; -$beige: #fbf7f0; -// $red: #e55235; -$purple: #5d2f86; -$brown: #aa9c84; - -$blue-300: #8ed6fb; -$pink-100: #fcfaff; -$pink-500: #d32e9d; - -$primary: $purple; - -$color-btn-bg: $pink-500; -$color-btn-border: darken($pink-500, 5%); -$color-btn-text: $white; - -// Options -// -// Quickly modify global styling by enabling or disabling optional features. - -$enable-caret: true; -$enable-rounded: true; -$enable-shadows: false; -$enable-gradients: false; -$enable-transitions: true; -$enable-reduced-motion: true; -$enable-smooth-scroll: true; -$enable-grid-classes: true; -$enable-button-pointers: true; -$enable-rfs: true; -$enable-validation-icons: true; -$enable-negative-margins: true; -$enable-deprecation-messages: true; -$enable-important-utilities: true; - -/** Bootstrap navbar fix (https://git.io/fADqW) */ -$navbar-dark-toggler-icon-bg: none; -$navbar-light-toggler-icon-bg: none; - -// Options -// -// Quickly modify global styling by enabling or disabling optional features. - -// $enable-responsive-font-sizes: true; - -// Body -// -// Settings for the `` element. - -$body-bg: $white; -$body-color: $black; - -// Links -// -// Style anchor elements. - -$link-color: $primary; -$link-decoration: none; - -// Grid containers -// -// Define the maximum width of `.container` for different screen sizes. - -$container-max-widths: ( - sm: 540px, - md: 720px, - lg: 960px, - xl: 1240px, - xxl: 1320px -); - -@include _assert-ascending($container-max-widths, "$container-max-widths"); - -// Grid columns -// -// Set the number of columns and specify the width of the gutters. - -$grid-columns: 16; -$grid-gutter-width: 48px; -$grid-row-columns: 6; - -// Components -// -// Define common padding and border radius sizes and more. - -$border-color: $gray-200; - -// Typography -// -// Font, line-height, and color for body text, headings, and more. - -// stylelint-disable value-keyword-case -$font-family-sans-serif: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -$font-family-monospace: sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace; -$font-family-base: $font-family-sans-serif; -// stylelint-enable value-keyword-case - -$font-size-base: 1rem; // Assumes the browser default, typically `16px` -$font-size-xl: $font-size-base * 1.375; -$font-size-lg: $font-size-base * 1.25; -$font-size-md: $font-size-base * 1.125; -$font-size-sm: $font-size-base * 0.875; - -// $line-height-base: 1.5; - -$headings-font-family: null; -$headings-font-weight: 700; - -$lead-font-weight: 400; - -// Spacing -// -// Control the default styling of most Bootstrap elements by modifying these -// variables. Mostly focused on spacing. -// You can add more entries to the $spacers map, should you need more variation. - -$spacer: 1rem; - -// Navbar - -$navbar-padding-y: $spacer / 2; -$navbar-padding-x: null; - -$navbar-nav-link-padding-x: 0.5rem; - -$navbar-light-color: $black; -$navbar-light-hover-color: $primary; -$navbar-light-active-color: $primary; - -// Cards - -$card-border-color: $gray-200; - -// Alerts -// -// Define alert colors, border radius, and padding. - -$alert-padding-y: $spacer; -$alert-padding-x: $spacer * 1.5; -$alert-margin-bottom: 0; -$alert-border-radius: 0; -$alert-link-font-weight: $headings-font-weight; -$alert-border-width: 0; - -$alert-bg-scale: 0; -$alert-border-scale: 0; -$alert-color-scale: 0; - -// docsearch -$dropdown-config: ( - main-color: $purple, - layout-type: normal, - layout-width: normal, - layout-alignment: align, - background-color: $white, - border-radius: 4, - border-width: 1, - border-color: $gray-200, - box-shadow: none, - branding-position: bottom, - spacing: normal, - include-desc: yes, - background-category-header: $white, - font-size: normal, - header-color: $black, - title-color: $black, - subtitle-color: $black, - text-color: $black, - highlight-color: $purple, - highlight-opacity: 0.1, - highlight-type: underline -); - -$input-btn-focus-width: 0; diff --git a/assets/scss/components/_alerts.scss b/assets/scss/components/_alerts.scss deleted file mode 100644 index bce819df..00000000 --- a/assets/scss/components/_alerts.scss +++ /dev/null @@ -1,91 +0,0 @@ -.alert { - font-family: $font-family-monospace; - font-size: $font-size-sm; -} - -.alert-icon { - margin-right: 0.75rem; -} - -.docs main .alert { - margin: 2rem -1.5rem; -} - -.alert .alert-link { - text-decoration: underline; -} - -.alert-dark { - color: $white; - background-color: $black; -} - -.alert-dark .alert-link { - color: $white; -} - -.alert-light { - color: $black; -} - -.alert-warning { - background: $beige; - color: $black; -} - -/* -.alert-light { - color: #215888; - background: linear-gradient(-45deg, rgb(212, 245, 255), rgb(234, 250, 255), rgb(234, 250, 255), #d3f6ef); -} - -.alert-light .alert-link { - color: #215888; -} -*/ - -.alert-white { - background-color: rgba(255, 255, 255, 0.95); -} - -.alert-primary { - color: $white; - background-color: $primary; -} - -.alert-primary .alert-link { - color: $white; -} - -.alert .alert-link:hover, -.alert .alert-link:focus { - text-decoration: none; -} - -.alert-dismissible .btn-close { - position: absolute; - - /* - top: 50%; - transform: translateY(-50%); - */ - top: 0.75rem; - right: 1rem; - z-index: 2; - padding: 0.625rem; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-x'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E"); - background-size: 1.5rem; - filter: invert(1) grayscale(100%) brightness(200%); -} - -@include media-breakpoint-up(md) { - .alert-dismissible .btn-close { - background-size: 1.25rem; - } -} - -.alert code { - background: darken($beige, 5%); - color: $black; - padding: 0.25rem 0.5rem; -} diff --git a/assets/scss/components/_buttons.scss b/assets/scss/components/_buttons.scss deleted file mode 100644 index 5e8cb2fb..00000000 --- a/assets/scss/components/_buttons.scss +++ /dev/null @@ -1,220 +0,0 @@ -.navbar .btn-link { - color: $navbar-light-color; - padding: 0.4375rem 0; -} - -#mode { - padding-right: 0.25rem; - padding-left: 0.25rem; - margin-right: -0.25rem; -} - -.btn-link:focus { - outline: 0; - box-shadow: none; -} - -#navigation { - margin-left: 1.25rem; -} - -@include media-breakpoint-up(md) { - #mode { - margin-left: 1.125rem; - margin-right: -0.375rem; - } - - .navbar .btn-link { - padding: 0.5625em 0.25rem 0.5rem 0.125rem; - } -} - -.navbar .btn-link:hover { - color: $navbar-light-hover-color; -} - -.navbar .btn-link:active { - color: $navbar-light-active-color; -} - -body .toggle-dark { - display: block; -} - -body .toggle-light { - display: none; -} - -[data-dark-mode] body .toggle-light { - display: block; -} - -[data-dark-mode] body .toggle-dark { - display: none; -} - -pre { - position: relative; -} - -@include media-breakpoint-down(md) { - .btn-copy { - display: none; - } -} - -.btn-copy { - transition: opacity 0.3s ease-in-out; - opacity: 0; - position: absolute; - right: 0.25rem; - top: 0.25rem; - z-index: 10; - font-family: $font-family-sans-serif; - font-size: $font-size-sm; - padding: 0.25rem 0.5rem; - color: $color-btn-text; - background-color: $color-btn-bg; - border-color: $color-btn-border; -} - -.btn-copy:hover { - color: $color-btn-text; - background-color: lighten($color-btn-bg, 5%); - border-color: lighten($color-btn-border, 15%); -} - -.btn-copy:focus { - color: $color-btn-text; - background-color: $color-btn-bg; - border-color: lighten($color-btn-border, 15%); - box-shadow: none; -} - -.btn-copy:active, -.btn-copy.active { - color: $color-btn-text; - background-color: $color-btn-bg; - border-color: lighten($color-btn-border, 15%); -} - -.btn-copy:active:focus, -.btn-copy.active:focus { - box-shadow: none; -} - -@include media-breakpoint-up(md) { - pre:hover .btn-copy { - opacity: 1; - } -} - -.btn-copy::after { - content: "Copy"; - display: block; - color: $color-btn-text; -} - -.btn-copy:hover::after { - content: "Copy"; - display: block; - color: $color-btn-text; -} - -.btn-copy:focus::after, -.btn-copy:active::after { - content: "Copied"; - display: block; - color: $color-btn-text; -} - -.collapsible-sidebar { - margin: 2.125rem 0; -} - -.btn-toggle { - display: inline-flex; - align-items: center; - padding: 0.25rem 0.5rem 0.25rem 0; - font-weight: $headings-font-weight; - font-size: $font-size-base; - text-transform: uppercase; - color: $body-color; - background-color: transparent; - border: 0; -} - -.btn-toggle:hover, -.btn-toggle:focus { - color: $body-color; - background-color: transparent; - outline: 0; - box-shadow: none; -} - -.btn-toggle::before { - width: 1.25em; - line-height: 0; - content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%2829, 45, 53, 0.75%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e"); - transition: transform 0.35s ease; - transform-origin: 0.5em 50%; - margin-bottom: 0.125rem; -} - -.btn-toggle[aria-expanded="true"] { - color: $body-color; -} - -.btn-toggle[aria-expanded="true"]::before { - transform: rotate(90deg); -} - -.btn-toggle-nav a { - display: inline-flex; - padding: 0.1875rem 0.5rem; - margin-top: 0.125rem; - margin-left: 1.25rem; - text-decoration: none; -} - -.btn-toggle-nav a:hover, -.btn-toggle-nav a:focus { - background-color: transparent; - color: $link-color; -} - -.btn-toggle-nav a.active { - color: $link-color; -} - -.doks-navbar .dropdown-menu, -.doks-subnavbar .dropdown-menu { - font-size: 0.875rem; -} - -.doks-navbar .dropdown-item.current, -.doks-subnavbar .dropdown-item.current { - font-weight: 600; - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23292b2c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right 1rem top 0.6rem; - background-size: 0.75rem 0.75rem; -} - -.btn-close { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-x'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E"); - background-size: 1.5rem; -} - -.offcanvas-header .btn-close { - margin-right: 0 !important; -} - -.dropdown-toggle::after { - display: none; -} - -.dropdown-caret { - margin-left: -0.1875rem; - margin-right: -0.3125rem; -} diff --git a/assets/scss/components/_code.scss b/assets/scss/components/_code.scss deleted file mode 100644 index 84ad2bca..00000000 --- a/assets/scss/components/_code.scss +++ /dev/null @@ -1,66 +0,0 @@ -pre, -code, -kbd, -samp { - font-family: $font-family-monospace; - font-size: $font-size-sm; - border-radius: $border-radius; -} - -code { - background: $beige; - color: $black; - padding: 0.25rem 0.5rem; -} - -pre { - margin: 2rem 0; -} - -pre code { - display: block; - overflow-x: auto; - line-height: $line-height-base; - padding: 1.25rem 1.5rem; - tab-size: 4; - scrollbar-width: thin; - scrollbar-color: transparent transparent; -} - -.hljs { - padding: 1.5rem !important; -} - -@include media-breakpoint-down(sm) { - pre, - code, - kbd, - samp { - border-radius: 0; - } - - pre { - margin: 2rem -1.5rem; - } -} - -pre code::-webkit-scrollbar { - height: 5px; -} - -pre code::-webkit-scrollbar-thumb { - background: $gray-400; -} - -pre code:hover { - scrollbar-width: thin; - scrollbar-color: $gray-500 transparent; -} - -pre code::-webkit-scrollbar-thumb:hover { - background: $gray-500; -} - -code.language-mermaid { - background: none; -} diff --git a/assets/scss/components/_comments.scss b/assets/scss/components/_comments.scss deleted file mode 100644 index 18f610c9..00000000 --- a/assets/scss/components/_comments.scss +++ /dev/null @@ -1,30 +0,0 @@ -.comment-list { - @extend .list-unstyled; -} - -.comment-list ol { - list-style: none; -} - -.comment-form p { - @extend .form-group !optional; -} - -.comment-form input[type="text"], -.comment-form input[type="email"], -.comment-form input[type="url"], -.comment-form textarea { - @extend .form-control; -} - -.comment-form input[type="submit"] { - @extend .btn; - @extend .btn-secondary; -} - -blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; - border-left: 3px solid $gray-300; - padding-left: 1rem; -} diff --git a/assets/scss/components/_forms.scss b/assets/scss/components/_forms.scss deleted file mode 100644 index 9732838d..00000000 --- a/assets/scss/components/_forms.scss +++ /dev/null @@ -1,19 +0,0 @@ -/** Search form */ -.search-form { - @extend .form-inline !optional; -} - -.search-form label { - @extend .form-group; - - font-weight: normal; -} - -.search-form .search-field { - @extend .form-control; -} - -.search-form .search-submit { - @extend .btn; - @extend .btn-secondary; -} diff --git a/assets/scss/components/_images.scss b/assets/scss/components/_images.scss deleted file mode 100644 index 254eefa0..00000000 --- a/assets/scss/components/_images.scss +++ /dev/null @@ -1,48 +0,0 @@ -figure { - margin: 2rem 0; -} - -.figure-caption { - margin: 0.25rem 0 0.75rem; -} - -figure.wide { - margin: 2rem -1.5rem; -} - -figure.wide .figure-caption { - margin: 0.25rem 1.5rem 0.75rem; -} - -@include media-breakpoint-up(md) { - figure.wide { - margin: 2rem -2.5rem; - } - - figure.wide .figure-caption { - margin: 0.25rem 2.5rem 0.75rem; - } -} - -@include media-breakpoint-up(lg) { - figure.wide { - margin: 2rem -5rem; - } - - figure.wide .figure-caption { - margin: 0.25rem 5rem 0.75rem; - } -} - -.blur-up { - filter: blur(5px); -} - -.blur-up.lazyloaded { - filter: unset; -} - -.img-simple { - margin-top: 0.375rem; - margin-bottom: 1.25rem; -} diff --git a/assets/scss/components/_mermaid.scss b/assets/scss/components/_mermaid.scss deleted file mode 100644 index 3ff24888..00000000 --- a/assets/scss/components/_mermaid.scss +++ /dev/null @@ -1,8 +0,0 @@ -.mermaid { - margin: 1.5rem 0; - padding: 1.5rem; -} - -.mermaid svg { - height: auto; -} diff --git a/assets/scss/components/_search.scss b/assets/scss/components/_search.scss deleted file mode 100644 index 45ec2aff..00000000 --- a/assets/scss/components/_search.scss +++ /dev/null @@ -1,81 +0,0 @@ -.navbar-form { - position: relative; -} - -#suggestions { - position: absolute; - left: 0; - margin-top: 0.5rem; - width: calc(100vw - 3rem); - z-index: $zindex-dropdown; -} - -#suggestions a, -.suggestion__no-results { - padding: 0.75rem; - margin: 0 0.5rem; -} - -#suggestions a { - display: block; - text-decoration: none; -} - -#suggestions a:focus { - background: $gray-100; - outline: 0; -} - -#suggestions div:not(:first-child) { - border-top: 1px dashed $gray-200; -} - -#suggestions div:first-child { - margin-top: 0.5rem; -} - -#suggestions div:last-child { - margin-bottom: 0.5rem; -} - -#suggestions a:hover { - background: $gray-100; -} - -#suggestions span { - display: flex; - font-size: $font-size-base; -} - -.suggestion__title { - font-weight: $headings-font-weight; - color: $black; -} - -.suggestion__description, -.suggestion__no-results { - color: $gray-700; -} - -@include media-breakpoint-up(sm) { - #suggestions { - width: 31.125rem; - } - - #suggestions a { - display: flex; - } - - .suggestion__title { - width: 9rem; - padding-right: 1rem; - border-right: 1px solid $gray-200; - display: inline-block; - text-align: right; - } - - .suggestion__description { - width: 19rem; - padding-left: 1rem; - } -} diff --git a/assets/scss/components/_syntax.scss b/assets/scss/components/_syntax.scss deleted file mode 100644 index 2be315d9..00000000 --- a/assets/scss/components/_syntax.scss +++ /dev/null @@ -1,62 +0,0 @@ -/* - -Based on Ascetic by (c) Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 1.25rem 1.5rem; - background: $beige; - color: $body-color; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-symbol, -.hljs-bullet, -.hljs-section, -.hljs-addition, -.hljs-attribute, -.hljs-link { - color: $pink-500; -} - -.hljs-comment, -.hljs-quote, -.hljs-meta, -.hljs-deletion { - color: #888; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-section, -.hljs-name, -.hljs-type, -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} - -[data-dark-mode] body .hljs { - background: $body-overlay-dark; - color: $body-color-dark; -} - -[data-dark-mode] body .hljs-string, -[data-dark-mode] body .hljs-variable, -[data-dark-mode] body .hljs-template-variable, -[data-dark-mode] body .hljs-symbol, -[data-dark-mode] body .hljs-bullet, -[data-dark-mode] body .hljs-section, -[data-dark-mode] body .hljs-addition, -[data-dark-mode] body .hljs-attribute, -[data-dark-mode] body .hljs-link { - color: $blue-300; -} diff --git a/assets/scss/components/_tables.scss b/assets/scss/components/_tables.scss deleted file mode 100644 index b1f8c2e7..00000000 --- a/assets/scss/components/_tables.scss +++ /dev/null @@ -1,5 +0,0 @@ -table { - @extend .table; - - margin: 3rem 0; -} diff --git a/assets/scss/layouts/_footer.scss b/assets/scss/layouts/_footer.scss deleted file mode 100644 index 7d218114..00000000 --- a/assets/scss/layouts/_footer.scss +++ /dev/null @@ -1,20 +0,0 @@ -.footer { - border-top: 1px solid $gray-200; - padding-top: 1.125rem; - padding-bottom: 1.125rem; -} - -.footer ul { - margin-bottom: 0; -} - -.footer li { - font-size: $font-size-sm; - margin-bottom: 0; -} - -@include media-breakpoint-up(md) { - .footer li { - font-size: $font-size-base; - } -} diff --git a/assets/scss/layouts/_header.scss b/assets/scss/layouts/_header.scss deleted file mode 100644 index cb85c32c..00000000 --- a/assets/scss/layouts/_header.scss +++ /dev/null @@ -1,445 +0,0 @@ -.banner .nav li { - @extend .nav-item; -} - -.banner .nav a { - @extend .nav-link; -} - -.navbar-text { - margin-left: 1rem; -} - -.navbar-brand { - font-weight: $headings-font-weight; -} - -/* -.navbar-light .navbar-brand, -.navbar-light .navbar-brand:hover, -.navbar-light .navbar-brand:active { - color: $body-color; -} - -.navbar-light .navbar-nav .active .nav-link { - color: $primary; -} -*/ - -.navbar { - z-index: 1000; - background-color: rgba(255, 255, 255, 0.95); - border-bottom: 1px solid $gray-200; - - /* - margin-top: 4px; - */ -} - -@include media-breakpoint-up(lg) { - .navbar { - z-index: 1025; - } -} - -@include media-breakpoint-up(md) { - .navbar-brand { - font-size: $font-size-xl; - } - - .navbar-text { - margin-left: 1.25rem; - } -} - -.navbar-nav { - flex-direction: row; -} - -.nav-item { - margin-left: 0; -} - -@include media-breakpoint-up(md) { - .nav-item { - margin-left: 0.5rem; - } -} - -/* -@include media-breakpoint-down(sm) { - .nav-item:first-child { - margin-left: 0; - } -} -*/ - -@include media-breakpoint-down(md) { - .navbar .container { - padding-left: 1.5rem; - padding-right: 1.5rem; - } -} - -.break { - flex-basis: 100%; - height: 0; -} - -button#doks-languages { - margin-right: -0.5625rem; - margin-left: 0.75rem; -} - -button#doks-versions { - margin-right: -0.5625rem; - margin-left: 0; -} - -.offcanvas .nav-link { - color: $body-color; -} - -.doks-subnavbar { - background-color: rgba(255, 255, 255, 0.95); - border-bottom: 1px solid $gray-200; -} - -.doks-subnavbar .nav-link { - padding: 0.5rem 1.5rem 0.5rem 0; -} - -.doks-subnavbar .nav-link:first-child { - padding: 0.5rem 1.5rem 0.5rem 0; -} - -.offcanvas .nav-link:hover, -.offcanvas .nav-link:focus { - color: $link-color; -} - -.offcanvas .nav-link.active { - color: $link-color; -} - -/* -.navbar { - background-color: rgba(255, 255, 255, 0.95); - border-bottom: 1px solid $gray-200; - margin-top: 4px; -} -*/ - -.header-bar { - border-top: 4px solid; - border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #d32e9d); - border-image-slice: 1; -} - -.offcanvas .header-bar { - margin-bottom: -4px; -} - -.home .navbar { - border-bottom: 0; -} - -/* -.navbar-form { - position: relative; - margin-top: 0.25rem; -} -*/ - -@include media-breakpoint-up(md) { - .navbar-brand { - margin-right: 0.75rem !important; - } - - .main-nav .nav-item:first-child .nav-link, - .social-nav .nav-item:first-child .nav-link { - padding-left: 0; - } - - .main-nav .nav-item:last-child .nav-link, - .social-nav .nav-item:last-child .nav-link { - padding-right: 0; - } - - .doks-search { - max-width: 20rem; - margin-top: 0.125rem; - margin-bottom: 0.125rem; - } - - /* - .navbar-form { - margin-top: 0; - margin-left: 6rem; - margin-right: 1.5rem; - } - */ -} - -.form-control.is-search { - padding-right: 4rem; - border: 1px solid transparent; - background: $gray-100; -} - -.form-control.is-search:focus { - border: 1px solid $primary; -} - -.doks-search::after { - position: absolute; - top: 0.4625rem; - right: 0.5375rem; - display: flex; - align-items: center; - justify-content: center; - height: 1.5rem; - padding-right: 0.3125rem; - padding-left: 0.3125rem; - font-size: $font-size-base * 0.75; - color: $gray-700; - content: "Ctrl + /"; - border: 1px solid $gray-300; - border-radius: 0.25rem; -} - -/* -@include media-breakpoint-up(lg) { - .navbar-form { - margin-left: 15rem; - } -} - -@include media-breakpoint-up(xl) { - .navbar-form { - margin-left: 30rem; - } -} -*/ - -/* -.form-control.is-search { -*/ - -/* - padding-right: calc(1.5em + 0.75rem); - */ - -/* - padding-right: 2.5rem; - background: $gray-100; - border: 0; - */ - -/* - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); - */ - -/* -} -*/ - -/* -.navbar-form::after { - position: absolute; - top: 0.4625rem; - right: 0.5375rem; - display: flex; - align-items: center; - justify-content: center; - height: 1.5rem; - padding-right: 0.4375rem; - padding-left: 0.4375rem; - font-size: $font-size-base * 0.75; - color: $gray-700; - content: "/"; - border: 1px solid $gray-300; - border-radius: 0.25rem; -} -*/ - -/*! purgecss start ignore */ -.algolia-autocomplete { - display: flex !important; -} - -.algolia-autocomplete .ds-dropdown-menu { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; -} - -@include media-breakpoint-down(sm) { - .algolia-autocomplete .ds-dropdown-menu { - max-width: 512px !important; - min-width: 312px !important; - width: auto !important; - } - - .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column { - font-weight: normal; - } - - .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column::after { - content: "/"; - margin-right: 0.25rem; - } -} - -.algolia-autocomplete .algolia-docsearch-suggestion--category-header { - color: $black; -} - -.algolia-autocomplete .algolia-docsearch-suggestion--title { - margin-bottom: 0; -} - -.algolia-autocomplete .algolia-docsearch-suggestion--highlight { - padding: 0 0.05em; -} - -.algolia-autocomplete .algolia-docsearch-footer { - margin-top: 1rem; - margin-right: 0.5rem; - margin-bottom: 0.5rem; -} - -/*! purgecss end ignore */ - -/* - * Source: https://medium.com/creative-technology-concepts-code/responsive-mobile-dropdown-navigation-using-css-only-7218e4498a99 -*/ - -/* Style the menu icon for the dropdown */ - -.navbar .menu-icon { - cursor: pointer; - - /* display: inline-block; */ - - /* float: right; */ - padding: 1.125rem 0.625rem; - margin: 0 0 0 -0.625rem; - - /* position: relative; */ - user-select: none; -} - -.navbar .menu-icon .navicon { - background: $navbar-light-color; - display: block; - height: 2px; - position: relative; - transition: background 0.2s ease-out; - width: 18px; -} - -.navbar .menu-icon .navicon::before, -.navbar .menu-icon .navicon::after { - background: $navbar-light-color; - content: ""; - display: block; - height: 100%; - position: absolute; - transition: all 0.2s ease-out; - width: 100%; -} - -.navbar .menu-icon .navicon::before { - top: 5px; -} - -.navbar .menu-icon .navicon::after { - top: -5px; -} - -/* Add the icon and menu animations when the checkbox is clicked */ - -.navbar .menu-btn { - display: none; -} - -.navbar .menu-btn:checked ~ .navbar-collapse { - display: block; - max-height: 100vh; -} - -.navbar .menu-btn:checked ~ .menu-icon .navicon { - background: transparent; -} - -.navbar .menu-btn:checked ~ .menu-icon .navicon::before { - transform: rotate(-45deg); -} - -.navbar .menu-btn:checked ~ .menu-icon .navicon::after { - transform: rotate(45deg); -} - -.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::before, -.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::after { - top: 0; -} - -.btn-menu { - margin-left: 1rem; -} - -.btn-menu, -.doks-sidebar-toggle { - padding-right: 0.25rem; - padding-left: 0.25rem; - margin-right: -0.5rem; -} - -.btn-menu:hover, -.btn-doks-light:hover, -.doks-sidebar-toggle:hover { - background: $pink-100; -} - -.btn-menu:focus, -.doks-sidebar-toggle:focus, -.doks-mode-toggle:focus { - outline: 0; -} - -.doks-sidebar-toggle .doks-collapse { - display: none; -} - -.doks-sidebar-toggle:not(.collapsed) .doks-expand { - display: none; -} - -.doks-sidebar-toggle:not(.collapsed) .doks-collapse { - display: inline-block; -} - -.navbar-light .navbar-brand, -.navbar-light .navbar-brand:hover, -.navbar-light .navbar-brand:active { - color: $body-color; -} - -.navbar-light .navbar-nav .active .nav-link { - color: $primary; -} - -.dropdown-divider { - border-top: 1px dashed $gray-200; -} - -.dropdown-item:hover { - background: $gray-100; -} - -.dropdown-item:active { - color: inherit; -} diff --git a/assets/scss/layouts/_pages.scss b/assets/scss/layouts/_pages.scss deleted file mode 100644 index 28102680..00000000 --- a/assets/scss/layouts/_pages.scss +++ /dev/null @@ -1,49 +0,0 @@ -.docs-content > h2[id]::before, -.docs-content > h3[id]::before, -.docs-content > h4[id]::before { - display: block; - height: 6rem; - margin-top: -6rem; - content: ""; -} - -.anchor { - visibility: hidden; - padding-left: 0.5rem; -} - -h1:hover a, -h2:hover a, -h3:hover a, -h4:hover a { - visibility: visible; - text-decoration: none; -} - -.card-list { - margin-top: 2.25rem; -} - -.edit-page { - margin-top: 3rem; - font-size: $font-size-base; -} - -.edit-page svg { - margin-right: 0.5rem; - margin-bottom: 0.25rem; -} - -p.meta { - margin-top: 0.5rem; - font-size: $font-size-base; -} - -.breadcrumb { - margin-top: 2.25rem; - font-size: $font-size-base; -} - -.page-link:hover { - text-decoration: none; -} diff --git a/assets/scss/layouts/_posts.scss b/assets/scss/layouts/_posts.scss deleted file mode 100644 index da276605..00000000 --- a/assets/scss/layouts/_posts.scss +++ /dev/null @@ -1,28 +0,0 @@ -.home .card, -.contributors.list .card, -.blog.list .card { - margin-top: 2rem; - margin-bottom: 2rem; - transition: transform 0.3s; -} - -.home .card:hover, -.contributors.list .card:hover, -.blog.list .card:hover { - transform: scale(1.025); -} - -.home .card-body, -.contributors.list .card-body, -.blog.list .card-body { - padding: 0 2rem 1rem; -} - -.blog-header { - text-align: center; - margin-bottom: 2rem; -} - -.blog-footer { - text-align: center; -} diff --git a/assets/scss/layouts/_sidebar.scss b/assets/scss/layouts/_sidebar.scss deleted file mode 100644 index 46881bd0..00000000 --- a/assets/scss/layouts/_sidebar.scss +++ /dev/null @@ -1,110 +0,0 @@ -.docs-links, -.docs-toc { - scrollbar-width: thin; - scrollbar-color: $white $white; -} - -.docs-links::-webkit-scrollbar, -.docs-toc::-webkit-scrollbar { - width: 5px; -} - -.docs-links::-webkit-scrollbar-track, -.docs-toc::-webkit-scrollbar-track { - background: $white; -} - -.docs-links::-webkit-scrollbar-thumb, -.docs-toc::-webkit-scrollbar-thumb { - background: $white; -} - -.docs-links:hover, -.docs-toc:hover { - scrollbar-width: thin; - scrollbar-color: $gray-200 $white; -} - -.docs-links:hover::-webkit-scrollbar-thumb, -.docs-toc:hover::-webkit-scrollbar-thumb { - background: $gray-200; -} - -.docs-links::-webkit-scrollbar-thumb:hover, -.docs-toc::-webkit-scrollbar-thumb:hover { - background: $gray-200; -} - -.docs-links h3, -.page-links h3 { - text-transform: uppercase; - font-size: $font-size-base; - margin: 1.25rem 0 0.5rem 0; - padding: 1.5rem 0 0 0; -} - -@include media-breakpoint-up(lg) { - .docs-links h3, - .page-links h3 { - margin: 1.125rem 1.5rem 0.75rem 0; - padding: 1.375rem 0 0 0; - } -} - -.docs-links h3:not(:first-child) { - border-top: 1px solid $gray-200; -} - -a.docs-link { - color: $body-color; - display: block; - padding: 0.125rem 0; - font-size: $font-size-base; -} - -.page-links li { - margin-top: 0.375rem; - padding-top: 0.375rem; -} - -.page-links li ul li { - border-top: none; - padding-left: 1rem; - margin-top: 0.125rem; - padding-top: 0.125rem; -} - -.page-links li:not(:first-child) { - border-top: 1px dashed $gray-200; -} - -.page-links a { - color: $body-color; - display: block; - padding: 0.125rem 0; - font-size: $font-size-base * 0.9375; -} - -.docs-link:hover, -.docs-link.active, -.page-links a:hover { - text-decoration: none; - color: $link-color; -} - -.docs-links h3.sidebar-link, -.page-links h3.sidebar-link { - text-transform: none; - font-size: $font-size-md; - font-weight: normal; -} - -.docs-links h3.sidebar-link a, -.page-links h3.sidebar-link a { - color: $body-color; -} - -.docs-links h3.sidebar-link a:hover, -.page-links h3.sidebar-link a:hover { - text-decoration: underline; -} diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index ce9c9de0..00000000 --- a/babel.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - presets: [ - [ - '@babel/preset-env', - { - targets: { - browsers: [ - // Best practice: https://github.com/babel/babel/issues/7789 - '>=1%', - 'not ie 11', - 'not op_mini all' - ] - } - } - ] - ] -}; \ No newline at end of file diff --git a/blog/achieving-bare-metal-performance-within-a-virtual-machine/index.html b/blog/achieving-bare-metal-performance-within-a-virtual-machine/index.html new file mode 100644 index 00000000..e9cc67fc --- /dev/null +++ b/blog/achieving-bare-metal-performance-within-a-virtual-machine/index.html @@ -0,0 +1,93 @@ +Achieving Bare Metal Performance Within a Virtual Machine - Cloud Hypervisor

Achieving Bare Metal Performance Within a Virtual Machine

Posted May 19, 2022 by Sebastien Boeuf ‐ 7 min read

There are use cases for which a workload needs to access specific hardware such +as accelerators, GPU or network adapters to maximise potential performance. And +since these workloads run inside virtual machines (VM) for security reasons, the +challenge is to make this hardware available from within the VM, but without +degrading the performance that can be achieved from bare metal.

VFIO, the Ideal Choice

This is a mature framework allowing a PCI device to be bound to the vfio-pci +driver instead of the default driver it is usually attached to.

It exposes an ioctl interface so that a userspace program can interact with the +device and retrieve all the information it needs. In the virtualization case, +this userspace program is the Virtual Machine Monitor (VMM), Cloud Hypervisor +for instance, which after it got all the information from the device, exposes +them to the guest. And that is how the workload can access the device inside the +VM, exactly the same way it would if it was directly running on bare metal.

Now that we’ve covered the functional aspect, let’s have a look at the way we +can achieve bare metal performance from the guest.

The main idea for not degrading performance is to avoid as much as possible to +trigger VM exits when the workload interacts with the device, as well as when +it receives interrupts from it.

Base Address Registers

First, we can look at the PCI Base Address Registers (BAR). We need to prevent +a BAR access from generating a VM exit. This is done by mapping the device +region directly into the VMM virtual address space, and make this same region a +user memory region at the hypervisor level. This means we tell KVM to inform +the CPU it can find the pages related to this region directly at a specific +address in physical RAM. Once this is properly configured, any memory access +from guest workload to one of the device’s PCI BARs will result in a direct +access to physical RAM from the CPU as it can find the pages from the Extended +Page Table (EPT).

There’s one small part of the BARs for which we can’t avoid VM exits, the MSI-X +tables. MSI-X specification expects the vector table and pending bit array to be +part of the device BARs. But the VMM needs to trap every access to these tables +since it’s responsible for configuring the interrupts both at the KVM and VFIO +levels. This is important to note this doesn’t impact the performance of the +device when being used by the guest. The interrupt vectors are only configured +during the initialization of the device driver, which is already completed at +the time the workload interacts with the device.

Direct Memory Accesses

The second aspect, the main one actually, is how Direct Memory Access (DMA) is +performed securely without generating any VM exit. DMA is the standard way for +a device to access physical RAM without involving CPU cycles, which allows the +device to achieve very high performance. In the context of virtualization, we +want to reuse this mechanism, but without allowing a malicious guest to use this +device to reach every address from physical RAM. That’s where the IOMMU comes +into play, as the gatekeeper of RAM accesses from any device on the machine. +The VMM is responsible for configuring the IOMMU through the VFIO interface. It +provides the set of pages that can be accessed from a specific device, which +usually means the entire guest RAM. This information is stored in the DMA +Remapping (DMAR) table as part of the IOMMU. Whenever the workload initiate a +DMA transfer between the device and the guest RAM, the IOMMU will allow such +access, but if the address is outside the authorized range, the IOMMU will +prevent the transfer from happening. That’s how security is enforced in the +virtualization context.

Since DMA doesn’t involve CPU to access the memory, a DMA transfer doesn’t +trigger any VM exit, providing identical performance to what can be observed +on bare metal.

Interrupts

Third and last aspect, the interrupts. Depending on the type of device, we can +see a lot of interrupts being generated, which can trigger a large amount of VM +exits, affecting directly the performance of the device inside the VM.

The way to avoid such disruption is by relying on fairly recent hardware to +leverage a feature called Posted Interrupts (PI). This is both part of the CPU +with the virtual APIC (APICv) and the IOMMU through the Interrupt Remapping (IR) +table. When the hardware supports it, the hypervisor on behalf of the VMM will +configure the IOMMU by adding new entries to the IR table. Later on, whenever +an interrupt is triggered, the IOMMU will check the IR table to find out the PI +descriptor associated with it. It then triggers the correct interrupt inside the +guest relying on the APICv. This whole chain of events is entirely handled in +hardware, meaning there’s no VM exit involved, which doesn’t lead to any drop +in performance.

How To Use VFIO

For more details on how to use VFIO with Cloud Hypervisor, refer to the +following documentation.

vDPA, an Interesting Alternative

vDPA stands for virtio Data Path Acceleration, and the main reason this new +framework exists is its ability to simplify the migration process. The whole +concept behind vDPA relies on the virtio specification, which is what makes it +more suited for migration.

Control Path

On the one hand, the virtio control path is used for configuring the virtqueues +and getting information about the device. This is achieved through the ioctl +interface that is accessible through the device node /dev/vhost-vdpa. The +userspace program, the VMM again, retrieves all the information it needs so it +can expose the correct type of virtio device to the guest, with the right amount +of queues, the size of each queue, and the virtio configuration associated with.

Data Path

On the other hand, the virtio data path, effectively the virtqueues themselves, +is used to transfer the data between frontend in the guest and backend from the +host. But in this very special case, the virtqueues are directly part of the +physical device, allowing DMA transfers to be initiated by the guest. And the +same way it works with VFIO because the device is also attached to a physical +IOMMU, the guest can perform secure and efficient memory accesses from the +device.

Migration (experimental)

Providing a simpler path for migrating physical devices from one VM to another +is one of the main reason vDPA was created. Because of the design relying on +virtqueues, most of the migration complexity can be handled by the VMM, without +the need for the vDPA device to provide an opaque blob of data that will have to +be restored on the destination VM. That’s where it differentiates from the VFIO +approach, which will require every vendor to implement the VFIO migration API as +part of their driver, providing an opaque blob specific to each device.

It’s important to note that VFIO migration API is very recent and not heavily +tested and deployed, meaning you might want to wait for a bit before jumping +to it.

For vDPA, which is a very recent addition to the Linux kernel, the migration +isn’t fully figured out yet by the maintainers since it still requires some +extra support through the virtio specification that will allow to stop a device +before it can be migrated. +There’s an alternative approach implemented in software part of the Data Plan +Development Kit (DPDK). It shadows the virtqueues to have complete knowledge of +what is happening inside the queues, and therefore at any point in time it can +stop the device and start migrating.

How To Use vDPA

For more details on how to use vDPA with Cloud Hypervisor, refer to the +following documentation.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.10.0-released/index.html b/blog/cloud-hypervisor-v0.10.0-released/index.html new file mode 100644 index 00000000..53a3ae8b --- /dev/null +++ b/blog/cloud-hypervisor-v0.10.0-released/index.html @@ -0,0 +1,11 @@ +Cloud Hypervisor v0.10.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.10.0 Released!

Posted September 18, 2020 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the 0.10.0 project.

Highlights for cloud-hypervisor version 0.10.0 include:

virtio-block Support for Multiple Descriptors

Some virtio-block device drivers may generate requests with multiple descriptors and support has been added for those drivers.

Memory Zones

Support has been added for fine grained control of memory allocation for the guest. This includes controlling the backing of sections of guest memory, assigning to specific host NUMA nodes and assigning memory and vCPUs to specific memory nodes inside the guest. Full details of this can be found in the memory documentation.

Seccomp Sandbox Improvements

All the remaining threads and devices are now isolated within their own seccomp filters. This provides a layer of sandboxing and enhances the security model of cloud-hypervisor.

Preliminary KVM HyperV Emulation Control

A new option (kvm_hyperv) has been added to --cpus to provide an option to toggle on KVM’s HyperV emulation support. This enables progress towards booting Windows without adding extra emulated devices.

Notable Bug Fixes

  • When using ch-remote to resize the VM parameter now accepts the standard sizes suffices (#1596)
  • cloud-hypervisor no longer panics when started with --memory hotplug_method=virtio-mem and no hotplug_size (#1564)
  • After a reboot memory can remove when using --memory hotplug_method=virtio-mem (#1593)
  • --version shows the version for released binaries (#1669)
  • Errors generated by worker threads for virtio devices are now printed out (#1551)

Contributors

Many thanks to everyone who has contributed to our 0.10.0 release including some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.11.0-released/index.html b/blog/cloud-hypervisor-v0.11.0-released/index.html new file mode 100644 index 00000000..4b9a76ba --- /dev/null +++ b/blog/cloud-hypervisor-v0.11.0-released/index.html @@ -0,0 +1,35 @@ +Cloud Hypervisor v0.11.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.11.0 Released!

Posted October 29, 2020 by Cloud Hypervisor Team ‐ 3 min read

v0.11.0

This release has been tracked through the 0.11.0 project.

Highlights for cloud-hypervisor version 0.11.0 include:

io_uring support by default for virtio-block

Provided that the host OS supports it (Linux kernel 5.8+) then io_uring will +be used for a significantly higher performance block device.

Windows Guest Support

This is the first release where we officially support Windows running as a +guest. Full details of how to setup the image and run Cloud Hypervisor with a +Windows guest can be found in the dedicated Windows +documentation.

vhost-user “Self Spawning” Deprecation

Automatically spawning a vhost-user-net or vhost-user-block backend is now +deprecated. Users of this functionality will receive a warning and should make +adjustments. The functionality will be removed in the next release.

virtio-mmmio Removal

Support for using the virtio-mmio transport, rather than using PCI, has been +removed. This has been to simplify the code and significantly +reduce the testing burden of the project.

Snapshot/Restore support for ARM64

When running on the ARM64 architecture snapshot and restore has now been +implemented.

Improved Linux Boot Time

The time to boot the Linux kernel has been significantly improved by the +identifying some areas of delays around PCI bus probing, IOAPIC programming and +MPTABLE issues. Full details can be seen in #1728.

SIGTERM/SIGINT Interrupt Signal Handling

When the VMM process receives the SIGTERM or SIGINT signals then it will +trigger the VMM process to cleanly deallocate resources before exiting. The +guest VM will not be cleanly shutdown but the VMM process will clean up its +resources.

Default Log Level Changed

The default logging level was changed to include warnings which should make it +easier to see potential issues. New logging +documentation was also added.

New --balloon Parameter Added

Control of the setup of virtio-balloon has been moved from --memory to its +own dedicated parameter. This makes it easier to add more balloon specific +controls without overloading --memory.

Experimental virtio-watchdog Support

Support for using a new virtio-watchdog has been added which can be used to +have the VMM reboot the guest if the guest userspace fails to ping the +watchdog. This is enabled with --watchdog and requires kernel support.

Notable Bug Fixes

  • MTRR bit was missing from CPUID advertised to guest
  • “Return” key could not be used under CMD.EXE under Windows SAC (#1170)
  • CPU identification string is now exposed to the guest
  • virtio-pmem withdiscard_writes=on no longer marks the guest memory as +read only so avoids excessive VM exits (#1795)
  • PCI device hotplug after an unplug was fixed (#1802)
  • When using the ACPI method to resize the guest memory the full reserved size +can be used (#1803)
  • Snapshot and restore followed by a second snapshot and restore now works +correctly
  • Snapshot and restore of VMs with more than 2GiB in one region now work +correctly

Contributors

Many thanks to everyone who has contributed to our 0.11.0 release including some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.12.0-released/index.html b/blog/cloud-hypervisor-v0.12.0-released/index.html new file mode 100644 index 00000000..37e19e0b --- /dev/null +++ b/blog/cloud-hypervisor-v0.12.0-released/index.html @@ -0,0 +1,18 @@ +Cloud Hypervisor v0.12.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.12.0 Released!

Posted December 10, 2020 by Cloud Hypervisor Team ‐ 1 min read

This release has been tracked through the 0.12.0 project.

Highlights for cloud-hypervisor version 0.12.0 include:

ARM64 enhancements

The use of --watchdog is now fully supported as is the ability to reboot the +VM from within the guest when running Cloud Hypervisor on an ARM64 system.

Removal of vhost-user-net and vhost-user-block self spawning

In order to use vhost-user-net or vhost-user-block backends the user is now +responsible for starting the backend and providing the socket for the VMM to +use. This functionality was deprecated in the last release and how now been +removed.

Migration of vhost-user-fs backend

The vhost-user-fs backend is no longer included in Cloud Hypervisor and it is +instead hosted in it’s own +repository

Enhanced “info” API

The vm.info HTTP API endpoint has been extended to include the details of the +devices used by the VM including any VFIO devices used.

Contributors

Many thanks to everyone who has contributed to our 0.12.0 release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.13.0-released/index.html b/blog/cloud-hypervisor-v0.13.0-released/index.html new file mode 100644 index 00000000..d38c6bc3 --- /dev/null +++ b/blog/cloud-hypervisor-v0.13.0-released/index.html @@ -0,0 +1,28 @@ +Cloud Hypervisor v0.13.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.13.0 Released!

Posted February 12, 2021 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the 0.13.0 project.

Highlights for cloud-hypervisor version 0.13.0 include:

Wider VFIO device support

It is now possible to use Cloud Hypervisor’s VFIO support to passthrough PCI +devices that do not support MSI or MSI-X and instead rely on INTx interrupts. +Most notably this widens the support to most NVIDIA cards with the proprietary +drivers.

Improve huge page support

Through the addition of hugepage_size on --memory it is now possible to +specify the desired size of the huge pages used when allocating the guest +memory. The user is required to ensure they have sufficient pages of the +desired size in their pool.

MACvTAP support

It is now possible to provide file descriptors using the fd parameter to +--net which point at TAP devices that have already been opened by the user. +This aids integration with libvirt but also permits the use of MACvTAP +support. This is documented in dedicated macvtap documentation.

VHD disk image support

It is now possible to use VHD (fixed) disk images as well as QCOWv2 and raw +disk image with Cloud Hypervisor.

Improved Virtio device threading

Device threads are now derived from the main VMM thread which allows more +restrictive seccomp filters to be applied to them. The threads also have a +predictable name derived from the device id.

Clean shutdown support via synthetic power button

It is now possible to request that the guest VM shut itself down by triggering +a synthetic ACPI power button press from the VMM. If the guest is listening for +such an event (e.g. using systemd) then it will process the event and cleanly +shut down. This functionality is exposed through the HTTP API and can be +triggered via ch-remote --api-socket=<API socket> power-button.

Contributors

Many thanks to everyone who has contributed to our 0.13.0 release including +some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.14.0-released/index.html b/blog/cloud-hypervisor-v0.14.0-released/index.html new file mode 100644 index 00000000..cdb29c9e --- /dev/null +++ b/blog/cloud-hypervisor-v0.14.0-released/index.html @@ -0,0 +1,25 @@ +Cloud Hypervisor v0.14.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.14.0 Released!

Posted March 26, 2021 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the 0.14.0 project.

Highlights for cloud-hypervisor version 0.14.0 include:

Structured event monitoring

A new option was added to the VMM --event-monitor which reports structured +events (JSON) over a file or file descriptor at key events in the lifecycle of +the VM. The list of events is limited at the moment but will be further +extended over subsequent releases. The events exposed form part of the Cloud +Hypervisor API surface.

MSHV improvements

Basic support has been added for running Windows guests atop the MSHV +hypervisor as an alternative to KVM and further improvements have been made to +the MSHV support.

Improved aarch64 platform

The aarch64 platform has been enhanced with more devices exposed to the running +VM including an enhanced serial UART.

Updated hotplug documentation

The documentation for the hotplug support has been updated to reflect the use +of the ch-remote tool and to include details of virtio-mem based hotplug as +well as documenting hotplug of paravirtualised and VFIO devices.

PTY control for serial and virtio-console

The --serial and --console parameters can now direct the console to a PTY +allowing programmatic control of the console from another process through the +PTY subsystem.

Block device rate limiting

The block device performance can now be constrained as part of the VM +configuration allowing rate limiting. Full details of the controls are in the +IO throttling doumentation.

Deprecations

Deprecated features will be removed in a subsequent release and users should plan to use alternatives

  • Support for booting with the “LinuxBoot” protocol for ELF and bzImage +binaries has been deprecated. When using direct boot users should configure +their kernel with CONFIG_PVH=y.

Contributors

Many thanks to everyone who has contributed to our 0.14.0 release including +some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.14.1-released/index.html b/blog/cloud-hypervisor-v0.14.1-released/index.html new file mode 100644 index 00000000..2e05d707 --- /dev/null +++ b/blog/cloud-hypervisor-v0.14.1-released/index.html @@ -0,0 +1,10 @@ +Cloud Hypervisor v0.14.1 Released! - Cloud Hypervisor

Cloud Hypervisor v0.14.1 Released!

Posted March 31, 2021 by Cloud Hypervisor Team ‐ 1 min read

Bug fix release branched off the v0.14.0 release. The following bugs +were fixed in this release:

  • CPU hotplug on Windows failed due to misreported CPU state information and +the lack of HyperV CPUID bit enabled (#2437, #2449, #2436)
  • A seccomp rule was missing that was triggered on CPU unplug (#2455)
  • A bounds check in VIRTIO queue validation was erroneously generating +DescriptorChainTooShort errors in certain circumstances (#2450, #2424)

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.2.0-released/index.html b/blog/cloud-hypervisor-v0.2.0-released/index.html new file mode 100644 index 00000000..95e72f3d --- /dev/null +++ b/blog/cloud-hypervisor-v0.2.0-released/index.html @@ -0,0 +1,33 @@ +Cloud Hypervisor v0.2.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.2.0 Released!

Posted September 10, 2019 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the 0.2.0 project.

Highlights for cloud-hypervisor version 0.2.0 include:

Network device offloading

As part of our general effort to offload paravirtualized I/O to external +processes, we added support for +vhost-user-net backends. This +enables cloud-hypervisor users to plug a vhost-user based networking device +(e.g. DPDK) into the VMM as their virtio network backend.

Minimal hardware-reduced ACPI

In order to properly implement and guest reset and shutdown, we implemented +a minimal version of the hardware-reduced ACPI specification. Together with +a tiny I/O port based ACPI device, this allows cloud-hypervisor guests to +cleanly reboot and shutdown.

The ACPI implementation is a cloud-hypervisor build time option that is +enabled by default.

Debug I/O port

Based on the Firecracker idea of using a dedicated I/O port to measure guest +boot times, we added support for logging guest events through the +0x80 +PC debug port. This allows, among other things, for granular guest boot time +measurements. See our debug port documentation +for more details.

Improved direct device assignment

We fixed a major performance issue with our initial VFIO implementation: When +enabling VT-d through the KVM and VFIO APIs, our guest memory writes and reads +were (in many cases) not cached. After correctly tagging the guest memory from +cloud-hypervisor we’re now able to reach the expected performance from +directly assigned devices.

Improved shared filesystem

We added shared memory region with DAX +support to our virtio-fs shared file system. +This provides better shared filesystem IO performance with a smaller guest +memory footprint.

Ubuntu bionic based CI

Thanks to our simple KVM firmware +improvements, we are now able to boot Ubuntu bionic images. We added those to +our CI pipeline.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.3.0-released/index.html b/blog/cloud-hypervisor-v0.3.0-released/index.html new file mode 100644 index 00000000..43b4c6db --- /dev/null +++ b/blog/cloud-hypervisor-v0.3.0-released/index.html @@ -0,0 +1,13 @@ +Cloud Hypervisor v0.3.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.3.0 Released!

Posted October 18, 2019 by Cloud Hypervisor Team ‐ 2 min read

v0.3.0

This release has been tracked through the 0.3.0 project.

Highlights for cloud-hypervisor version 0.3.0 include:

Block device offloading

We continue to work on offloading paravirtualized I/O to external processes, and we added support for vhost-user-blk backends. +This enables cloud-hypervisor users to plug a vhost-user based block device like SPDK) into the VMM as their paravirtualized storage backend.

Network device backend

The previous release provided support for vhost-user-net backends. Now we also provide a TAP based vhost-user-net backend, implemented in Rust. Together with the vhost-user-net device implementation, this will eventually become the Cloud Hypervisor default paravirtualized networking architecture.

Virtual sockets

In order to more efficiently and securely communicate between host and guest, we added an hybrid implementation of the VSOCK socket address family over virtio. Credits go to the Firecracker project as our implementation is a copy of theirs.

HTTP based API

In anticipation of the need to support asynchronous operations to Cloud Hypervisor guests (e.g. resources hotplug and guest migration), we added a HTTP based API to the VMM. The API will be more extensively documented during the next release cycle.

Memory mapped virtio transport

In order to support potential PCI-free use cases, we added support for the virtio MMIO transport layer. This will allow us to support simple, minimal guest configurations that do not require a PCI bus emulation.

Paravirtualized IOMMU

As we want to improve our nested guests support, we added support for exposing a paravirtualized IOMMU device through virtio. This allows for a safer nested virtio and directly assigned devices support.

To add the IOMMU support, we had to make some CLI changes for Cloud Hypervisor users to be able to specify if devices had to be handled through this virtual IOMMU or not. In particular, the --disk option now expects disk paths to be prefixed with a path= string, and supports an optional iommu=[on|off] +setting.

Ubuntu 19.10

With the latest hypervisor firmware, we can now support the latest Ubuntu 19.10 (Eoan Ermine) cloud images.

Large memory guests

After simplifying and changing our guest address space handling, we can now support guests with large amount of memory (more than 64GB).

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.4.0-released/index.html b/blog/cloud-hypervisor-v0.4.0-released/index.html new file mode 100644 index 00000000..2911dfb3 --- /dev/null +++ b/blog/cloud-hypervisor-v0.4.0-released/index.html @@ -0,0 +1,38 @@ +Cloud Hypervisor v0.4.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.4.0 Released!

Posted December 13, 2019 by Cloud Hypervisor Team ‐ 3 min read

This release has been tracked through the 0.4.0 project.

Highlights for cloud-hypervisor version 0.4.0 include:

Dynamic virtual CPUs addition

As a way to vertically scale Cloud-Hypervisor guests, we now support dynamically +adding virtual CPUs to the guests, a mechanism also known as CPU hot plug. +Through hardware-reduced ACPI notifications, Cloud Hypervisor can now add CPUs +to an already running guest and the high level operations for that process are +documented here

During the next release cycles we are planning to extend Cloud Hypervisor +hot plug framework to other resources, namely PCI devices and memory.

Programmatic firmware tables generation

As part of the CPU hot plug feature enablement, and as a requirement for hot +plugging other resources like devices or RAM, we added support for +programmatically generating the needed ACPI tables. Through a dedicated +acpi-tables crate, we now have a flexible and clean way of generating those +tables based on the VMM device model and topology.

Filesystem and block devices vhost-user backends

Our objective of running all Cloud Hypervisor paravirtualized I/O to a +vhost-user based framework is getting closer as we’ve added Rust based +implementations for vhost-user-blk and virtiofs backends. Together with the +vhost-user-net backend that came with the 0.3.0 release, this will form the +default Cloud Hypervisor I/O architecture.

Guest pause and resume

As an initial requiremnt for enabling live migration, we added support for +pausing and resuming any VMM components. As an intermediate step towards live +migration, the upcoming guest snapshotting feature will be based on the pause +and resume capabilities.

Userspace IOAPIC by default

As a way to simplify our device manager implementation, but also in order to +stay away from privileged rings as often as possible, any device that relies on +pin based interrupts will be using the userspace IOAPIC implementation by +default.

PCI BAR reprogramming

In order to allow for a more flexible device model, and also support guests +that would want to move PCI devices, we added support for PCI devices BAR +reprogramming.

New cloud-hypervisor organization

As we wanted to be more flexible on how we manage the Cloud Hypervisor project, +we decided to move it under a dedicated GitHub organization. +Together with the cloud-hypervisor +project, this new organization also now hosts our kernel +and firmware +repositories. We may also use it to host any rust-vmm that we’d need to +temporarily fork. +Thanks to GitHub’s seamless repository redirections, the move is completely +transparent to all Cloud Hypervisor contributors, users and followers.

Contributors

Many thanks to everyone that contributed to the 0.4.0 release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.5.0-released/index.html b/blog/cloud-hypervisor-v0.5.0-released/index.html new file mode 100644 index 00000000..be75de8a --- /dev/null +++ b/blog/cloud-hypervisor-v0.5.0-released/index.html @@ -0,0 +1,11 @@ +Cloud Hypervisor v0.5.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.5.0 Released!

Posted February 7, 2020 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the 0.5.0 project.

Highlights for cloud-hypervisor version 0.5.0 include:

Virtual Machine Dynamic Resizing

With 0.4.0 we added support for CPU hot plug, and 0.5.0 adds CPU hot unplug and memory hot plug as well. This allows to dynamically resize Cloud Hypervisor guests which is needed for e.g. Kubernetes related use cases. +The memory hot plug implementation is based on the same framework as the CPU hot plug/unplug one, i.e. hardware-reduced ACPI notifications to the guest.

Next on our VM resizing roadmap is the PCI devices hotplug feature.

Multi-Queue, Multi-Threaded Paravirtualization

We enhanced our virtio networking and block support by having both devices use multiple I/O queues handled by multiple threads. This improves our default paravirtualized networking and block devices throughput.

New Interrupt Management Framework

We improved our interrupt management implementation by introducing an Interrupt Manager framework, based on the currently on-going rust-vmm vm-device crates discussions. This move made the code significantly cleaner, and allowed us to remove several KVM related dependencies from crates like the PCI and virtio ones.

Development Tools

In order to provide a better developer experience, we worked on improving our build, development and testing tools. +Somehow similar to the excellent Firecracker’s devtool, we now provide a dev_cli script.

With this new tool, our users and contributors will be able to build and test Cloud Hypervisor through a containerized environment.

Kata Containers Integration

We spent some significant time and efforts debugging and fixing our integration with the Kata Containers project. Cloud Hypervisor is now a fully supported Kata Containers hypervisor, and is integrated into the project’s CI.

Contributors

Many thanks to everyone that contributed to the 0.5.0 release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.6.0-released/index.html b/blog/cloud-hypervisor-v0.6.0-released/index.html new file mode 100644 index 00000000..e610c66f --- /dev/null +++ b/blog/cloud-hypervisor-v0.6.0-released/index.html @@ -0,0 +1,30 @@ +Cloud Hypervisor v0.6.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.6.0 Released!

Posted March 20, 2020 by Cloud Hypervisor Team ‐ 2 min read

v0.6.0

This release has been tracked through the 0.6.0 project.

Highlights for cloud-hypervisor version 0.6.0 include:

Directly Assigned Devices Hotplug

We continued our efforts around supporting dynamically changing the guest +resources. After adding support for CPU and memory hotplug, Cloud Hypervisor +now supports hot plugging and hot unplugging directly assigned (a.k.a. VFIO) +devices into an already running guest. This closes the features gap for +providing a complete Kata Containers workloads support with Cloud Hypervisor.

Shared Filesystem Improvements

We enhanced our shared filesystem support through many virtio-fs improvements. +By adding support for DAX, parallel processing of multiple requests, FS_IO, +LSEEK and the MMIO virtio transport layer to our vhost_user_fs daemon, we +improved our filesystem sharing performance, but also made it more stable and +compatible with other virtio-fs implementations.

Block and Networking IO Self Offloading

When choosing to offload the paravirtualized block and networking I/O to an +external process (through the vhost-user protocol), Cloud Hypervisor now +automatically spawns its default vhost-user-blk and vhost-user-net backends +into their own, separate processes. +This provides a seamless parvirtualized I/O user experience for those who want +to run their guest I/O into separate executions contexts.

Command Line Interface

More and more Cloud Hypervisor services are exposed through the +Rest API and thus only accessible via relatively cumbersome HTTP calls. In order +to abstract those calls into a more user friendly tool, we created a Cloud +Hypervisor Command Line Interface (CLI) called ch-remote. +The ch-remote binary is created with each build and available e.g. at +cloud-hypervisor/target/debug/ch-remote when doing a debug build.

Please check ch-remote --help for a complete description of all available +commands.

PVH Boot

In addition to the traditional Linux boot protocol, Cloud Hypervisor now +supports direct kernel booting through the PVH ABI.

Contributors

With the 0.6.0 release, we are welcoming a few new contributors. Many thanks +to them and to everyone that contributed to this release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.7.0-released/index.html b/blog/cloud-hypervisor-v0.7.0-released/index.html new file mode 100644 index 00000000..0ec22958 --- /dev/null +++ b/blog/cloud-hypervisor-v0.7.0-released/index.html @@ -0,0 +1,41 @@ +Cloud Hypervisor v0.7.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.7.0 Released!

Posted April 30, 2020 by Cloud Hypervisor Team ‐ 3 min read

This release has been tracked through the 0.7.0 project.

Highlights for cloud-hypervisor version 0.7.0 include:

Block, Network, Persistent Memory (PMEM), VirtioFS and Vsock hotplug

Further to our effort to support modifying a running guest we now support +hotplug and unplug of the following virtio backed devices: block, network, +pmem, virtio-fs and vsock. This functionality is available on the (default) PCI +based tranport and is exposed through the HTTP API. The ch-remote utility +provides a CLI for adding or removing these device types after the VM has +booted. User can use the id parameter on the devices to choose names for +devices to ease their removal.

Alternative libc Support

Cloud Hypervisor can now be compiled with the musl C library and this release +contains a static binary compiled using that toolchain.

Multithreaded Multi Queued vhost-user Backends

The vhost-user backends for network and block support that are shipped by +Cloud Hypervisor have been enhanced to support multiple threads and queues to +improve throughput. These backends are used automatically if vhost_user=true +is passed when the devices are created.

Initial RamFS Support

By passing the --initramfs command line option the user can specify a file to +be loaded into the guest memory to be used as the kernel initial filesystem. +This is usually used to allow the loading of drivers needed to be able to +access the real root filesystem but it can also be used standalone for a very +minimal image.

Alternative Memory Hotplug: virtio-mem

As well as supporting ACPI based hotplug Cloud Hypervisor now supports using +the virtio-mem hotplug alternative. This can be controlled by the +hotplug_method parameter on the --memory command line option. It currently +requires kernel patches to be able to support it.

Seccomp Sandboxing

Cloud Hypervisor now has support for restricting the system calls that the +process can use via the seccomp security API. This on by default and is +controlled by the --seccomp command line option.

Updated Distribution Support

With the release of Ubuntu 20.04 we have added that to the list of supported +distributions and is part of our regular testing programme.

Command Line and API Changes

This is non exhaustive list of HTTP API and command line changes

  • New id fields added for devices to allow them to be named to ease removal. +If no name is specified the VMM chooses one.
  • Use --memory’s shared and hugepages controls for determining backing +memory instead of providing a path.
  • The --vsock parameter only takes one device as the Linux kernel only +supports a single Vsock device. The REST API has removed the vector for this +option and replaced it with a single optional field.
  • There is enhanced validation of the command line and API provided +configurations to ensure that the provided options are compatible e.g. that +shared memory is in use if any attempt is made to used a vhost-user backed +device.
  • ch-remote has added add-disk, add-fs, add-net, add-pmem and +add-vsock subcommands. For removal remove-device is used. The REST API +has appropriate new HTTP endpoints too.
  • Specifying a size with --pmem is no longer required and instead the size +will be obtained from the file. A discard_writes option has also been added +to provide the equivalent of a read-only file.
  • The parameters to --block-backend have been changed to more closely align +with those used by --disk.

Contributors

Many thanks to everyone who has contributed to our 0.7.0 release including some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.8.0-released/index.html b/blog/cloud-hypervisor-v0.8.0-released/index.html new file mode 100644 index 00000000..c88d890f --- /dev/null +++ b/blog/cloud-hypervisor-v0.8.0-released/index.html @@ -0,0 +1,34 @@ +Cloud Hypervisor v0.8.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.8.0 Released!

Posted June 11, 2020 by Cloud Hypervisor Team ‐ 3 min read

v0.8.0

This release has been tracked through the 0.8.0 project.

Highlights for cloud-hypervisor version 0.8.0 include:

Experimental Snapshot and Restore Support

This release includes the first version of the snapshot and restore feature. +This allows a VM to be paused and then subsequently snapshotted. At a later +point that snapshot may be restored into a new running VM identical to the +original VM at the point it was paused.

This feature can be used for offline migration from one VM host to another, to +allow the upgrading or rebooting of the host machine transparently to the guest +or for templating the VM. This is an experimental feature and cannot be used on +a VM using passthrough (VFIO) devices. Issues with SMP have also been observed +(#1176).

Experimental ARM64 Support

Included in this release is experimental support for running on ARM64. +Currently only virtio-mmio devices and a serial port are supported. Full +details can be found in the ARM64 documentation.

Support for Using 5-level Paging in Guests

If the host supports it the guest is now enabled for 5-level paging (aka LA57). +This works when booting the Linux kernel with a vmlinux, bzImage or firmware +based boot. However booting an ELF kernel built with CONFIG_PVH=y does not +work due to current limitations in the PVH boot process.

Virtio Device Interrupt Suppression for Network Devices

With virtio-net and vhost-user-net devices the guest can suppress +interrupts from the VMM by using the VIRTIO_RING_F_EVENT_IDX feature. This +can lead to an improvement in performance by reducing the number of interrupts +the guest must service.

vhost_user_fs Improvements

The implementation in Cloud Hypervisor of the VirtioFS server now supports sandboxing itself with seccomp.

Notable Bug Fixes

  • VMs that have not yet been booted can now be deleted (#1110).
  • By creating the tap device ahead of creating the VM it is not required to +run the cloud-hypervisor binary with CAP_NET_ADMIN (#1273).
  • Block I/O via virtio-block or vhost-user-block now correctly adheres to +the specification and synchronizes to the underlying filesystem as required +based on guest feature negotiation. This avoids potential data loss (#399, +#1216).
  • When booting with a large number of vCPUs then the ACPI table would be +overwritten by the SMP MPTABLE. When compiled with the acpi feature the +MPTABLE will no longer be generated (#1132).
  • Shutting down VMs that have been paused is now supported (#816).
  • Created socket files are deleted on shutdown (#1083).
  • Trying to use passthrough devices (VFIO) will be rejected on mmio builds +(#751).

Command Line and API Changes

This is non exhaustive list of HTTP API and command line changes:

  • All user visible socket parameters are now consistently called socket +rather than sock in some cases.
  • The ch-remote tool now shows any error message generated by the VMM
  • The wce parameter has been removed from --disk as the feature is always +offered for negotiation.
  • --net has gained a host_mac option that allows the setting of the MAC +address for the tap device on the host.

Contributors

Many thanks to everyone who has contributed to our 0.8.0 release including some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v0.9.0-released/index.html b/blog/cloud-hypervisor-v0.9.0-released/index.html new file mode 100644 index 00000000..92d18d5a --- /dev/null +++ b/blog/cloud-hypervisor-v0.9.0-released/index.html @@ -0,0 +1,11 @@ +Cloud Hypervisor v0.9.0 Released! - Cloud Hypervisor

Cloud Hypervisor v0.9.0 Released!

Posted August 6, 2020 by Cloud Hypervisor Team ‐ 3 min read

This release has been tracked through the 0.9.0 project.

Highlights for cloud-hypervisor version 0.9.0 include:

io_uring Based Block Device Support

If the io_uring feature is enabled and the host kernel supports it then io_uring will be used for block devices. This results a very significant performance improvement.

Block and Network Device Statistics

Statistics for activity of the virtio network and block devices is now exposed through a new vm.counters HTTP API entry point. These take the form of simple counters which can be used to observe the activity of the VM.

HTTP API Responses

The HTTP API for adding devices now responds with the name that was assigned to the device as well the PCI BDF.

CPU Topology

A topology parameter has been added to --cpus which allows the configuration of the guest CPU topology allowing the user to specify the numbers of sockets, packages per socket, cores per package and threads per core.

Release Build Optimization

Our release build is now built with LTO (Link Time Optimization) which results in a ~20% reduction in the binary size.

Hypervisor Abstraction

A new abstraction has been introduced, in the form of a hypervisor crate so as to enable the support of additional hypervisors beyond KVM.

Snapshot/Restore Improvements

Multiple improvements have been made to the VM snapshot/restore support that was added in the last release. This includes persisting more vCPU state and in particular preserving the guest paravirtualized clock in order to avoid vCPU hangs inside the guest when running with multiple vCPUs.

Virtio Memory Ballooning Support

A virtio-balloon device has been added, controlled through the resize control, which allows the reclamation of host memory by resizing a memory balloon inside the guest.

Enhancements to ARM64 Support

The ARM64 support introduced in the last release has been further enhanced with support for using PCI for exposing devices into the guest as well as multiple bug fixes. It also now supports using an initramfs when booting.

Intel SGX Support

The guest can now use Intel SGX if the host supports it. Details can be found in the dedicated SGX documentation.

Seccomp Sandbox Improvements

The most frequently used virtio devices are now isolated with their own seccomp filters. It is also now possible to pass --seccomp=log which result in the logging of requests that would have otherwise been denied to further aid development.

Notable Bug Fixes

  • Our virtio-vsock implementation has been resynced with the implementation from Firecracker and includes multiple bug fixes.
  • CPU hotplug has been fixed so that it is now possible to add, remove, and re-add vCPUs (#1338)
  • A workaround is now in place for when KVM reports MSRs available MSRs that are in fact unreadable preventing snapshot/restore from working correctly (#1543).
  • virtio-mmio based devices are now more widely tested (#275).
  • Multiple issues have been fixed with virtio device configuration (#1217)
  • Console input was wrongly consumed by both virtio-console and the serial. (#1521)

Contributors

Many thanks to everyone who has contributed to our 0.9.0 release including some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v15.0-released/index.html b/blog/cloud-hypervisor-v15.0-released/index.html new file mode 100644 index 00000000..64ac4f16 --- /dev/null +++ b/blog/cloud-hypervisor-v15.0-released/index.html @@ -0,0 +1,31 @@ +Cloud Hypervisor v15.0 Released! - Cloud Hypervisor

Cloud Hypervisor v15.0 Released!

Posted April 29, 2021 by Cloud Hypervisor Team ‐ 3 min read

This release has been tracked through the v15.0 project.

Highlights for cloud-hypervisor version v15.0 include:

Version numbering and stability guarantees

This release is the first in a new version numbering scheme to represent that +we believe Cloud Hypervisor is maturing and entering a period of stability. +With this new release we are beginning our new stability guarantees:

  • The API (including command line options) will not be removed or changed in a +breaking way without a minimum of 2 releases notice. Where possible warnings +will be given about the use of deprecated functionality and the deprecations +will be documented in the release notes.
  • Point releases will be made between individual releases where there are +substantial bug fixes or security issues that need to be fixed.

Currently the following items are not guaranteed across updates:

  • Snapshot/restore is not supported across different versions
  • Live migration is not supported across different versions
  • The following features are considered experimental and may change +substantially between releases: TDX, SGX.

Network device rate limiting

Building on our existing support for rate limiting block activity the network +device also now supports rate limiting. Full details of the controls are in the +IO throttling documentation.

Support for runtime control of virtio-net guest offload

The guest is now able to change the offload settings for the virtio-net +device. As well as providing a useful control this mitigates an issue in the +Linux kernel where the guest will attempt to reprogram the offload settings +even if they are not advertised as configurable (#2528).

--api-socket supports file descriptor parameter

The --api-socket can now take an fd= parameter to specify an existing file +descriptor to use. This is particularly beneficial for frameworks that need to +programmatically control Cloud Hypervisor.

Bug fixes

  • A workaround has been put in place to mitigate a Linux kernel issues that +results in the CPU thread spinning at 100% when using virtio-pmem (#2277).
  • PCI BARs are now correctly aligned removing the need for the guest to +reprogram them (#1797,#1798)
  • Handle TAP interface not being writable within virtio-net (due to the buffer +exhaustion on the host) (#2517)
  • The recommended Linux kernel is now v5.12.0 as it contains a fix that +prevents snapshot & restore working (#2535)

Deprecations

Deprecated features will be removed in a subsequent release and users should plan to use alternatives

  • Support for booting with the “LinuxBoot” protocol for ELF and bzImage +binaries has been deprecated. When using direct boot users should configure +their kernel with CONFIG_PVH=y. Will be removed in v16.0.

Contributors

Many thanks to everyone who has contributed to our release including some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v16.0-released/index.html b/blog/cloud-hypervisor-v16.0-released/index.html new file mode 100644 index 00000000..5d49fa8f --- /dev/null +++ b/blog/cloud-hypervisor-v16.0-released/index.html @@ -0,0 +1,9 @@ +Cloud Hypervisor v16.0 Released! - Cloud Hypervisor

Cloud Hypervisor v16.0 Released!

Posted June 10, 2021 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v16.0 project.

Improved live migration support

The live migration support inside Cloud Hypervisor has been improved with the addition of the tracking of dirty pages written by the VMM to complement the tracking of dirty pages made by the guest itself. Further the internal state of the VMM now is versioned which allows the safe migration of VMs from one version of the VMM to a newer one. However further testing is required so this should be done with care. See the live migration documentation for more details.

Improved vhost-user support

When using vhost-user to access devices implemented in different processes there is now support for reconnection of those devices in the case of a restart of the backend. In addition it is now possible to operate with the direction of the vhost-user-net connection reversed with the server in the VMM and the client in the backend. This is aligns with the default approach recommended by Open vSwitch.

ARM64 ACPI and UEFI support

Cloud Hypervisor now supports using ACPI and booting from a UEFI image on ARM64. This allows the use of stock OS images without direct kernel boot.

Notable bug fixes

  • Activating fewer virtio-net queues than advertised is now supported. This appeared when using OVMF with an MQ enabled device (#2578).
  • When using MQ with virtio devices Cloud Hypervisor now enforces a minimum vCPU count which ensures that the user will not see adverse guest performance (#2563).
  • The KVM clock is now correctly handled during live migration / snapshot & restore.

Removed functionality

The following formerly deprecated features have been removed:

  • Support for booting with the “LinuxBoot” protocol for ELF and bzImage +binaries has been deprecated. When using direct boot users should configure +their kernel with CONFIG_PVH=y.

Contributors

Many thanks to everyone who has contributed to our release including some new faces.

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v17.0-released/index.html b/blog/cloud-hypervisor-v17.0-released/index.html new file mode 100644 index 00000000..b1bc4fbb --- /dev/null +++ b/blog/cloud-hypervisor-v17.0-released/index.html @@ -0,0 +1,20 @@ +Cloud Hypervisor v17.0 Released! - Cloud Hypervisor

Cloud Hypervisor v17.0 Released!

Posted July 22, 2021 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v17.0 +project.

ARM64 NUMA support using ACPI

The support for ACPI on ARM64 has been enhanced to include support for +specifying a NUMA configuration using the existing control options.

Seccomp support for MSHV backend

The seccomp rules have now been extended to support running against the MSHV +hypervisor backend.

Hotplug of macvtap devices

Hotplug of macvtap devices is now supported with the file descriptor for the +network device if opened by the user and passed to the VMM. The ch-remote +tool supports this functionality when adding a network device.

Improved SGX support

The SGX support has been updated to match the latest Linux kernel support and +now supports SGX provisioning and associating EPC sections to NUMA nodes.

Inflight tracking for vhost-user devices

Support for handling inflight tracking of I/O requests has been added to the +vhost-user devices allowing recovery after device reconnection.

Notable bug fixes

  • VFIO PCI BAR calculation code now correctly handles I/O BARs (#2821).
  • The VMM side of vhost-user devices no longer advertise the +VIRTIO_F_RING_PACKED feature as they are not yet supported in the VMM +(#2833).
  • On ARM64 VMs can be created with more than 16 vCPUs (#2763).

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v18.0-released/index.html b/blog/cloud-hypervisor-v18.0-released/index.html new file mode 100644 index 00000000..46f3ed1e --- /dev/null +++ b/blog/cloud-hypervisor-v18.0-released/index.html @@ -0,0 +1,18 @@ +Cloud Hypervisor v18.0 Released! - Cloud Hypervisor

Cloud Hypervisor v18.0 Released!

Posted September 9, 2021 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v18.0 project.

Experimental User Device (vfio-user) support

Experimental support for running PCI devices in userspace via vfio-user +has been included. This allows the use of the SPDK NVMe vfio-user controller +with Cloud Hypervisor. This is enabled by --user-device on the command line.

Migration support for vhost-user devices

Devices exposed into the VM via vhost-user can now be migrated using the live +migration support. This requires support from the backend however the commonly +used DPDK vhost-user backend does support this.

VHDX disk image support

Images using the VHDX disk image format can now be used with Cloud Hypervisor.

Device pass through on MSHV hypervisor

When running on the MSHV hypervisor it is possible to pass through devices from +the host through to the guest (e.g with --device)

AArch64 for support virtio-mem

The reference Linux kernel we recommend for using with Cloud Hypervisor now supports virtio-mem on AArch64.

Live migration on MSHV hypervisor

Live migration is now supported when running on the MSHV hypervisor including +efficient tracking of dirty pages.

AArch64 CPU topology support

The CPU topology (as configured through --cpu topology=) can now be +configured on AArch64 platforms and is conveyed through either ACPI or device +tree.

Power button support on AArch64

Use of the ACPI power button (e.g ch-remote --api-socket=<API socket> power-button) +is now supported when running on AArch64.

Notable bug fixes

  • Using two PTY outputs e.g. --serial pty --console pty now works correctly (#3012)
  • TTY input is now always sent to the correct destination (#3005)
  • The boot is no longer blocked when using a unattached PTY on the serial console (#3004)
  • Live migration is now supported on AArch64 (#3049)
  • Ensure signal handlers are run on the correct thread (#3069)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v19.0-released/index.html b/blog/cloud-hypervisor-v19.0-released/index.html new file mode 100644 index 00000000..643e40d5 --- /dev/null +++ b/blog/cloud-hypervisor-v19.0-released/index.html @@ -0,0 +1,19 @@ +Cloud Hypervisor v19.0 Released! - Cloud Hypervisor

Cloud Hypervisor v19.0 Released!

Posted October 14, 2021 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v19.0 project.

Improved PTY handling for serial and virtio-console

The PTY support for serial has been enhanced with improved buffering when the +the PTY is not yet connected to. Using virtio-console with PTY now results in +the console being resized if the PTY window is also resized.

PCI boot time optimisations

Multiple optimisations have been made to the PCI handling resulting in +significant improvements in the boot time of the guest.

Improved TDX support

When using the latest TDVF firmware the ACPI tables created by the VMM are now +exposed via the firmware to the guest.

Live migration enhancements

Live migration support has been enhanced to support migration with virtio-mem +based memory hotplug and the virtio-balloon device now supports live +migration.

virtio-mem support with vfio-user

The use of vfio-user userspaces devices can now be used in conjunction with +virtio-mem based memory hotplug and unplug.

AArch64 for virtio-iommu

A paravirtualised IOMMU can now be used on the AArch64 platform.

Notable bug fixes

  • ACPI hotplugged memory is correctly restored after a live migration or +snapshot/restore (#3165)
  • Multiple devices from the same IOMMU group can be passed through via VFIO +(#3078 #3113)
  • Live migration with large blocks of memory was buggy due to an in issue in +the underlying crate (#3157)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v20.0-released/index.html b/blog/cloud-hypervisor-v20.0-released/index.html new file mode 100644 index 00000000..ca5f17f8 --- /dev/null +++ b/blog/cloud-hypervisor-v20.0-released/index.html @@ -0,0 +1,20 @@ +Cloud Hypervisor v20.0 Released! - Cloud Hypervisor

Cloud Hypervisor v20.0 Released!

Posted December 2, 2021 by Cloud Hypervisor Team ‐ 2 min read

v20.0

This release has been tracked through the v20.0 +project.

Multiple PCI segments support

Cloud Hypervisor is no longer limited to 31 PCI devices. For both x86_64 and +aarch64 architectures, it is now possible to create up to 16 PCI segments, +increasing the total amount of supported PCI devices to 496.

CPU pinning

For each vCPU, the user can define a limited set of host CPUs on which it is +allowed to run. This can be useful when assigning a 1:1 mapping between host and +guest resources, or when running a VM on a specific NUMA node.

Improved VFIO support

Based on VFIO region capabilities, all regions can be memory mapped, limiting +the amount of triggered VM exits, and therefore increasing the performance of +the passthrough device.

Safer code

Several sections containing unsafe Rust code have been replaced with safe +alternatives, and multiple comments have been added to clarify why the remaining +unsafe sections are safe to use.

Extended documentation

The documentation related to VFIO has been updated while some new documents have +been introduced to cover the usage of --cpus parameter as well as how to run +Cloud Hypervisor on Intel TDX.

Notable bug fixes

  • Naturally align PCI BARs on relocation (#3244)
  • Fix panic in SIGWINCH listener thread when no seccomp filter set (#3338)
  • Use the tty raw mode implementation from libc (#3344)
  • Fix the emulation of register D for CMOS/RTC device (#3393)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v20.1-released/index.html b/blog/cloud-hypervisor-v20.1-released/index.html new file mode 100644 index 00000000..55457625 --- /dev/null +++ b/blog/cloud-hypervisor-v20.1-released/index.html @@ -0,0 +1,7 @@ +Cloud Hypervisor v20.1 Released! - Cloud Hypervisor

Cloud Hypervisor v20.1 Released!

Posted December 13, 2021 by Cloud Hypervisor Team ‐ 1 min read

This is a bug fix release. The following issues have been addressed:

  • Networking performance regression with virtio-net (#3450)
  • Limit file descriptors sent in vfio-user support (#3401)
  • Fully advertise PCI MMIO config regions in ACPI tables (#3432)
  • Set the TSS and KVM identity maps so they don’t overlap with firmware RAM
  • Correctly update the DeviceTree on restore

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v20.2-released/index.html b/blog/cloud-hypervisor-v20.2-released/index.html new file mode 100644 index 00000000..e34f917e --- /dev/null +++ b/blog/cloud-hypervisor-v20.2-released/index.html @@ -0,0 +1,9 @@ +Cloud Hypervisor v20.2 Released! - Cloud Hypervisor

Cloud Hypervisor v20.2 Released!

Posted January 4, 2022 by Cloud Hypervisor Team ‐ 1 min read

This is a bug fix release. The following issues have been addressed:

  • Don’t error out when setting up the SIGWINCH handler (for console resize) +when this fails due to older kernel (#3456)
  • Seccomp rules were refined to remove syscalls that are now unused
  • Fix reboot on older host kernels when SIGWINCH handler was not initialised +(#3496)
  • Fix virtio-vsock blocking issue (#3497)

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v21.0-released/index.html b/blog/cloud-hypervisor-v21.0-released/index.html new file mode 100644 index 00000000..0e4de01f --- /dev/null +++ b/blog/cloud-hypervisor-v21.0-released/index.html @@ -0,0 +1,7 @@ +Cloud Hypervisor v21.0 Released! - Cloud Hypervisor

Cloud Hypervisor v21.0 Released!

Posted January 20, 2022 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v21.0 project.

Efficient Local Live Migration (for Live Upgrade)

In order to support fast live upgrade of the VMM an optimised path has been added in which the memory for the VM is not compared from source to destination. This is activated by passing --local to the ch-remote send-migration command. This means that the live upgrade can complete in the order of 50ms vs 3s. (#3566)

Due to an issue in the virtio-net code in 5.14 the recommended Linux kernel is now 5.15. (#3530)

Notable Bug fixes

  • Multiple fixes were made to the OpenAPI YAML file to match the implementaion (#3555,#3562)
  • Avoid live migration deadlock when triggered during the kernel boot (#3585)
  • Support live migration within firmware (#3586)
  • Validate the virtio-net desciptor chain (#3548)
  • direct=on (O_DIRECT) can now be used with a guest that makes unaligned accesses (e.g. firmware) (#3587)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v21.1-released/index.html b/blog/cloud-hypervisor-v21.1-released/index.html new file mode 100644 index 00000000..583e441c --- /dev/null +++ b/blog/cloud-hypervisor-v21.1-released/index.html @@ -0,0 +1,7 @@ +Cloud Hypervisor v21.1 Released! - Cloud Hypervisor

Cloud Hypervisor v21.1 Released!

Posted March 11, 2022 by Cloud Hypervisor Team ‐ 1 min read

This is a bug fix release. The following issues have been addressed:

  • Missing openat() syscall from seccomp filter (#3609)
  • Ensure MMIO/PIO exits complete before pausing (#3658)
  • Support DWORD writes to MSI-X control register (#3714)
  • VFIO ioctl reordering to fix MSI on AMD platforms (#3827)
  • Fix virtio-net control queue (#3829)

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v22.0-released/index.html b/blog/cloud-hypervisor-v22.0-released/index.html new file mode 100644 index 00000000..4ac16f96 --- /dev/null +++ b/blog/cloud-hypervisor-v22.0-released/index.html @@ -0,0 +1,27 @@ +Cloud Hypervisor v22.0 Released! - Cloud Hypervisor

Cloud Hypervisor v22.0 Released!

Posted March 3, 2022 by Cloud Hypervisor Team ‐ 3 min read

This release has been tracked through the v22.0 +project.

GDB Debug Stub Support

Cloud Hypervisor can now be used as debug target with GDB. This is controlled +by the gdb compile time feature and details of how to use it can be found in +the gdb +documentation.

virtio-iommu Backed Segments

In order to facilitate hotplug devices that require being behind an IOMMU (e.g. +QAT) there is a new option --platform iommu_segments=<list_of_segments> that +will place all the specified segments behind the IOMMU.

Before Boot Configuration Changes

It is now possible to change the VM configuration (e.g. add or remove devices, +resize) before the VM is booted.

virtio-balloon Free Page Reporting

If --balloon free_page_reporting=on is used then the guest can report pages +that is it not using to the VMM. The VMM will then notify the host OS that +those pages are no longer in use and can be freed. This can result in improved +memory density.

Support for Direct Kernel Booting with TDX

Through the use of TD-Shim lightweight firmware it is now possible to +directly boot into the kernel with TDX. The TDX +documentation +has been updated for this usage.

PMU Support for AArch64

A PMU is now available on AArch64 for guest performance profiling. This will be +exposed automatically if available from the host.

Documentation Under CC-BY-4.0 License

The documentation is now licensed under the “Creative Commons Attribution 4.0 +International” license which is aligned with the project charter under the +Linux Foundation.

Deprecation of “Classic” virtiofsd

The use of the Rust based virtiofsd +is now recommended and we are no longer testing against the C based “classic” +version.

Notable Bug Fixes

  • Can now be used on kernels without AF_INET support (#3785)
  • virtio-balloon size is now validated against guest RAM size (#3689)
  • Ensure that I/O related KVM VM Exits are correctly handled (#3677)
  • Multiple TAP file descriptors can be used for virtio-net device hotplug (#3607)
  • Minor API improvements and fixes (#3756, #3766, #3647, #3578)
  • Fix sporadic seccomp violation from glibc memory freeing (#3610, #3609)
  • Fix Windows 11 on AArch64 due to wider MSI-X register accesses (#3714, #3720)
  • Ensure vhost-user features are correct across migration (#3737)
  • Improved vCPU topology on AArch64 (#3735, #3733)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v22.1-released/index.html b/blog/cloud-hypervisor-v22.1-released/index.html new file mode 100644 index 00000000..07084802 --- /dev/null +++ b/blog/cloud-hypervisor-v22.1-released/index.html @@ -0,0 +1,7 @@ +Cloud Hypervisor v22.1 Released! - Cloud Hypervisor

Cloud Hypervisor v22.1 Released!

Posted March 11, 2022 by Cloud Hypervisor Team ‐ 1 min read

This is a bug fix release. The following issues have been addressed:

  • VFIO ioctl reordering to fix MSI on AMD platforms (#3827)
  • Fix virtio-net control queue (#3829)

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v23.0-released/index.html b/blog/cloud-hypervisor-v23.0-released/index.html new file mode 100644 index 00000000..3a74260b --- /dev/null +++ b/blog/cloud-hypervisor-v23.0-released/index.html @@ -0,0 +1,22 @@ +Cloud Hypervisor v23.0 Released! - Cloud Hypervisor

Cloud Hypervisor v23.0 Released!

Posted April 14, 2022 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v23.0 +project.

vDPA Support

A vDPA device has a datapath that complies with the virtio specification but +with a vendor specific control path. The addition of --vdpa and the REST API +equivalent allows the use of these devices with Cloud Hypervisor.

Updated OS Support list

The list of officially supported and tested OS versions has been updated to +include Ubuntu “jammy” 22.04 and EOLed versions removed.

AArch64 Memory Map Improvements

The memory map when running on AArch64 has been improved for the handling of +the UEFI region which means that the booted guest OS now has full access to its +allocated RAM. (#3938)

AMX Support

Under a compile time gate of amx it is possible compile in support for the +AMX instruction set extension for guest use. This also requires runtime +enabling with --cpu features=amx.

Notable Bug Fixes

  • Generate error when incorrect HTTP method used for some API endpoints (#3887)
  • CMOS based reset is now available to support rebooting on “jammy” (#3914)
  • ACPI tables are not produced for memory hotplug when running with +virtio-mem (#3883)
  • virtio-iommu backed PCI segments are now comprehensively placed behind the +vIOMMU (#3870)
  • Seccomp rules have been extended for virtio-fs to support direct access +(#3848)

Deprecations

Deprecated features will be removed in a subsequent release and users should +plan to use alternatives

  • The mergeable option from the virtio-pmem support has been deprecated +(#3968)
  • The dax option from the virtio-fs support has been deprecated (#3889)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v23.1-released/index.html b/blog/cloud-hypervisor-v23.1-released/index.html new file mode 100644 index 00000000..fc8e5e5b --- /dev/null +++ b/blog/cloud-hypervisor-v23.1-released/index.html @@ -0,0 +1,7 @@ +Cloud Hypervisor v23.1 Released! - Cloud Hypervisor

Cloud Hypervisor v23.1 Released!

Posted May 9, 2022 by Cloud Hypervisor Team ‐ 1 min read

This is a bug fix release. The following issues have been addressed:

  • Add some missing seccomp rules
  • Remove virtio-fs filesystem entries from config on removal
  • Do not delete API socket on API server start (#4026)
  • Reject virtio-mem resize if the guest doesn’t activate the device
  • Fix OpenAPI naming of I/O throttling knobs

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v24.0-released/index.html b/blog/cloud-hypervisor-v24.0-released/index.html new file mode 100644 index 00000000..75cd3a7a --- /dev/null +++ b/blog/cloud-hypervisor-v24.0-released/index.html @@ -0,0 +1,25 @@ +Cloud Hypervisor v24.0 Released! - Cloud Hypervisor

Cloud Hypervisor v24.0 Released!

Posted May 27, 2022 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v24.0 +project.

Bypass Mode for virtio-iommu

virtio-iommu specification describes how a device can be attached by default +to a bypass domain. This feature is particularly helpful for booting a VM with +guest software which doesn’t support virtio-iommu but still need to access +the device. Now that Cloud Hypervisor supports this feature, it can boot a VM +with Rust Hypervisor Firmware or OVMF even if the virtio-block device exposing +the disk image is placed behind a virtual IOMMU.

Ensure Identifiers Uniqueness

Multiple checks have been added to the code to prevent devices with identical +identifiers from being created, and therefore avoid unexpected behaviors at boot +or whenever a device was hot plugged into the VM.

Sparse Mmap support

Sparse mmap support has been added to both VFIO and vfio-user devices. This +allows the device regions that are not fully mappable to be partially mapped. +And the more a device region can be mapped into the guest address space, the +fewer VM exits will be generated when this device is accessed. This directly +impacts the performance related to this device.

Expose Platform Serial Number

A new serial_number option has been added to --platform, allowing a user to +set a specific serial number for the platform. This number is exposed to the +guest through the SMBIOS.

Notable Bug Fixes

  • Fix loading RAW firmware (#4072)
  • Reject compressed QCOW images (#4055)
  • Reject virtio-mem resize if device is not activated (#4003)
  • Fix potential mmap leaks from VFIO/vfio-user MMIO regions (#4069)
  • Fix algorithm finding HOB memory resources (#3983)

Notable Improvements

  • Refactor interrupt handling (#4083)
  • Load kernel asynchronously (#4022)
  • Only create ACPI memory manager DSDT when resizable (#4013)

Deprecations

Deprecated features will be removed in a subsequent release and users should +plan to use alternatives

  • The mergeable option from the virtio-pmem support has been deprecated +(#3968)
  • The dax option from the virtio-fs support has been deprecated (#3889)

New on the Website

A new blog post Achieving Bare Metal Performance Within a Virtual +Machine +has been added to the Cloud Hypervisor website.

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v25.0-released/index.html b/blog/cloud-hypervisor-v25.0-released/index.html new file mode 100644 index 00000000..e0610bcd --- /dev/null +++ b/blog/cloud-hypervisor-v25.0-released/index.html @@ -0,0 +1,17 @@ +Cloud Hypervisor v25.0 Released! - Cloud Hypervisor

Cloud Hypervisor v25.0 Released!

Posted July 7, 2022 by Cloud Hypervisor Team ‐ 1 min read

This release has been tracked through the v25.0 +project.

ch-remote Improvements

The ch-remote command has gained support for creating the VM from a JSON +config and support for booting and deleting the VM from the VMM.

VM “Coredump” Support

Under the guest_debug feature flag it is now possible to extract the memory +of the guest for use in debugging with e.g. the crash utility. (#4012)

Notable Bug Fixes

  • Always restore console mode on exit (#4249, #4248)
  • Restore vCPUs in numerical order which fixes aarch64 snapshot/restore (#4244)
  • Don’t try and configure IFF_RUNNING on TAP devices (#4279)
  • Propagate configured queue size through to vhost-user backend (#4286)
  • Always Program vCPU CPUID before running the vCPU to fix running on Linux +5.16 (#4156)
  • Enable ACPI MADT “Online Capable” flag for hotpluggable vCPUs to fix newer +Linux guest

Removals

The following functionality has been removed:

  • The mergeable option from the virtio-pmem support has been removed +(#3968)
  • The dax option from the virtio-fs support has been removed (#3889)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v26.0-released/index.html b/blog/cloud-hypervisor-v26.0-released/index.html new file mode 100644 index 00000000..18205568 --- /dev/null +++ b/blog/cloud-hypervisor-v26.0-released/index.html @@ -0,0 +1,23 @@ +Cloud Hypervisor v26.0 Released! - Cloud Hypervisor

Cloud Hypervisor v26.0 Released!

Posted August 17, 2022 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked through the v26.0 +project.

SMBIOS Improvements via --platform

--platform and the appropriate API structure has gained support for supplying +OEM strings (primarily used to communicate metadata to systemd in the guest) +(#4319, #4446) and support for specifying the UUID (#4389.)

Unified Binary MSHV and KVM Support

Support for both the MSHV and KVM hypervisors can be compiled into the same +binary with the detection of the hypervisor to use made at runtime.

Notable Bug Fixes

  • The prefetchable flag is preserved on BARs for VFIO devices (#4353, #4454)
  • PCI Express capabilties for functionality we do not support are now filtered +out (#4456)
  • GDB breakpoint support is more reliable (#4354, #4363)
  • SIGINT and SIGTERM signals are now handled before the VM has booted +(#4269, #4293)
  • Multiple API event loop handling bug fixes (#4309, #4362)
  • Incorrect assumptions in virtio queue numbering were addressed, allowing +thevirtio-fs driver in OVMF to be used (#4341, #4314)
  • VHDX file format header fix (#4291)
  • The same VFIO device cannot be added twice (#4453, #4463)
  • SMBIOS tables were being incorrectly generated (#4442)

Deprecations

Deprecated features will be removed in a subsequent release and users should +plan to use alternatives.

  • The top-level kernel and initramfs members on the VmConfig have been +moved inside a PayloadConfig as the payload member. The OpenAPI document +has been updated to reflect the change and the old API members continue to +function and are mapped to the new version. The expectation is that these old +versions will be removed in the v28.0 release.

Removals

The following functionality has been removed:

  • The unused poll_queue parameter has been removed from --disk and +equivalent. This was residual from the removal of the vhost-user-block +spawning feature (#4402.)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v27.0-released/index.html b/blog/cloud-hypervisor-v27.0-released/index.html new file mode 100644 index 00000000..c6d86f9c --- /dev/null +++ b/blog/cloud-hypervisor-v27.0-released/index.html @@ -0,0 +1,33 @@ +Cloud Hypervisor v27.0 Released! - Cloud Hypervisor

Cloud Hypervisor v27.0 Released!

Posted September 29, 2022 by Cloud Hypervisor Team ‐ 3 min read

This release has been tracked in our new roadmap +project as iteration +v27.0.

Community Engagement

A new mailing list has been created to support broader community discussions. +Please consider subscribing; an +announcement of a regular meeting will be announced via this list shortly.

Prebuilt Packages

Prebuilt packages are now available. Please see this +document +on how to install. These packages also include packages for the different +firmware options available.

Network Device MTU Exposed to Guest

The MTU for the TAP device associated with a virtio-net device is now exposed +to the guest. If the user provides a MTU with --net mtu=.. then that MTU is +applied to created TAP interfaces. This functionality is also exposed for +vhost-user-net devices including those created with the reference backend +(#4658, #4676.)

Boot Tracing

Support for generating a trace report for the boot time has been added +including a script for generating an SVG from that trace (#4659.)

Simplified Build Feature Flags

The set of feature flags, for e.g. experimental features, have been simplified:

  • msvh and kvm features provide support for those specific hypervisors +(with kvm enabled by default),
  • tdx provides support for Intel TDX; and although there is no MSHV support +now it is now possible to compile with the mshv feature (#4696,)
  • tracing adds support for boot tracing,
  • guest_debug now covers both support for gdbing a guest (formerly gdb +feature) and dumping guest memory.

The following feature flags were removed as the functionality was enabled by +default: amx, fwdebug, cmos and common (#4679, #4632.)

Asynchronous Kernel Loading

AArch64 has gained support for loading the guest kernel asynchronously like +x86-64. (#4538)

GDB Support for AArch64

GDB stub support (accessed through --gdb under guest_debug feature) is now +available on AArch64 as well as as x86-64.

Notable Bug Fixes

  • This version incorporates a version of virtio-queue that addresses an issue +where a rogue guest can potentially DoS the VMM (rust-vmm/vm-virtio#196.)
  • Improvements around PTY handling for virtio-console and serial devices +(#4520, #4533, #4535.)
  • Improved error handling in virtio devices (#4626, #4605, #4509, #4631, #4697)

Deprecations

Deprecated features will be removed in a subsequent release and users should +plan to use alternatives.

  • Booting legacy firmware (compiled without a PVH header) has been deprecated. +All the firmware options (Cloud Hypervisor OVMF and Rust Hypervisor Firmware) +support booting with PVH so support for loading firmware in a legacy mode is no +longer needed. This functionality will be removed in the next release.

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v28.0-released/index.html b/blog/cloud-hypervisor-v28.0-released/index.html new file mode 100644 index 00000000..3b512f30 --- /dev/null +++ b/blog/cloud-hypervisor-v28.0-released/index.html @@ -0,0 +1,12 @@ +Cloud Hypervisor v28.0 Released! - Cloud Hypervisor

Cloud Hypervisor v28.0 Released!

Posted November 17, 2022 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our new roadmap project as iteration v28.0.

Community Engagement (Reminder)

Just a reminder that we have a new mailing list to support broader community discussions. Please consider subscribing. We plan to use this to announce a regular meeting for those interested in talking about Cloud +Hypervisor development.

Long Term Support (LTS) Release

This is the first version of Cloud Hypervisor to be released under the LTS release process. Point releases for bug fixes will be made for the next 18 months; live migration and live upgrade will be supported between the point releases of the LTS.

Virtualised TPM Support

Support for adding an emulated CRB TPM has been added. This has it’s own TPM documentation.

Transparent Huge Page Support

By default, but controllable through --memory thp=off if it possible to back the guest memory with Transparent Huge Pages (no file backing/shared=off) then this will be used resulting in improved boot performance.

README Quick Start Improved

The README has been refreshed with the quick start guide updated to reflect the different firmware options and to recommend the use of pre-built binaries.

Notable Bug Fixes

  • Inappropriate Copy-on-Write of pinned pages (e.g. VFIO) leading to higher +memory consumption (#4835)
  • Multiple virtio device bug fixes found through fuzzing (#4859, #4799)
  • Large QCOW files (> 4TiB) are now supported (#4767)
  • Support for > 31 vCPUS on aarch64 (#4863)
  • Multiple fixes to OpenAPI specification file (#4720, #4811)
  • Programming of the MSI-X table has been optimised leading to faster boot on +newer Linux kernels (#4744)
  • Error on reboot from race to close TAP devices (#4871)
  • Non-spec compliant virtio-block read-only support (#4888)

Removals

The following functionality has been removed:

  • Support for non-PVH firmware booting has been removed (#4511)
  • I/O ports used for older versions of firmware have been removed (#3926)
  • Deprecated API options for kernel/cmdline/initramfs have been removed (#4737)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v28.1-released/index.html b/blog/cloud-hypervisor-v28.1-released/index.html new file mode 100644 index 00000000..12435b8c --- /dev/null +++ b/blog/cloud-hypervisor-v28.1-released/index.html @@ -0,0 +1,9 @@ +Cloud Hypervisor v28.1 Released! - Cloud Hypervisor

Cloud Hypervisor v28.1 Released!

Posted December 14, 2022 by Cloud Hypervisor Team ‐ 1 min read

This is a bug fix release. The following issues have been addressed:

  • Update dependencies including a version of linux-loader that +addresses an infinite loop issue (details)
  • Fix bugs related to virtio-net including an integer overflow issue +(#4924, #4949)
  • Use host cpuid information for L2 cache for older KVM on x86 (#4920)
  • Improve README and documentation

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v29.0-released/index.html b/blog/cloud-hypervisor-v29.0-released/index.html new file mode 100644 index 00000000..a1791ffa --- /dev/null +++ b/blog/cloud-hypervisor-v29.0-released/index.html @@ -0,0 +1,26 @@ +Cloud Hypervisor v29.0 Released! - Cloud Hypervisor

Cloud Hypervisor v29.0 Released!

Posted January 14, 2023 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap +project as iteration +v29.0. The following user visible changes have been made:

Release Binary Supports Both MSHV and KVM

On x86-64 the binary included in releases supports both the KVM and MSHV +hypervisor with runtime detection to identify the correct hypervisor to use.

Snapshot/Restore and Live Migration Improvements

Improvements have been made to the data structures used for both live migration +and snapshot/restore. Unfortunately this has broken compatibility with older +versions (support for migrating between major versions is not yet officially +supported but has worked for some versions.)

Heap Allocation Improvements

Improvements have been made to the volume of heap allocations when running with +virtio-block devices along with a reduction in the peak heap size.

ch-remote Improvements

Support for “pinging” the VMM and shutting the VMM down have been added to +ch-remote.

AArch64 Documentation Integration

The documentation for AArch64 support has been integrated into the main +README.

virtio-block Counters Enhancement

The counters for the virtio-block device has extended to include min/mean/max +latency counters.

TCP Offload Control

The virtio-net device has gained support for controlling the enabling of +checksum and offloading. This allows the device to be used in environments +where the hardware lacks support for the offloading.

Notable Bug Fixes

  • Update dependencies including a version of linux-loader that addresses an +infinite loop issue (details)
  • Fix bugs related to virtio-net including an integer overflow issue +(#4924, #4949)
  • Use host cpuid information for L2 cache for older KVM on x86 (#4920)
  • Memory mapped into the guest is now marked as non-dumpable which prevents large core files (#5016)
  • Fix QCOW2 refcount table size (#5034)
  • Fix unpause support on MSHV in dual binary (#5037)
  • Threads inside virtio devices are now shutdown on reboot (#5095)

Removals

No functionality has been removed in this release.

Deprecations

  • Support for specifying a directory with MemoryZoneConfig::file or +MemoryConfig::file has been deprecated. This was originally used for +supporting huge pages or shared memory backing which is now natively supported +(#5085)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v30.0-released/index.html b/blog/cloud-hypervisor-v30.0-released/index.html new file mode 100644 index 00000000..f42d89e4 --- /dev/null +++ b/blog/cloud-hypervisor-v30.0-released/index.html @@ -0,0 +1,21 @@ +Cloud Hypervisor v30.0 Released! - Cloud Hypervisor

Cloud Hypervisor v30.0 Released!

Posted February 24, 2023 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap project as iteration +v30.0. The following user visible changes have been made:

Command Line Changes for Reduced Binary Size

The clap crate was replaced by the argh crate to create our command +line, which reduced our release binary size from 3.6MB to 3.3MB. There +were several syntax changes:

  • All --option=value commands now are --option value.
  • The --disk DISK1 DISK2 command now is --disk DISK1 --disk DISK2.
  • The -vvv command now is -v -v -v

Basic vfio-user Server Support

Our vfio-user crate is extended to provide basic server side support +with an example of gpio vfio-user device. This crate now is moved to its +own repository under the +rust-vmm organization.

Heap Profiling Support

A new building target is added for profiling purposes with examples of +heap profiling using dhat gated by the dhat-heap feature.

Documentation Improvements

The documentation on Intel TDX is expanded with details of the building +and using TD-Shim, +references to TDX Tools, and +version information of guest/host kernel/TDVF/TDShim being tested. Also, +a new ‘heap profiling’ documentation is added with improvements on the +existing ‘profiling’ documentation.

Notable Bug Fixes

  • Close FDs for TAP devices that are provided to VM (#5199, #5206)
  • Set vcpu thread status properly and signal exit_evt upon thread exit (#5211)
  • Populate CPUID leaf 0x4000_0010 (TSC frequency) (#5178, #5179)
  • Inform the TPM guest driver upon failed TPM requests on the host (#5151)
  • Bug fix to OpenAPI specification file (#5186)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v31.0-released/index.html b/blog/cloud-hypervisor-v31.0-released/index.html new file mode 100644 index 00000000..8d27ba73 --- /dev/null +++ b/blog/cloud-hypervisor-v31.0-released/index.html @@ -0,0 +1,23 @@ +Cloud Hypervisor v31.0 Released! - Cloud Hypervisor

Cloud Hypervisor v31.0 Released!

Posted April 6, 2023 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap project as iteration +v31.0. The following user visible changes have been made:

Update to Latest acpi_tables

Adapted to the latest acpi_tables. There has been significant API changes in +the crate.

Update Reference Kernel to 6.2

Updated the recommended guest kernel version from 6.1.6 to 6.2.

Improvements on Console SIGWINCH Handler

A separate thread had been created to capture the SIGWINCH signal and resize +the guest console. Now the thread is skipped if the console is not resizable.

Two completely different code paths existed for handling console resizing, one +for tty and the other for pty. That makes the understanding of the console +handling code unnecessarily complicated. Now the code paths are unified. Both +tty and pty are supported in single SIGWINCH handler. And the new handler +can works with kernel versions earlier than v5.5.

Remove Directory Support from MemoryZoneConfig::file

Setting a directory to MemoryZoneConfig::file is no longer supported.

Before this change, user can set a directory to file of the --memory-zone +option. In that case, a temporary file will be created as the backing file for +the mmap(2) operation. This functionality has been unnecessary since we had +the native support for hugepages and allocating anonymous shared memory.

Documentation Improvements

  • Various improvements in API document
  • Improvements in Doc comments
  • Updated Slack channel information in README

Notable Bug Fixes

  • Fixed the offset setting while removing the entire mapping of vhost-user FS +client.
  • Fixed the ShutdownVmm and Shutdown commands to call the correct API +endpoint.

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v32.0-released/index.html b/blog/cloud-hypervisor-v32.0-released/index.html new file mode 100644 index 00000000..c67f9ec3 --- /dev/null +++ b/blog/cloud-hypervisor-v32.0-released/index.html @@ -0,0 +1,9 @@ +Cloud Hypervisor v32.0 Released! - Cloud Hypervisor

Cloud Hypervisor v32.0 Released!

Posted May 18, 2023 by Cloud Hypervisor Team ‐ 1 min read

This release has been tracked in our roadmap project as iteration v32.0. The following user visible changes have been made:

Increased PCI Segment Limit

The maximum number of PCI segments that can be used is now 96 (up from 16).

API Changes

  • The VmmPingResponse now includes the PID as well as the build details. (#5348)

Notable Bug Fixes

  • Ignore and warn TAP FDs sent via the HTTP request body (#5350)
  • Properly preserve and close valid FDs for TAP devices (#5373)
  • Only use KVM_ARM_VCPU_PMU_V3 if available (#5360)
  • Only touch the tty flags if it’s being used (#5343)
  • Fix seccomp filter lists for vhost-user devices (#5361)
  • The number of vCPUs is capped at the hypervisor maximum (#5357)
  • Fixes for TTY reset (#5414)
  • CPU topology fixes on MSHV (#5325)
  • Seccomp fixes for older distributions (#5397)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v33.0-released/index.html b/blog/cloud-hypervisor-v33.0-released/index.html new file mode 100644 index 00000000..ed42bf8e --- /dev/null +++ b/blog/cloud-hypervisor-v33.0-released/index.html @@ -0,0 +1,14 @@ +Cloud Hypervisor v33.0 Released! - Cloud Hypervisor

Cloud Hypervisor v33.0 Released!

Posted June 29, 2023 by Cloud Hypervisor Team ‐ 1 min read

v33.0

This release has been tracked in our roadmap project as iteration +v33.0. The following user visible changes have been made:

D-Bus based API

A D-Bus based API has been added as an alternative to the existing REST +API. This feature is gated by the dbus_api feature. Details can be +found in the API documentation.

Expose Host CPU Cache Details for AArch64

Now the CPU cache information on the host is properly exposed to the +guest on AArch64.

Notable Bug Fixes

  • Report errors explicitly to users when VM failed to boot (#5453)
  • Fix VFIO on platforms with non-4k page size (#5450, #5469)
  • Fix TDX initialization (#5454)
  • Ensure all guest memory regions are page-size aligned (#5496)
  • Fix seccomp filter lists related to virtio-console, serial and pty +(#5506, #5524)
  • Populate APIC ID properly (#5512)
  • Ignore and warn TAP FDs in more situations (#5522)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v34.0-released/index.html b/blog/cloud-hypervisor-v34.0-released/index.html new file mode 100644 index 00000000..d3d993e4 --- /dev/null +++ b/blog/cloud-hypervisor-v34.0-released/index.html @@ -0,0 +1,9 @@ +Cloud Hypervisor v34.0 Released! - Cloud Hypervisor

Cloud Hypervisor v34.0 Released!

Posted August 10, 2023 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap project as iteration v34.0. The following user visible changes have been made:

Paravirtualised Panic Device Support

A new device has been added that can communicate when the guest kernel has panicked and share those details with the VMM. This is controlled with a new --pvpanic command line option and JSON API change equivalent. (#5526)

Improvements to VM Core Dump

Requesting to dump the guest memory as core dump will now transparently pause the VM if required; returning to the original state after. (#5604)

QCOW2 Support for Backing Files

The support for QCOW2 files has been enhanced to include support for using backing files. (#5573)

Minimum Host Kernel Bump

The minimum supported host kernel is now 5.13 in order to incorporate a bug fix for KVM_FEATURE_ASYNC_PF_INT functionality. (#5626)

Notable Bug Fixes

  • The x86 emulator is only compiled in if MSHV is compiled in (the kernel carries out this job with KVM) (#5561).
  • A regression has been fixed in VFIO support for devices that use MSI rather than MSI-X (#5658).
  • When triggering a VM shutdown or reset via I/O the vCPU thread will be blocked until that asynchronous event has been received (#5645).
  • Pausing a VM is now a synchronous action with the request only completing when all vCPUs are paused (#5611).
  • Event monitor support now correctly supports concurrent access (#5633).
  • Bug fixes for the QCOW2 file support (#5573).

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v35.0-released/index.html b/blog/cloud-hypervisor-v35.0-released/index.html new file mode 100644 index 00000000..49d8e2b6 --- /dev/null +++ b/blog/cloud-hypervisor-v35.0-released/index.html @@ -0,0 +1,15 @@ +Cloud Hypervisor v35.0 Released! - Cloud Hypervisor

Cloud Hypervisor v35.0 Released!

Posted September 21, 2023 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap project as iteration v35.0. +The following user visible changes have been made:

virtio-vsock Support for Linux Guest Kernel v6.3+

Since kernel v6.3, a vsock packet can be included in a single descriptor, +instead of being split over two descriptors. Our virtio-vsock implementation +now support both situations.

User Specified Serial Number for virtio-block

A new option serial is added to the --block command that allows users to +specify a serial number for block devices which will be guest visible.

vCPU TSC Frequency Included in Migration State

This ensures migration works correctly between hosts that have different TSC +frequencies if the guest is running with TSC as the source of timekeeping.

Notable Bug Fixes

  • Disallow concurrent CPU resizing (#5668)
  • Handle APIC EOI message for MSHV (#5681)
  • Use wrapping add for memory offset from instruction emulator (#5719)
  • Add global spell check via the ‘typos’ GitHub action (#5720)
  • Ensure probing reads are block size aligned (#5727)
  • Multiple bug fixes around the latency counter for block devices +(#5712, #5750, #5762, #5763)
  • Replace unsound static mut with once_cell (#5772)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v36.0-released/index.html b/blog/cloud-hypervisor-v36.0-released/index.html new file mode 100644 index 00000000..d1ecb9b8 --- /dev/null +++ b/blog/cloud-hypervisor-v36.0-released/index.html @@ -0,0 +1,20 @@ +Cloud Hypervisor v36.0 Released! - Cloud Hypervisor

Cloud Hypervisor v36.0 Released!

Posted November 2, 2023 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap project as iteration +v36.0. The following user visible changes have been made:

Command Line Changes

We switched back to use the clap crate to create our command line, +since the argh crate is barely maintained. There were several syntax +changes:

  • All --option value commands now are --option=value.
  • The --disk DISK1 --disk DISK2 command now is --disk DISK1 DISK2.
  • The -v -v -vcommand now is -vvv.

Note: the released binary size increased around 0.3M due to this change.

Enabled Features Reported via API Endpoint and CLI

Now the enabled (Cargo) features of the running Cloud Hypervisor +instance can be queried via API endpoint (/vmm.ping) and CLI +(--version -v).

NUMA Support for PCI segments

The --numa command is augmented with a new option pci_segment=, so +that users can define the relationship between PCI segments and NUMA +nodes. Examples can be found from the memory documentation

CPU Topology Support on AMD Platforms

Now the CPU topology on x86_64 platforms supports multiple vendors.

Unix Socket Backend for Serial Port

The --serial command is augmented with a new option socket=, allowing +users to access the serial port using a Unix socket.

AIO Backend for Block Devices

An AIO backend is added for virtio-block devices to improve block +device performance when the io_uring feature is not supported by the +host Operating System.

Documentation Improvements

Notable Bug Fixes

  • Fix a deadlock when TDX is enabled (#5845)
  • Only advertise AMX feature bits to guest when the AMX cpu feature is +enabled (#5834)
  • Correct default value for vCPU topology on AArch64 (#5893)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v37.0-released/index.html b/blog/cloud-hypervisor-v37.0-released/index.html new file mode 100644 index 00000000..3ef33193 --- /dev/null +++ b/blog/cloud-hypervisor-v37.0-released/index.html @@ -0,0 +1,22 @@ +Cloud Hypervisor v37.0 Released! - Cloud Hypervisor

Cloud Hypervisor v37.0 Released!

Posted December 14, 2023 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap project as iteration +v37.0. The following user visible changes have been made:

Long Term Support (LTS) Release

This release is a LTS release. Point releases for bug fixes will be made +for the next 18 months; live migration and live upgrade will be +supported between the point releases of the LTS.

Multiple PCI segments Support for 32-bit VFIO Devices

Now VFIO devices with 32-bit memory BARs can be attached to non-zero PCI +segments on the guest, allowing users to have more 32-bit devices and +assign such devices to appropriate NUMA nodes for better performance.

Configurable Named TAP Devices

Named TAP devices now accepts IP configuration from users, such as IP +and MAC address, as long as the named TAP device is created by Cloud +Hypervisor (e.g. not existing TAP devices).

TTY Output from Both Serial Device and Virtio Console

Now legacy serial device and virtio console can be set as TTY mode as +the same time. This allows users to capture early boot logs with the +legacy serial device without losing performance benefits of using +virtio-console, when appropriate kernel configuration is used (such as +using kernel command-line console=hvc0 earlyprintk=ttyS0 on x86).

Faster VM Restoration from Snapshots

The speed of VM restoration from snapshots is improved with a better +implementation of deserializing JSON files.

Notable Bug Fixes

  • Fix aio backend behavior for block devices when writeback cache +disabled (#5930)
  • Fix PvPanic device PCI BAR alignment (#5956)
  • Bug fix to OpenAPI specification file (#5967)
  • Error out early for live migration when TDX is enabled (#6025)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v38.0-released/index.html b/blog/cloud-hypervisor-v38.0-released/index.html new file mode 100644 index 00000000..00689c7d --- /dev/null +++ b/blog/cloud-hypervisor-v38.0-released/index.html @@ -0,0 +1,23 @@ +Cloud Hypervisor v38.0 Released! - Cloud Hypervisor

Cloud Hypervisor v38.0 Released!

Posted February 16, 2024 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap +project as iteration +v38.0. The following user visible changes have been made:

Group Rate Limiter on Block Devices

Users now can throttle a group of block devices with the new +--rate-limiter-group option. Details can be found from the I/O +Throttling documentation

CPU Pinning Support for Block Device Worker Thread

Users now have the option to pin virt-queue threads for block devices +to specific host cpus.

Optimized Boot Time with Parallel Memory Prefault

The boot time with prefault option enabled is optimized via parallel +memory prefault.

New ‘debug-console’ Device

A ‘debug-console’ device is added to provide a user-configurable debug +port for logging guest information. Details can be found from the Debug +IO Ports documentation.

Improved VFIO Device Support

All non-emulated MMIO regions of VFIO devices are now mapped to the VFIO +container, allowing PCIe P2P between all VFIO devices on the same +VM. This is required for a wide variety of multi-GPU workloads involving +GPUDirect P2P (DMA between two GPUs), GPUDirect RDMA (DMA between a GPU +and an IB device).

Extended CPU Affinity Support

Users now can set the vcpu affinity to a host CPU with index larger +than 255.

Notable Bug Fixes

  • Enable HTT flag to avoid crashing cpu topology enumeration software +such as hwloc in the guest (#6146)
  • Fix several security advisories from dependencies (#6134, #6141)
  • Handle non-power-of-two CPU topology properly (#6062)
  • Various bug fixes around virtio-vsock(#6080, #6091, #6095)
  • Enable nested virtualization on AMD if supported (#6106)
  • Align VFIO devices PCI BARs naturally (#6196)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v39.0-released/index.html b/blog/cloud-hypervisor-v39.0-released/index.html new file mode 100644 index 00000000..c8768838 --- /dev/null +++ b/blog/cloud-hypervisor-v39.0-released/index.html @@ -0,0 +1,20 @@ +Cloud Hypervisor v39.0 Released! - Cloud Hypervisor

Cloud Hypervisor v39.0 Released!

Posted April 27, 2024 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap +project as iteration +v39.0. The following user visible changes have been made:

Variable Sizing of PCI Apertures for Segments

It is now possible to use --pci-segment to adjust the aperture size that +devices 32-bit and 64-bit PCI device BARs will be allocated from. Previously +the address space was equally distributed across all the segments which may +leave insufficient space for devices that require a large 32-bit space. With +this change the weighting per segment can be adjusted. (#6387)

Direct Booting with bzImages

Support for directly booting Linux from bzImages has been added.(#6200)

Support for NVIDIA GPUDirect P2P Support

The x_nv_gpudirect_clique option was added to --device to allow the +configuration of device P2P support with NVIDIA GPUs. (#6235)

Guest NMI Injection Support

A new API endpoint and ch-remote option added for injecting an NMI into the +guest. (#6047)

Notable Bug Fixes

  • Workaround for kernel bug affecting guest IRQ masking on AMD (#6353)
  • Correctly cleanup sigwinch_listener process (#6208)
  • Graceful shutdown of HTTP API thread (#6248, #6247)
  • Fix queue_affinity option in OpenAPI metadata (#6268)
  • Fix documentation to indicate only stream mode is supported by virtio-vsock +(#6306)
  • Fix virtio-fs tag validation (#6358, #6359)
  • Add missing pvpanic device to OpenAPI metadata (#6372)
  • Fixes for nested virtualization with VFIO devices (#6110, #6298, #6297, +#6319)
  • Fix for backing file for virtio-mem regions with snapshot/restore (#6337, +#6338)
  • Explicitly mark FDs used for network devices as invalid across +snapshot/restore (#6332, #6286)
  • Improve event-monitor events around reboot (#6277, #6274)
  • Fix potential deadlock around paused devices during live migration (#6293)
  • Fix panic when running ch-remote with no subcommand (#6230)
  • Fix hotplug of virtio devices after snapshot/restore and live migration +(#6326, #6265)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v40.0-released/index.html b/blog/cloud-hypervisor-v40.0-released/index.html new file mode 100644 index 00000000..a5870604 --- /dev/null +++ b/blog/cloud-hypervisor-v40.0-released/index.html @@ -0,0 +1,18 @@ +Cloud Hypervisor v40.0 Released! - Cloud Hypervisor

Cloud Hypervisor v40.0 Released!

Posted June 21, 2024 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap +project as iteration +v40.0. The following user visible changes have been made:

Support for Restoring File Descriptor Backed Network Devices

It is now possible to pass file descriptors over the HTTP API (and using +ch-remote) when restoring to update the file descriptors for network devices. +This enables snapshot & restore functionality for guests using macvtap or +other file descriptor backed network devices. (#6286)

Notable Bug Fixes

  • Default values have been removed from required fields in the OpenAPI metadata +(#6495)
  • The help syntax of ch-remote remove-device has been improved (#6456)
  • A double close of file descriptors has been fixed when using --serial +(#6486)
  • To prevent loops a limit on the nesting level for QCOW2 backing files has +been introduced (#6482)
  • Boot time performance has been improved with multiple cores by avoiding +cpuid instructions and by seeding the in kernel file descriptor table +(#6498, #6478)
  • L1 cache details are more likely to be propagated into the guest (#6523)
  • The default topology for guests now uses multiple cores rather than sockets +(#6504)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v41.0-released/index.html b/blog/cloud-hypervisor-v41.0-released/index.html new file mode 100644 index 00000000..4c6e38ee --- /dev/null +++ b/blog/cloud-hypervisor-v41.0-released/index.html @@ -0,0 +1,23 @@ +Cloud Hypervisor v41.0 Released! - Cloud Hypervisor

Cloud Hypervisor v41.0 Released!

Posted August 16, 2024 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in our roadmap +project as iteration +v41.0. The following user visible changes have been made:

Experimental “Pvmemcontrol” Support

VMM support has been added for this experimental functionality (requires +currently out of tree Linux kernel patches) to allow guests to control its +physical memory properties to allow optimisations and security features. +(#6318, #6467)

Sandboxing With Landlock Support

Support for restricting the VMM process using the Linux kernel “Landlock” API +has been added - this can be used to restrict the files (and the read/write +permissions) that the VMM process can access. This adds another layer of +security alongside the existing sycall filters (seccomp) - this can be +enabled with --landlock and fully documentated. (#5170)

Notable Performance Improvements

  • Reduced heap allocations in virtio-net via the use of a cache of Iovec +structures (#6636)
  • Notification suppression ("EVENT_IDX") support has been added to +virtio-block giving a 60% improvement in single queue block throughput and +IOPs performance (#6580)
  • Correct size used for status field in virtio-block state (#6586)

Notable Bug Fixes

  • Avoid panic on out-of-bounds PCI MSI-X access (#6657)
  • Fix undefined behaviour on AArch64 leading to wrong optimisation on KVM API +access (#6647)
  • Rust v1.80.0 added use of fcntl syscall on debug assertions so this is now +included in the virtio-device seccomp filters for tests that use this (#6648)
  • Short reads are now handled correctly in the virtio-vsock device (#6621)
  • Fix undefined behaviour on TTY ioctl leading to wrong optimisation (#6568)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v42.0-released/index.html b/blog/cloud-hypervisor-v42.0-released/index.html new file mode 100644 index 00000000..cd0eabb4 --- /dev/null +++ b/blog/cloud-hypervisor-v42.0-released/index.html @@ -0,0 +1,14 @@ +Cloud Hypervisor v42.0 Released! - Cloud Hypervisor

Cloud Hypervisor v42.0 Released!

Posted October 25, 2024 by Cloud Hypervisor Team ‐ 1 min read

This release has been tracked in our roadmap +project as iteration +v42.0. The following user visible changes have been made:

SVE/SVE2 Support on AArch64

The SVE and SVE2 feature bits are now propagated through to the guest on +AArch64. (#6678, #6691)

Notable Bug Fixes

  • Reduce latency notification when rate limited (#6672)
  • Fix virtio-console resizing (#6704)
  • Fix resizing when console uses TTY (#6754)
  • Avoid deadlock in PCI BAR reprogramming that can occur when adding a new +virtio device to a VM that has been restored (#6775)
  • Fix console resizing after VM restore (#6748)
  • Fix memory resize error due to incorrect bounds checks (#6736)

Sponsorships

During this release cycle a new VFIO CI worker has been provided by Crusoe +Energy and a new ARM64 CI worker has been provided by Ubicloud.

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v43.0-released/index.html b/blog/cloud-hypervisor-v43.0-released/index.html new file mode 100644 index 00000000..7dbe93dd --- /dev/null +++ b/blog/cloud-hypervisor-v43.0-released/index.html @@ -0,0 +1,20 @@ +Cloud Hypervisor v43.0 Released! - Cloud Hypervisor

Cloud Hypervisor v43.0 Released!

Posted December 18, 2024 by Cloud Hypervisor Team ‐ 1 min read

This release has been tracked in our roadmap +project as iteration +v43.0. The following user visible changes have been made:

Live Migration over TCP Connections

Support has been added to enable direct live migration from two hosts via TCP +connections. This supplements the existing support for migrating over a UNIX +socket which can then be tunnelled as desired. The documentation has been +updated. (#6850)

Notable Performance Improvements

The VIRTIO_RING_F_INDIRECT_DESC feature has been enabled for virtio-block +devices. This significantly increases the throughput of the devices with a +small negative impact on latency. (#6826)

Notable Bug Fixes

  • Cloud Hypervisor now accepts VFIO devices that use I/O PCI BARs on non x86-64 +architectures. Whether they function depends on the host PCI host bridge +support - previously they would be rejected even if the driver did not use +these BARs. (#6871)
  • Command line groups were adjusted to ensure that at least one payload +parameter was provided if any other VM parameters provided. (#6832)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v44.0-released/index.html b/blog/cloud-hypervisor-v44.0-released/index.html new file mode 100644 index 00000000..017b793b --- /dev/null +++ b/blog/cloud-hypervisor-v44.0-released/index.html @@ -0,0 +1,30 @@ +Cloud Hypervisor v44.0 Released! - Cloud Hypervisor

Cloud Hypervisor v44.0 Released!

Posted February 3, 2025 by Cloud Hypervisor Team ‐ 2 min read

v44.0

This release has been tracked in our roadmap project as iteration +v44.0. The following user visible changes have been made:

Configurable virtio-iommu Address Width

The iommu_address_width option has been added to --platform to allow users +to limit the virtio-iommu address space in the guest. (#6900)

Notable Performance Improvements

The VIRTIO_BLK_F_SEG_MAX feature has been enabled for virtio-block devices, +which brings significant performance improvements on throughput. (#6885)

The io_uring entries are no longer forced to use async helper workers, +delegating the decision to the kernel. This change resolved the issue of having +excessive amount of worker threads when io_uring is being used, which is +expected to improve performance, such as reducing memory usage and reduce CPU +contention.

New Fuzzers

Our continuous fuzzing infrastructure is augmented with two new fuzzers to cover +x86 instruction emulator and virtio-vsock.

Notable Bug Fixes

  • Fix short read and short write that impact QCOW and VHDX support. (#6884)
  • Various bug fixes on VHDX support. (#6890, #6899)

Contributors

Many thanks to everyone who has contributed to our release:

v43.0

This release has been tracked in our roadmap +project as iteration +v43.0. The following user visible changes have been made:

Live Migration over TCP Connections

Support has been added to enable direct live migration from two hosts via TCP +connections. This supplements the existing support for migrating over a UNIX +socket which can then be tunnelled as desired. The documentation has been +updated. (#6850)

Notable Performance Improvements

The VIRTIO_RING_F_INDIRECT_DESC feature has been enabled for virtio-block +devices. This significantly increases the throughput of the devices with a +small negative impact on latency. (#6826)

Notable Bug Fixes

  • Cloud Hypervisor now accepts VFIO devices that use I/O PCI BARs on non x86-64 +architectures. Whether they function depends on the host PCI host bridge +support - previously they would be rejected even if the driver did not use +these BARs. (#6871)
  • Command line groups were adjusted to ensure that at least one payload +parameter was provided if any other VM parameters provided. (#6832)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v45.0-released/index.html b/blog/cloud-hypervisor-v45.0-released/index.html new file mode 100644 index 00000000..2dc4c22f --- /dev/null +++ b/blog/cloud-hypervisor-v45.0-released/index.html @@ -0,0 +1,16 @@ +Cloud Hypervisor v45.0 Released! - Cloud Hypervisor

Cloud Hypervisor v45.0 Released!

Posted March 30, 2025 by Cloud Hypervisor Team ‐ 1 min read

This release has been tracked in v45.0 group of our roadmap project.

Experimental riscv64 Architecture Support

Cloud Hypervisor now has experimental riscv64 architecture +support. Details can be found from the riscv +documentation.

Alphabetically Sorted CLI Options

To improve the readability of CLI options, the output of the --help +now is alphabetically sorted. (#6988)

Improved Downtime of VM Live Migration

The downtime of VM live migration is reduced via delaying some of the +tearing down process of the source VM after the destination VM is up and +running. (#6987)

Notable Bug Fixes

  • Fix seccomp filters related to http-api thread (#6967)
  • Handle cross-page access in the emulator for mshv (#6968)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v46.0-released/index.html b/blog/cloud-hypervisor-v46.0-released/index.html new file mode 100644 index 00000000..d27d1ef3 --- /dev/null +++ b/blog/cloud-hypervisor-v46.0-released/index.html @@ -0,0 +1,21 @@ +Cloud Hypervisor v46.0 Released! - Cloud Hypervisor

Cloud Hypervisor v46.0 Released!

Posted May 23, 2025 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in v46.0 group of our roadmap project.

File-level Locking Support with --disk

Now file-level locking is enforced for disk images, provided by users +with --disk. This ensures that only a single Cloud Hypervisor instance +can obtain write access to a given disk image at any time, preventing +misconfiguration and avoiding potential data corruption. (#6974)

Improved Error Reporting with VM Resizing

Instead of returning a generic error 400 (e.g. BadRequest), users +now get a more specific error 429 (e.g. TooManyRequests) when a +pending VM resizing is not completed. This allows users to better handle +different errors, say retrying the request when applicable. (#7043)

IPv6 Address Support with --net

It is now possible to specify an IPv6 address and mask when creating a +network interface with --net. (#7048)

Experimental AArch64 Support with the MSHV Hypervisor

It is now possible to start VMs on AArch64 platforms when using MSHV +hypervisor. (#7055)

Deprecated SGX Support

The SGX support now is deprecated with a warning message if it being +used, with the intention to remove its support from our code base in two +release cycles (e.g. v48.0). (#7090)

Notable Bug Fixes

  • Remove path as required for DiskConfig from the OpenAPI spec file +(#7017)
  • Properly parse PCI capabilities (#7018)
  • Reprogram PCI device BAR when its MSE bit is set (#7063)
  • Update IOMMU mappings of MMIO regions with BAR reprogram for VFIO +devices (#7064)
  • Avoid resizing VMs to zero vCPUs (#7086)
  • Fix extended topology enumeration leaf exposed to the guest (#7087)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v47.0-released/index.html b/blog/cloud-hypervisor-v47.0-released/index.html new file mode 100644 index 00000000..306e348c --- /dev/null +++ b/blog/cloud-hypervisor-v47.0-released/index.html @@ -0,0 +1,19 @@ +Cloud Hypervisor v47.0 Released! - Cloud Hypervisor

Cloud Hypervisor v47.0 Released!

Posted July 22, 2025 by Cloud Hypervisor Team ‐ 1 min read

This release has been tracked in v47.0 group of our roadmap project.

Block Device Error Reporting to the Guest

Instead of exiting on I/O errors, the virtio-block device now reports +errors to the guest using VIRTIO_BLK_S_IOERR. It improves the user +experience particularly when the guest rootfs is not backed by the +affected block device. (#7107)

Nice Error Messages on Exit

We now have the chain of errors being reported and printed nicely, when +Cloud Hypervisor or ch-remote exits on errors. (#7066)

Alphabetically Sorted CLI Options for ch-remote

To improve readability, ch-remote now prints help information in +alphabetical order. (#7130)

Notable Bug Fixes

  • Error out early when block device serial is too long (#7124)
  • Fix partial commands being discarded for virtio-vsock (#7195)
  • Disable the broken interrupt support for the rtc_pl031 device to +prevent spurious guest interrupts (#7199)

Deprecations

  • A default IP (192.168.249.1) and mask (255.255.255.0) are +currently assigned to the virtio-net device if no value is specified +by users. Such behavior is now deprecated. Users of this behavior will +receive a warning message and should make adjustments. The behavior +will be removed in two release cycles (v49.0).

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v48.0-released/index.html b/blog/cloud-hypervisor-v48.0-released/index.html new file mode 100644 index 00000000..d238e185 --- /dev/null +++ b/blog/cloud-hypervisor-v48.0-released/index.html @@ -0,0 +1,22 @@ +Cloud Hypervisor v48.0 Released! - Cloud Hypervisor

Cloud Hypervisor v48.0 Released!

Posted September 12, 2025 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in v48.0 group of our roadmap project.

Experimental fw_cfg Device Support

This feature enables passing configuration data and files, such as VM +boot configurations (kernel, kernel cmdline, e820 memory map, and ACPI +tables), from the host to the guest. (#7117)

Experimental ivshmem Device Support

Support for inter-VM shared memory has been added. For more information, +please refer to the ivshmem documentation. (#6703)

Firmware Boot Support on riscv64

In addition to direct kernel boot, firmware boot support has been added +on riscv64 hosts. (#7249)

Increased vCPU Limit on x86_64/kvm

The maximum number of supported vCPUs on x86_64 hosts using KVM has been +raised from 254 to 8192. (#7299)

Improved Block Performance with Small Block Sizes

Performance for virtio-blk with small block sizes (16KB and below) +is enhanced via submitting async IO requests in batches. (#7146)

Faster VM Pause Operation

The VM pause operation now is significantly faster particularly for VMs +with a large number of vCPUs. (#7290)

Updated Documentation on Windows Guest Support

Our Windows documentation now includes instructions to run Windows 11 +guests, in addition to Windows Server guests. (#7218)

Policy on AI Generated Code

We will decline any contributions known to contain contents generated or +derived from using Large Language Models (LLMs). Details can be found +in our contributing documentation. (#7162)

Removed SGX Support

The SGX support has been removed, as announced in the deprecation notice two +release cycles ago. (#7093)

Notable Bug Fixes

  • Seccomp filter fixes with glibc v2.42 (#7327)
  • Various fixes related to (#7331, #7334, #7335)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v49.0-released/index.html b/blog/cloud-hypervisor-v49.0-released/index.html new file mode 100644 index 00000000..15983c2f --- /dev/null +++ b/blog/cloud-hypervisor-v49.0-released/index.html @@ -0,0 +1,17 @@ +Cloud Hypervisor v49.0 Released! - Cloud Hypervisor

Cloud Hypervisor v49.0 Released!

Posted November 9, 2025 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in v49.0 group of our roadmap project.

MSHV Support Improvements

On AArch64 with MSHV, firmware boot (#7391) and graceful guest shutdown +(#7354) are now supported, and CI coverage has been added (#7381).

Logging Improvements

Logs now use an improved timestamp format (#7355), emit an explicit +message on graceful shutdown (#7346), and reduce noisy warnings with +newer guest kernels (#7423).

Removed Default IP and Mask for virtio-net Devices

The implicit default IP (192.168.249.1) and netmask (255.255.255.0) for +virtio-net devices have been removed, as previously announced in the +deprecation notice two releases ago (#7365). Users now can create +virtio-net devices with no IP and netmask assigned.

Notable Bug Fixes

  • Prevent crash on malformed vsock connect requests (#7310)
  • Drop the VFIO container when no VFIO devices are active (#7364)
  • Gracefully close preserved file descriptors on hot device removal (#7371)
  • Fix race condition in pause–resume cycles (#7397)
  • Add NetConfig offload parameters to the OpenAPI spec file (#7445)
  • Fix seccomp filter violation from the http-server thread (#7454)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v50.0-released/index.html b/blog/cloud-hypervisor-v50.0-released/index.html new file mode 100644 index 00000000..05116ba0 --- /dev/null +++ b/blog/cloud-hypervisor-v50.0-released/index.html @@ -0,0 +1,24 @@ +Cloud Hypervisor v50.0 Released! - Cloud Hypervisor

Cloud Hypervisor v50.0 Released!

Posted December 19, 2025 by Cloud Hypervisor Team ‐ 2 min read

This release has been tracked in v50.0 group of our roadmap project.

Configurable Nested Virtualization Option on x86_64

The nested=on|off option has been added to --cpu to allow users +to configure nested virtualization support in the guest on x86_64 +hosts (for both KVM and MSHV). The default value is on to maintain +consistency with existing behavior. (#7408)

Compression Support for QCOW2

QCOW2 support has been extended to handle compression clusters based on +zlib and zstd. (#7462)

Notable Performance Improvements

Performance of live migration has been improved via an optimized +implementation of dirty bitmap maintenance. (#7468)

Live Disk Resizing Support for Raw Images

The /vm.resize-disk API has been introduced to allow users to resize block +devices backed by raw images while a guest is running. (#7476)

Developer Experience Improvements

Significant improvements have been made to developer experience and +productivity. These include a simplified root manifest, codified and +tightened Clippy lints, and streamlined workflows for cargo clippy and +cargo test. (#7489)

Improved File-level Locking Support

Block devices now use byte-range advisory locks instead of whole-file +locks. While both approaches prevent multiple Cloud Hypervisor instances +from simultaneously accessing the same disk image with write +permissions, byte-range locks provide better compatibility with network +storage backends. (#7494)

Logging Improvements

Logs now include event information generated by the event-monitor +module. (#7512)

Notable Bug Fixes

  • Fix several issues around CPUID in the guest (#7485, #7495, #7508)
  • Fix snapshot/restore for Windows Guest (#7492)
  • Respect queue size in block performance tests (#7515)
  • Fix several Serial Manager issues (#7502)
  • Fix several seccomp violation issues (#7477, #7497, #7518)
  • Fix various issues around block and qcow (#7526, #7528, #7537, #7546, +#7549)
  • Retrieve MSRs list correctly on MSHV (#7543)
  • Fix live migration (and snapshot/restore) with AMX state (#7534)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v50.1-released/index.html b/blog/cloud-hypervisor-v50.1-released/index.html new file mode 100644 index 00000000..2a186249 --- /dev/null +++ b/blog/cloud-hypervisor-v50.1-released/index.html @@ -0,0 +1,16 @@ +Cloud Hypervisor v50.1 Released! - Cloud Hypervisor

Cloud Hypervisor v50.1 Released!

Posted February 20, 2026 by Cloud Hypervisor Team ‐ 1 min read

This is a point release containing security fixes and bug fixes.

Security Fixes

This release fixes a security vulnerability in disk image handling. +Details can be found in GHSA-jmr4-g2hv-mjj6.

  • A new backing_files=on|off option has been added to --disk to +explicitly control whether QCOW2 backing files are permitted. This +defaults to off to prevent the loading of backing files entirely. +(#7685)
  • Explicit image type specification via the user interface, removing +reliance on format autodetection (#7728).
  • Prevent sector-zero writes for autodetected raw images (#7728).

Bug Fixes

  • Fix various inconsistencies in our OpenAPI specification file +(#7716, #7726)
  • Fix QCOW2 thread safety for multiple virtio queues +(num_queues > 1) (#7661)

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/cloud-hypervisor-v51.0-released/index.html b/blog/cloud-hypervisor-v51.0-released/index.html new file mode 100644 index 00000000..073029a5 --- /dev/null +++ b/blog/cloud-hypervisor-v51.0-released/index.html @@ -0,0 +1,40 @@ +Cloud Hypervisor v51.0 Released! - Cloud Hypervisor

Cloud Hypervisor v51.0 Released!

Posted February 20, 2026 by Cloud Hypervisor Team ‐ 3 min read

This release has been tracked in v51.0 group of our roadmap project.

Security Fixes

This release fixes a security vulnerability in disk image handling. +Details can be found in GHSA-jmr4-g2hv-mjj6.

  • A new backing_files=on|off option has been added to --disk to +explicitly control whether QCOW2 backing files are permitted. This +defaults to off to prevent the loading of backing files entirely. +(#7685)
  • Explicit image type specification via the user interface, removing +reliance on format autodetection (#7728).
  • Prevent sector-zero writes for autodetected raw images (#7728).

Significant QCOW2 v3 Improvements

A large number of QCOW2 v3 specification features have been implemented:

  • RAW backing file support for QCOW2 overlays (#7570)
  • Zero bit in L2 entries (#7627)
  • Incompatible feature bit validation (#7612)
  • Dirty bit support (#7636)
  • Variable refcount widths (1 to 64-bit) (#7633)
  • Corrupt bit detection and marking (#7639)
  • Autoclear feature bits handling (#7648)
  • Thread safety fix for multiple virtio queues (num_queues > 1) +(#7661)
  • Correct zero-fill for reads beyond backing file size (#7678)
  • Live disk resize support (#7687)

ACPI Generic Initiator Support

ACPI Generic Initiator Affinity (SRAT Type 5) support has been added +to associate VFIO-PCI devices with dedicated memory/CPU-less NUMA +nodes. This enables the guest OS to make NUMA-aware memory allocation +decisions for device workloads. A new device_id parameter has been +added to --numa for specifying VFIO devices. (#7626)

Block Device DISCARD and WRITE_ZEROES Support

The virtio-blk device now supports DISCARD and WRITE_ZEROES +operations for QCOW2 and RAW image formats. This enables thin +provisioning and efficient space reclamation when guests trim +filesystems. A new sparse=on|off option has been added to --disk to +control disk space management: sparse=on (default) enables thin +provisioning with space reclamation, while sparse=off provides thick +provisioning with consistent I/O latency. (#7666)

Notable Performance Improvements

  • Transparent Huge Pages (THP) support has been extended to cover +anonymous shared memory (shared=on) via madvise. Previously, THP +was only used for non-shared memory. (#7646)
  • The vhost-user-net device now uses the default set of vhost-user +virtio features, including VIRTIO_F_RING_INDIRECT_DESC, which +provides a performance improvement. (#7653)

MSHV Support Improvements

  • Optimize CPU state update after emulation by only updating special +registers when changed (#7603)
  • Enable SMT for guests with threads_per_core > 1 (#7668)
  • Stub save_data_tables() to unblock VM pause/resume (#7692)
  • Handle GHCB_INFO_SPECIAL_DBGPRINT VMG exit in SEV-SNP guest exit +handler (#7703)
  • Fix CVM boot failure on MSHV (#7548)
  • Fix CPU topology detection for multithreaded configurations (#7576)

Notable Bug Fixes

  • Fix VFIO device hot-remove leaving group and container file +descriptors open, preventing re-add (#7676)
  • Fix snapshot restore when backing file is on read-only storage with +shared=false (#7674)
  • Enforce VIRTIO_BLK_F_RO even if guest does not negotiate it +(#7705)
  • Fix read-only block device FLUSH requests from OVMF preventing VMs +from booting (#7706)
  • Fix vhost-user device not properly dropping unowned file descriptors +(#7679)
  • Fix vhost-user-block get_config interoperability (#7617)
  • Fix vsock TOCTOU race condition by copying packet header from guest +memory before processing (#7530)
  • Fix vsock handling of large TX packets spanning multiple data +descriptors (#7680)
  • Add gettid() to all seccomp filters (#7596)
  • Fix MAC address parsing that wrongly allowed + instead of hex +characters (#7579)
  • Improve UUID parse error message and --net fd help text (#7702)
  • Fix various inconsistencies in our OpenAPI specification file +(#7716, #7726)
  • Various documentation fixes (#7602, #7606)

Contributors

Many thanks to everyone who has contributed to our release:

Download

See the GitHub Release for the release assets.

+ + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 00000000..413d821d --- /dev/null +++ b/blog/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v51.0 Released!

Posted February 20, 2026 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v50.1 Released!

Posted February 20, 2026 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v50.0 Released!

Posted December 19, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v49.0 Released!

Posted November 9, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v48.0 Released!

Posted September 12, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v47.0 Released!

Posted July 22, 2025 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v46.0 Released!

Posted May 23, 2025 by Cloud Hypervisor Team ‐ 2 min read

+ + \ No newline at end of file diff --git a/blog/index.xml b/blog/index.xml new file mode 100644 index 00000000..6286a2c9 --- /dev/null +++ b/blog/index.xml @@ -0,0 +1,25 @@ +Blog onhttps://www.cloudhypervisor.org/blog/Recent content in Blog onHugo -- gohugo.ioen-USTue, 06 Oct 2020 08:49:55 +0000Cloud Hypervisor v51.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v51.0-released/Fri, 20 Feb 2026 01:34:50 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v51.0-released/This release has been tracked in v51.0 group of our roadmap project. +Security Fixes # This release fixes a security vulnerability in disk image handling. Details can be found in GHSA-jmr4-g2hv-mjj6. +A new backing_files=on|off option has been added to --disk to explicitly control whether QCOW2 backing files are permitted. This defaults to off to prevent the loading of backing files entirely. (#7685) Explicit image type specification via the user interface, removing reliance on format autodetection (#7728).Cloud Hypervisor v50.1 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.1-released/Fri, 20 Feb 2026 01:21:45 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.1-released/This is a point release containing security fixes and bug fixes. +Security Fixes # This release fixes a security vulnerability in disk image handling. Details can be found in GHSA-jmr4-g2hv-mjj6. +A new backing_files=on|off option has been added to --disk to explicitly control whether QCOW2 backing files are permitted. This defaults to off to prevent the loading of backing files entirely. (#7685) Explicit image type specification via the user interface, removing reliance on format autodetection (#7728).Cloud Hypervisor v50.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.0-released/Fri, 19 Dec 2025 03:04:36 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.0-released/This release has been tracked in v50.0 group of our roadmap project. +Configurable Nested Virtualization Option on x86_64 # The nested=on|off option has been added to --cpu to allow users to configure nested virtualization support in the guest on x86_64 hosts (for both KVM and MSHV). The default value is on to maintain consistency with existing behavior. (#7408) +Compression Support for QCOW2 # QCOW2 support has been extended to handle compression clusters based on zlib and zstd.Cloud Hypervisor v49.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v49.0-released/Sun, 09 Nov 2025 05:36:56 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v49.0-released/This release has been tracked in v49.0 group of our roadmap project. +MSHV Support Improvements # On AArch64 with MSHV, firmware boot (#7391) and graceful guest shutdown (#7354) are now supported, and CI coverage has been added (#7381). +Logging Improvements # Logs now use an improved timestamp format (#7355), emit an explicit message on graceful shutdown (#7346), and reduce noisy warnings with newer guest kernels (#7423). +Removed Default IP and Mask for virtio-net Devices # The implicit default IP (192.Cloud Hypervisor v48.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v48.0-released/Fri, 12 Sep 2025 23:05:40 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v48.0-released/This release has been tracked in v48.0 group of our roadmap project. +Experimental fw_cfg Device Support # This feature enables passing configuration data and files, such as VM boot configurations (kernel, kernel cmdline, e820 memory map, and ACPI tables), from the host to the guest. (#7117) +Experimental ivshmem Device Support # Support for inter-VM shared memory has been added. For more information, please refer to the ivshmem documentation. (#6703) +Firmware Boot Support on riscv64 # In addition to direct kernel boot, firmware boot support has been added on riscv64 hosts.Cloud Hypervisor v47.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v47.0-released/Tue, 22 Jul 2025 22:48:05 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v47.0-released/This release has been tracked in v47.0 group of our roadmap project. +Block Device Error Reporting to the Guest # Instead of exiting on I/O errors, the virtio-block device now reports errors to the guest using VIRTIO_BLK_S_IOERR. It improves the user experience particularly when the guest rootfs is not backed by the affected block device. (#7107) +Nice Error Messages on Exit # We now have the chain of errors being reported and printed nicely, when Cloud Hypervisor or ch-remote exits on errors.Cloud Hypervisor v46.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v46.0-released/Fri, 23 May 2025 22:07:00 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v46.0-released/This release has been tracked in v46.0 group of our roadmap project. +File-level Locking Support with --disk # Now file-level locking is enforced for disk images, provided by users with --disk. This ensures that only a single Cloud Hypervisor instance can obtain write access to a given disk image at any time, preventing misconfiguration and avoiding potential data corruption. (#6974) +Improved Error Reporting with VM Resizing # Instead of returning a generic error 400 (e.Cloud Hypervisor v45.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v45.0-released/Sun, 30 Mar 2025 17:28:57 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v45.0-released/This release has been tracked in v45.0 group of our roadmap project. +Experimental riscv64 Architecture Support # Cloud Hypervisor now has experimental riscv64 architecture support. Details can be found from the riscv documentation. +Alphabetically Sorted CLI Options # To improve the readability of CLI options, the output of the --help now is alphabetically sorted. (#6988) +Improved Downtime of VM Live Migration # The downtime of VM live migration is reduced via delaying some of the tearing down process of the source VM after the destination VM is up and running.Cloud Hypervisor v44.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v44.0-released/Mon, 03 Feb 2025 19:34:45 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v44.0-released/v44.0 # This release has been tracked in our roadmap project as iteration v44.0. The following user visible changes have been made: +Configurable virtio-iommu Address Width # The iommu_address_width option has been added to --platform to allow users to limit the virtio-iommu address space in the guest. (#6900) +Notable Performance Improvements # The VIRTIO_BLK_F_SEG_MAX feature has been enabled for virtio-block devices, which brings significant performance improvements on throughput. (#6885) +The io_uring entries are no longer forced to use async helper workers, delegating the decision to the kernel.Cloud Hypervisor v43.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v43.0-released/Wed, 18 Dec 2024 21:31:26 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v43.0-released/This release has been tracked in our roadmap project as iteration v43.0. The following user visible changes have been made: +Live Migration over TCP Connections # Support has been added to enable direct live migration from two hosts via TCP connections. This supplements the existing support for migrating over a UNIX socket which can then be tunnelled as desired. The documentation has been updated. (#6850) +Notable Performance Improvements # The VIRTIO_RING_F_INDIRECT_DESC feature has been enabled for virtio-block devices. \ No newline at end of file diff --git a/blog/memory-management-techniques/index.html b/blog/memory-management-techniques/index.html new file mode 100644 index 00000000..924d3d07 --- /dev/null +++ b/blog/memory-management-techniques/index.html @@ -0,0 +1,79 @@ +Memory Management Techniques - Cloud Hypervisor

Memory Management Techniques

Posted July 7, 2022 by Sebastien Boeuf ‐ 6 min read

Depending on the expectations around the workload running in a Virtual Machine +(VM), as well as the agreement between a customer and an operator, multiple use +cases related to memory management between host and guest arise and they can be +addressed through different techniques.

Host Managed

This section is about how memory can be managed by the host, as it knows the VM +is going to need more or less memory during its runtime.

This is particularly well illustrated by the Cloud Native use case, involving +containers being created or destroyed, leading to the need to adjust the amount +of memory available.

We can also take the example of users running a single VM with a certain amount +of RAM until they need more because a different type of workload requires a +larger amount of memory.

We don’t want to run a very large VM just in case we might need more memory +later because the larger the VM, the more expensive the cost. And that’s why +having access to such flexibility is very convenient for our users.

Ballooning

This technique was the former way of performing some sort of hot plug/unplug +without dealing with the complexity associated with adding or removing memory +slots. The logic is reversed in a sense, as the VM is created with the maximum +amount of memory that can be expected, and a balloon is inflated inside the +guest, in order to reduce the available amount of memory.

From a host perspective, if the system is running low on memory, inflating the +balloon from one or several VMs can help the host getting some memory back to +keep the system afloat. +On the other hand if the host has enough spare memory to give some more to one +of its VMs, it can deflate the balloon.

It is important to note that until recently (introduction of virtio-mem), +ballooning was the only reliable way of removing memory from a running VM.

Hot Plug

This is the proper technique for adding or removing memory to a VM, without +using a tool like a balloon. And there are two different ways of performing +memory hot plug, one is through ACPI and the other is with virtio-mem.

ACPI

This has been the standard way for hot plugging some memory into a VM for quite +some time. This is because the mechanism is part of the ACPI specification and +has been implemented in guest OSes such as Linux and Windows years ago.

Depending on the guest OS, limitations might differ, but for instance with Linux +there is no way to plug a memory DIMM smaller than 128 MiB. This doesn’t allow +for fine grained hot plug, but that’s good enough for practical use cases, as we +usually increase a VM’s memory using gigabyte as the unit.

The main drawback is the hot unplug really. This is inconvenient and complicated +for such operation to succeed because we must remove an entire memory DIMM. For +instance, if we plug an extra 2 GiB to a running VM, and later on we want to +remove only 1 GiB, this won’t be possible as we can only remove 2 GiB. Of course +we could have plugged the extra 2 GiB splitting it into 16 DIMMs of 128 MiB, but +we would hit the limit on how many memory slots are actually supported. +And even if we could work around this limitation, main part of the complexity +comes from the fact we have no way to ensure the guest isn’t using any of the +memory slot we’re trying to remove. +This makes hot unplug a non supported feature with ACPI hot plug mechanism. +This is the reason why before virtio-mem came into the picture, we could +combine ACPI hot plug with balloon, so that we would use the ACPI +mechanism for hot plugging while the balloon would be used for both hot unplug +and fine grained operations.

virtio-mem

This fairly recent solution has been introduced to address all use cases we +mentioned so far. It is a full hot plug/unplug solution as it doesn’t have any +of the drawbacks from balloon and ACPI hot plug. It allows for fine grained +hot plug/unplug, relying on the virtio-mem driver in the guest to manage small +chunks of memory. Unless you have strong reasons not to use virtio-mem (guest +kernel not recent enough for instance), this should be the standard way of +dynamically managing a VM’s memory. This feature is available starting with +Linux 5.8.

Guest Driven

Now that we’ve covered how the host can manage the guest memory allocated to a +VM, let’s look at the way the guest can notify the host for accurate memory +management.

Free Page Reporting

In general, when a VM is created with a certain amount of memory, only a small +portion of what is available is actually consumed by the VM after boot. But as +soon as one or multiple workloads run inside the guest, the memory starts being +paged. At this point, let’s say 90% of the VM’s memory have been allocated, the +guest might start freeing some pages after the workloads have been stopped. This +will have no impact on the amount of memory consumed from a host perspective, as +it has no way to know which pages the guest might have freed.

When looking for a way to overcommit memory, meaning when running multiple VMs +and the sum of all guest RAMs is higher than what the physical RAM can offer, +being able to free pages based on guest’s input is a must. And that’s what the +feature free page reporting has been added for in the virtio-balloon +specification.

This feature requires a virtio-balloon device to be created, but it doesn’t +require any balloon because inflating or deflating operations are not part of +the mechanism. When enabled, the guest will have a way of notifying the VMM +about set of pages being freed. Based on this information, the VMM will advise +the host that these pages are no longer in use, which effectively gives some +memory back to the host.

One small drawback of this feature is that depending on how frequently the guest +reports back to the host, the VMM will have more work and be slightly less +efficient. And that’s because the slight drop in performance that could be +observed that we didn’t enable this feature by default on Cloud Hypervisor.

Deflate on OOM

When running critical workloads that must not fail, particularly because of +memory pressure in the guest, the feature deflate on OOM can be very +convenient as it will give the guest the power to deflate the balloon when +an Out Of Memory (OOM) event happens.

Of course this means the balloon must have been previously inflated, otherwise +the guest will have nothing to deflate and no way to release the memory +pressure.

References

If you want to use these features with Cloud Hypervisor, please refer to the +following documentation:

+ + \ No newline at end of file diff --git a/blog/page/1/index.html b/blog/page/1/index.html new file mode 100644 index 00000000..a180db83 --- /dev/null +++ b/blog/page/1/index.html @@ -0,0 +1 @@ +https://www.cloudhypervisor.org/blog/ \ No newline at end of file diff --git a/blog/page/2/index.html b/blog/page/2/index.html new file mode 100644 index 00000000..eb939ffc --- /dev/null +++ b/blog/page/2/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v45.0 Released!

Posted March 30, 2025 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v44.0 Released!

Posted February 3, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v43.0 Released!

Posted December 18, 2024 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v42.0 Released!

Posted October 25, 2024 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v41.0 Released!

Posted August 16, 2024 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v40.0 Released!

Posted June 21, 2024 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v39.0 Released!

Posted April 27, 2024 by Cloud Hypervisor Team ‐ 2 min read

+ + \ No newline at end of file diff --git a/blog/page/3/index.html b/blog/page/3/index.html new file mode 100644 index 00000000..c4103df9 --- /dev/null +++ b/blog/page/3/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v38.0 Released!

Posted February 16, 2024 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v37.0 Released!

Posted December 14, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v36.0 Released!

Posted November 2, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v35.0 Released!

Posted September 21, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v34.0 Released!

Posted August 10, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v33.0 Released!

Posted June 29, 2023 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v32.0 Released!

Posted May 18, 2023 by Cloud Hypervisor Team ‐ 1 min read

+ + \ No newline at end of file diff --git a/blog/page/4/index.html b/blog/page/4/index.html new file mode 100644 index 00000000..ee64bbbd --- /dev/null +++ b/blog/page/4/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v31.0 Released!

Posted April 6, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v30.0 Released!

Posted February 24, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v29.0 Released!

Posted January 14, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v28.1 Released!

Posted December 14, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v28.0 Released!

Posted November 17, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v27.0 Released!

Posted September 29, 2022 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v26.0 Released!

Posted August 17, 2022 by Cloud Hypervisor Team ‐ 2 min read

+ + \ No newline at end of file diff --git a/blog/page/5/index.html b/blog/page/5/index.html new file mode 100644 index 00000000..207c71e0 --- /dev/null +++ b/blog/page/5/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v25.0 Released!

Posted July 7, 2022 by Cloud Hypervisor Team ‐ 1 min read

Memory Management Techniques

Posted July 7, 2022 by Sebastien Boeuf ‐ 6 min read

Cloud Hypervisor v24.0 Released!

Posted May 27, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v23.1 Released!

Posted May 9, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v23.0 Released!

Posted April 14, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v22.1 Released!

Posted March 11, 2022 by Cloud Hypervisor Team ‐ 1 min read

+ + \ No newline at end of file diff --git a/blog/page/6/index.html b/blog/page/6/index.html new file mode 100644 index 00000000..54a1c7c1 --- /dev/null +++ b/blog/page/6/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v21.1 Released!

Posted March 11, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v22.0 Released!

Posted March 3, 2022 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v21.0 Released!

Posted January 20, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v20.2 Released!

Posted January 4, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v20.1 Released!

Posted December 13, 2021 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v20.0 Released!

Posted December 2, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v19.0 Released!

Posted October 14, 2021 by Cloud Hypervisor Team ‐ 2 min read

+ + \ No newline at end of file diff --git a/blog/page/7/index.html b/blog/page/7/index.html new file mode 100644 index 00000000..39215ce2 --- /dev/null +++ b/blog/page/7/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v18.0 Released!

Posted September 9, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v17.0 Released!

Posted July 22, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v16.0 Released!

Posted June 10, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v15.0 Released!

Posted April 29, 2021 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.14.1 Released!

Posted March 31, 2021 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v0.14.0 Released!

Posted March 26, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.13.0 Released!

Posted February 12, 2021 by Cloud Hypervisor Team ‐ 2 min read

+ + \ No newline at end of file diff --git a/blog/page/8/index.html b/blog/page/8/index.html new file mode 100644 index 00000000..da648d2e --- /dev/null +++ b/blog/page/8/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor

Blog

Cloud Hypervisor v0.12.0 Released!

Posted December 10, 2020 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v0.11.0 Released!

Posted October 29, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.10.0 Released!

Posted September 18, 2020 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.9.0 Released!

Posted August 6, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.8.0 Released!

Posted June 11, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.7.0 Released!

Posted April 30, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.6.0 Released!

Posted March 20, 2020 by Cloud Hypervisor Team ‐ 2 min read

+ + \ No newline at end of file diff --git a/blog/page/9/index.html b/blog/page/9/index.html new file mode 100644 index 00000000..695b63a6 --- /dev/null +++ b/blog/page/9/index.html @@ -0,0 +1,5 @@ +Blog - Cloud Hypervisor
+ + \ No newline at end of file diff --git a/blog/sitemap.xml b/blog/sitemap.xml new file mode 100644 index 00000000..f4500b36 --- /dev/null +++ b/blog/sitemap.xml @@ -0,0 +1 @@ +https://www.cloudhypervisor.org/blog/cloud-hypervisor-v51.0-released/2026-02-20T01:34:50+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.1-released/2026-02-20T01:21:45+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.0-released/2025-12-19T03:04:36+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v49.0-released/2025-11-09T05:36:56+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v48.0-released/2025-09-12T23:05:40+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v47.0-released/2025-07-22T22:48:05+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v46.0-released/2025-05-23T22:07:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v45.0-released/2025-03-30T17:28:57+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v44.0-released/2025-02-03T19:34:45+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v43.0-released/2024-12-18T21:31:26+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v42.0-released/2024-10-25T09:20:04+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v41.0-released/2024-08-16T12:17:19+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v40.0-released/2024-06-21T11:12:02+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v39.0-released/2024-04-27T13:40:07+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v38.0-released/2024-02-16T18:20:29+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v37.0-released/2023-12-14T18:58:49+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v36.0-released/2023-11-02T16:06:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v35.0-released/2023-09-21T14:47:24+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v34.0-released/2023-08-10T16:44:32+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v33.0-released/2023-06-29T17:32:25+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v32.0-released/2023-05-18T18:13:12+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v31.0-released/2023-04-06T14:47:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v30.0-released/2023-02-24T01:10:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v29.0-released/2023-01-14T12:46:39+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v28.1-released/2022-12-14T11:20:23+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v28.0-released/2022-11-17T16:59:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v27.0-released/2022-09-29T18:02:19+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v26.0-released/2022-08-17T16:48:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v25.0-released/2022-07-07T14:59:55+00:00weekly0.5https://www.cloudhypervisor.org/blog/memory-management-techniques/2022-07-07T08:00:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v24.0-released/2022-05-27T08:00:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/achieving-bare-metal-performance-within-a-virtual-machine/2022-05-19T08:00:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v23.1-released/2022-05-09T14:24:16+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v23.0-released/2022-04-14T08:42:28+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v22.1-released/2022-03-11T09:09:21+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v21.1-released/2022-03-11T09:08:36+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v22.0-released/2022-03-03T18:10:22+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v21.0-released/2022-01-20T15:31:31+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v20.2-released/2022-01-04T17:57:10+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v20.1-released/2021-12-13T15:06:54+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v20.0-released/2021-12-02T16:15:22+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v19.0-released/2021-10-14T15:36:27+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v18.0-released/2021-09-09T14:31:29+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v17.0-released/2021-07-22T16:31:16+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v16.0-released/2021-06-10T16:13:47+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v15.0-released/2021-04-29T15:27:07+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.14.1-released/2021-03-31T16:11:23+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.14.0-released/2021-03-26T12:01:05+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.13.0-released/2021-02-12T11:02:35+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.12.0-released/2020-12-10T18:56:49+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.11.0-released/2020-10-29T17:55:41+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.10.0-released/2020-09-18T13:42:24+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.9.0-released/2020-08-06T14:30:07+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.8.0-released/2020-06-11T17:48:52+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.7.0-released/2020-04-30T15:52:08+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.6.0-released/2020-03-20T11:45:57+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.5.0-released/2020-02-07T15:42:54+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.4.0-released/2019-12-13T11:39:09+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.3.0-released/2019-10-18T11:21:46+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.2.0-released/2019-09-10T14:00:12+00:00weekly0.5 \ No newline at end of file diff --git a/config/_default/config.toml b/config/_default/config.toml deleted file mode 100644 index df71fa90..00000000 --- a/config/_default/config.toml +++ /dev/null @@ -1,89 +0,0 @@ -baseurl = "https://doks.netlify.app/" -canonifyURLs = false -disableAliases = true -disableHugoGeneratorInject = true -enableEmoji = true -enableGitInfo = false -enableRobotsTXT = true -languageCode = "en-US" -paginate = 7 -rssLimit = 10 - -# Multilingual -defaultContentLanguage = "en" -disableLanguages = ["de", "nl"] -# defaultContentLanguageInSubdir = true - -# add redirects/headers -[outputs] -home = ["HTML", "RSS", "REDIRECTS", "HEADERS"] -section = ["HTML", "RSS", "SITEMAP"] - -# remove .{ext} from text/netlify -[mediaTypes."text/netlify"] -suffixes = [""] -delimiter = "" - -# add output format for netlify _redirects -[outputFormats.REDIRECTS] -mediaType = "text/netlify" -baseName = "_redirects" -isPlainText = true -notAlternative = true - -# add output format for netlify _headers -[outputFormats.HEADERS] -mediaType = "text/netlify" -baseName = "_headers" -isPlainText = true -notAlternative = true - -# add output format for section sitemap.xml -[outputFormats.SITEMAP] -mediaType = "application/xml" -baseName = "sitemap" -isHTML = false -isPlainText = true -noUgly = true -rel = "sitemap" - -[caches] - [caches.getjson] - dir = ":cacheDir/:project" - maxAge = "10s" - -[sitemap] - changefreq = "weekly" - filename = "sitemap.xml" - priority = 0.5 - -[taxonomies] - contributor = "contributors" - -[permalinks] - blog = "/blog/:title/" -# docs = "/docs/1.0/:sections[1:]/:title/" - -[minify.tdewolff.html] - keepWhitespace = false - -[module] - [module.hugoVersion] - extended = true - min = "0.80.0" - max = "" - [[module.mounts]] - source = "assets" - target = "assets" - [[module.mounts]] - source = "static" - target = "static" - [[module.mounts]] - source = "node_modules/flexsearch" - target = "assets/js/vendor/flexsearch" - [[module.mounts]] - source = "node_modules/katex" - target = "assets/js/vendor/katex" - [[module.mounts]] - source = "node_modules/mermaid" - target = "assets/js/vendor/mermaid" diff --git a/config/_default/languages.toml b/config/_default/languages.toml deleted file mode 100644 index 6ee6333f..00000000 --- a/config/_default/languages.toml +++ /dev/null @@ -1,6 +0,0 @@ -[en] - languageName = "English" - contentDir = "content/en" - weight = 10 - [en.params] - languageISO = "EN" diff --git a/config/_default/markup.toml b/config/_default/markup.toml deleted file mode 100644 index 2880e305..00000000 --- a/config/_default/markup.toml +++ /dev/null @@ -1,29 +0,0 @@ -defaultMarkdownHandler = "goldmark" - -[goldmark] - [goldmark.extensions] - linkify = false - [goldmark.parser] - autoHeadingID = true - autoHeadingIDType = "github" - [goldmark.parser.attribute] - block = true - title = true - [goldmark.renderer] - unsafe = true - -[highlight] - codeFences = false - guessSyntax = false - hl_Lines = "" - lineNoStart = 1 - lineNos = false - lineNumbersInTable = true - noClasses = false - style = "dracula" - tabWidth = 4 - -[tableOfContents] - endLevel = 3 - ordered = false - startLevel = 2 diff --git a/config/_default/menus/menus.en.toml b/config/_default/menus/menus.en.toml deleted file mode 100644 index 75222c01..00000000 --- a/config/_default/menus/menus.en.toml +++ /dev/null @@ -1,40 +0,0 @@ -[[docs]] - name = "Prologue" - weight = 10 - identifier = "prologue" - url = "/docs/prologue/" - -[[main]] - name = "Docs" - url = "/docs/prologue/introduction/" -# url = "/docs/1.0/prologue/introduction/" - weight = 10 - -[[main]] - name = "Blog" - url = "/blog/" - weight = 20 - -[[social]] - name = "GitHub" - pre = "" - url = "https://github.com/cloud-hypervisor/cloud-hypervisor" - post = "v0.1.0" - weight = 10 - -[[social]] - name = "Slack" - pre = "" - url = "https://join.slack.com/t/cloud-hypervisor/shared_invite/enQtNjY3MTE3MDkwNDQ4LWQ1MTA1ZDVmODkwMWQ1MTRhYzk4ZGNlN2UwNTI3ZmFlODU0OTcwOWZjMTkwZDExYWE3YjFmNzgzY2FmNDAyMjI" - weight = 10 - -#[[social]] -# name = "Twitter" -# pre = "" -# url = "https://twitter.com/getdoks" -# weight = 20 - -# [[footer]] -# name = "Privacy" -# url = "/privacy-policy/" -# weight = 10 diff --git a/config/_default/params.toml b/config/_default/params.toml deleted file mode 100644 index 0497b334..00000000 --- a/config/_default/params.toml +++ /dev/null @@ -1,82 +0,0 @@ -# Meta Data for SEO - -## Homepage -title = "Cloud Hypervisor" -titleSeparator = "-" -titleAddition = "Run Cloud Virtual Machines Securely and Efficiently" -description = "Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) implemented in Rust that focuses on running modern, cloud workloads, with minimal hardware emulation." - -## Documentation -# docsVersion = "0.3" - -## Open Graph -images = ["doks.png"] -ogLocale = "en_US" -domainTLD = "doks.netlify.app" -titleHome = "Doks Theme" - -## Twitter Cards -#twitterSite = "@getdoks" -#twitterCreator = "@henkverlinde" - -## JSON-LD -# schemaType = "Person" -schemaType = "Organization" -schemaName = "Cloud Hypervisor" -schemaLocale = "en-US" -#schemaLogo = "logo-doks.png" -#schemaLogoWidth = 512 -#schemaLogoHeight = 512 -#schemaImage = "doks.png" -#schemaImageWidth = 1280 -#schemaImageHeight = 640 -schemaGitHub = "https://github.com/cloud-hypervisor/cloud-hypervisor" -schemaSection = "blog" - -## Sitelinks Search Box -siteLinksSearchBox = false - -## Chrome Browser -themeColor = "#fff" - -# Images -quality = 85 -bgColor = "#fff" -landscapePhotoWidths = [900, 800, 700, 600, 500] -portraitPhotoWidths = [800, 700, 600, 500] -lqipWidth = "20x" -smallLimit = "300" - -# Footer -footer = "Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks" - -# Feed -copyRight = "Copyright (c) 2019-2021 Cloud Hypervisor authors" - -# Alert -alert = false -alertDismissable = true -# alertText = "Introducing the Doks child theme, several DX + UX updates, and more! Check out Doks v0.2" -alertText = "Introducing the Doks child theme, several DX + UX updates, and more! Check out Doks v0.2" - -# Edit Page -# repoHost [Github | Gitea | GitLab] is used for building the edit link based on git hoster -repoHost = "GitHub" -#repoHost = "Gitea" -docsRepo = "https://github.com/cloud-hypervisor/cloud-hypervisor" -docsRepoBranch = "master" -editPage = false - -[options] - lazySizes = true - clipBoard = true - instantPage = true - flexSearch = true - darkMode = true - bootStrapJs = true - breadCrumb = false - highLight = true - kaTex = false - collapsibleSidebar = true - multilingualMode = false - docsVersioning = false diff --git a/config/next/config.toml b/config/next/config.toml deleted file mode 100644 index 9c5e90da..00000000 --- a/config/next/config.toml +++ /dev/null @@ -1 +0,0 @@ -canonifyURLs = false diff --git a/config/postcss.config.js b/config/postcss.config.js deleted file mode 100644 index b6891e2c..00000000 --- a/config/postcss.config.js +++ /dev/null @@ -1,36 +0,0 @@ -const autoprefixer = require('autoprefixer'); -const purgecss = require('@fullhuman/postcss-purgecss'); -const whitelister = require('purgecss-whitelister'); - -module.exports = { - plugins: [ - autoprefixer(), - purgecss({ - content: [ - './layouts/**/*.html', - './content/**/*.md', - ], - safelist: [ - 'lazyloaded', - 'table', - 'thead', - 'tbody', - 'tr', - 'th', - 'td', - 'h5', - 'alert-link', - ...whitelister([ - './assets/scss/components/_buttons.scss', - './assets/scss/components/_code.scss', - './assets/scss/components/_diagrams.scss', - './assets/scss/components/_syntax.scss', - './assets/scss/components/_search.scss', - './assets/scss/common/_dark.scss', - './node_modules/bootstrap/scss/_dropdown.scss', - './node_modules/katex/dist/katex.css', - ]), - ], - }), - ], -} diff --git a/config/production/config.toml b/config/production/config.toml deleted file mode 100644 index 19e9e353..00000000 --- a/config/production/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -canonifyURLs = true -baseurl = "https://www.cloudhypervisor.org" diff --git a/content/en/_index.md b/content/en/_index.md deleted file mode 100644 index 5612ab64..00000000 --- a/content/en/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title : "Run Cloud Virtual Machines Securely and Efficiently" -description: "Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) implemented in Rust that focuses on running modern, cloud workloads, with minimal hardware emulation." -lead: "Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) implemented in Rust that focuses on running modern, cloud workloads, with minimal hardware emulation." -date: 2020-10-06T08:47:36+00:00 -lastmod: 2020-10-06T08:47:36+00:00 -draft: false -images: [] ---- diff --git a/content/en/blog/_index.md b/content/en/blog/_index.md deleted file mode 100644 index 37cb611d..00000000 --- a/content/en/blog/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Blog" -description: "The Doks Blog." -date: 2020-10-06T08:49:55+00:00 -lastmod: 2020-10-06T08:49:55+00:00 -draft: false -images: [] ---- diff --git a/content/en/blog/baremetal_performance/index.md b/content/en/blog/baremetal_performance/index.md deleted file mode 100644 index 78b6d080..00000000 --- a/content/en/blog/baremetal_performance/index.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: "Achieving Bare Metal Performance Within a Virtual Machine" -date: 2022-05-19T08:00:00Z -draft: false -contributors: [Sebastien Boeuf] ---- - -There are use cases for which a workload needs to access specific hardware such -as accelerators, GPU or network adapters to maximise potential performance. And -since these workloads run inside virtual machines (VM) for security reasons, the -challenge is to make this hardware available from within the VM, but without -degrading the performance that can be achieved from bare metal. - -### VFIO, the Ideal Choice - -This is a mature framework allowing a PCI device to be bound to the `vfio-pci` -driver instead of the default driver it is usually attached to. - -It exposes an ioctl interface so that a userspace program can interact with the -device and retrieve all the information it needs. In the virtualization case, -this userspace program is the Virtual Machine Monitor (VMM), Cloud Hypervisor -for instance, which after it got all the information from the device, exposes -them to the guest. And that is how the workload can access the device inside the -VM, exactly the same way it would if it was directly running on bare metal. - -Now that we've covered the functional aspect, let's have a look at the way we -can achieve bare metal performance from the guest. - -The main idea for not degrading performance is to avoid as much as possible to -trigger VM exits when the workload interacts with the device, as well as when -it receives interrupts from it. - -#### Base Address Registers - -First, we can look at the PCI Base Address Registers (BAR). We need to prevent -a BAR access from generating a VM exit. This is done by mapping the device -region directly into the VMM virtual address space, and make this same region a -user memory region at the hypervisor level. This means we tell KVM to inform -the CPU it can find the pages related to this region directly at a specific -address in physical RAM. Once this is properly configured, any memory access -from guest workload to one of the device's PCI BARs will result in a direct -access to physical RAM from the CPU as it can find the pages from the Extended -Page Table (EPT). - -There's one small part of the BARs for which we can't avoid VM exits, the MSI-X -tables. MSI-X specification expects the vector table and pending bit array to be -part of the device BARs. But the VMM needs to trap every access to these tables -since it's responsible for configuring the interrupts both at the KVM and VFIO -levels. This is important to note this doesn't impact the performance of the -device when being used by the guest. The interrupt vectors are only configured -during the initialization of the device driver, which is already completed at -the time the workload interacts with the device. - -#### Direct Memory Accesses - -The second aspect, the main one actually, is how Direct Memory Access (DMA) is -performed securely without generating any VM exit. DMA is the standard way for -a device to access physical RAM without involving CPU cycles, which allows the -device to achieve very high performance. In the context of virtualization, we -want to reuse this mechanism, but without allowing a malicious guest to use this -device to reach every address from physical RAM. That's where the IOMMU comes -into play, as the gatekeeper of RAM accesses from any device on the machine. -The VMM is responsible for configuring the IOMMU through the VFIO interface. It -provides the set of pages that can be accessed from a specific device, which -usually means the entire guest RAM. This information is stored in the DMA -Remapping (DMAR) table as part of the IOMMU. Whenever the workload initiate a -DMA transfer between the device and the guest RAM, the IOMMU will allow such -access, but if the address is outside the authorized range, the IOMMU will -prevent the transfer from happening. That's how security is enforced in the -virtualization context. - -Since DMA doesn't involve CPU to access the memory, a DMA transfer doesn't -trigger any VM exit, providing identical performance to what can be observed -on bare metal. - -#### Interrupts - -Third and last aspect, the interrupts. Depending on the type of device, we can -see a lot of interrupts being generated, which can trigger a large amount of VM -exits, affecting directly the performance of the device inside the VM. - -The way to avoid such disruption is by relying on fairly recent hardware to -leverage a feature called Posted Interrupts (PI). This is both part of the CPU -with the virtual APIC (APICv) and the IOMMU through the Interrupt Remapping (IR) -table. When the hardware supports it, the hypervisor on behalf of the VMM will -configure the IOMMU by adding new entries to the IR table. Later on, whenever -an interrupt is triggered, the IOMMU will check the IR table to find out the PI -descriptor associated with it. It then triggers the correct interrupt inside the -guest relying on the APICv. This whole chain of events is entirely handled in -hardware, meaning there's no VM exit involved, which doesn't lead to any drop -in performance. - -#### How To Use VFIO - -For more details on how to use VFIO with Cloud Hypervisor, refer to the -following [documentation](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/vfio.md). - -### vDPA, an Interesting Alternative - -vDPA stands for virtio Data Path Acceleration, and the main reason this new -framework exists is its ability to simplify the migration process. The whole -concept behind vDPA relies on the virtio specification, which is what makes it -more suited for migration. - -#### Control Path - -On the one hand, the virtio control path is used for configuring the virtqueues -and getting information about the device. This is achieved through the ioctl -interface that is accessible through the device node `/dev/vhost-vdpa`. The -userspace program, the VMM again, retrieves all the information it needs so it -can expose the correct type of virtio device to the guest, with the right amount -of queues, the size of each queue, and the virtio configuration associated with. - -#### Data Path - -On the other hand, the virtio data path, effectively the virtqueues themselves, -is used to transfer the data between frontend in the guest and backend from the -host. But in this very special case, the virtqueues are directly part of the -physical device, allowing DMA transfers to be initiated by the guest. And the -same way it works with VFIO because the device is also attached to a physical -IOMMU, the guest can perform secure and efficient memory accesses from the -device. - -#### Migration (experimental) - -Providing a simpler path for migrating physical devices from one VM to another -is one of the main reason vDPA was created. Because of the design relying on -virtqueues, most of the migration complexity can be handled by the VMM, without -the need for the vDPA device to provide an opaque blob of data that will have to -be restored on the destination VM. That's where it differentiates from the VFIO -approach, which will require every vendor to implement the VFIO migration API as -part of their driver, providing an opaque blob specific to each device. - -It's important to note that VFIO migration API is very recent and not heavily -tested and deployed, meaning you might want to wait for a bit before jumping -to it. - -For vDPA, which is a very recent addition to the Linux kernel, the migration -isn't fully figured out yet by the maintainers since it still requires some -extra support through the virtio specification that will allow to stop a device -before it can be migrated. -There's an alternative approach implemented in software part of the Data Plan -Development Kit (DPDK). It shadows the virtqueues to have complete knowledge of -what is happening inside the queues, and therefore at any point in time it can -stop the device and start migrating. - -#### How To Use vDPA - -For more details on how to use vDPA with Cloud Hypervisor, refer to the -following [documentation](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/vdpa.md). \ No newline at end of file diff --git a/content/en/blog/memory_management/index.md b/content/en/blog/memory_management/index.md deleted file mode 100644 index 8fe1bb23..00000000 --- a/content/en/blog/memory_management/index.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: "Memory Management Techniques" -date: 2022-07-07T08:00:00Z -draft: false -contributors: [Sebastien Boeuf] ---- - -Depending on the expectations around the workload running in a Virtual Machine -(VM), as well as the agreement between a customer and an operator, multiple use -cases related to memory management between host and guest arise and they can be -addressed through different techniques. - -### Host Managed - -This section is about how memory can be managed by the host, as it knows the VM -is going to need more or less memory during its runtime. - -This is particularly well illustrated by the Cloud Native use case, involving -containers being created or destroyed, leading to the need to adjust the amount -of memory available. - -We can also take the example of users running a single VM with a certain amount -of RAM until they need more because a different type of workload requires a -larger amount of memory. - -We don't want to run a very large VM just in case we might need more memory -later because the larger the VM, the more expensive the cost. And that's why -having access to such flexibility is very convenient for our users. - -#### Ballooning - -This technique was the former way of performing some sort of hot plug/unplug -without dealing with the complexity associated with adding or removing memory -slots. The logic is reversed in a sense, as the VM is created with the maximum -amount of memory that can be expected, and a balloon is inflated inside the -guest, in order to reduce the available amount of memory. - -From a host perspective, if the system is running low on memory, inflating the -balloon from one or several VMs can help the host getting some memory back to -keep the system afloat. -On the other hand if the host has enough spare memory to give some more to one -of its VMs, it can deflate the balloon. - -It is important to note that until recently (introduction of `virtio-mem`), -ballooning was the only reliable way of removing memory from a running VM. - -#### Hot Plug - -This is the proper technique for adding or removing memory to a VM, without -using a tool like a balloon. And there are two different ways of performing -memory hot plug, one is through `ACPI` and the other is with `virtio-mem`. - -##### ACPI - -This has been the standard way for hot plugging some memory into a VM for quite -some time. This is because the mechanism is part of the ACPI specification and -has been implemented in guest OSes such as Linux and Windows years ago. - -Depending on the guest OS, limitations might differ, but for instance with Linux -there is no way to plug a memory DIMM smaller than 128 MiB. This doesn't allow -for fine grained hot plug, but that's good enough for practical use cases, as we -usually increase a VM's memory using gigabyte as the unit. - -The main drawback is the hot unplug really. This is inconvenient and complicated -for such operation to succeed because we must remove an entire memory DIMM. For -instance, if we plug an extra 2 GiB to a running VM, and later on we want to -remove only 1 GiB, this won't be possible as we can only remove 2 GiB. Of course -we could have plugged the extra 2 GiB splitting it into 16 DIMMs of 128 MiB, but -we would hit the limit on how many memory slots are actually supported. -And even if we could work around this limitation, main part of the complexity -comes from the fact we have no way to ensure the guest isn't using any of the -memory slot we're trying to remove. -This makes hot unplug a non supported feature with `ACPI` hot plug mechanism. -This is the reason why before `virtio-mem` came into the picture, we could -combine `ACPI` hot plug with `balloon`, so that we would use the `ACPI` -mechanism for hot plugging while the balloon would be used for both hot unplug -and fine grained operations. - -##### virtio-mem - -This fairly recent solution has been introduced to address all use cases we -mentioned so far. It is a full hot plug/unplug solution as it doesn't have any -of the drawbacks from `balloon` and `ACPI` hot plug. It allows for fine grained -hot plug/unplug, relying on the `virtio-mem` driver in the guest to manage small -chunks of memory. Unless you have strong reasons not to use `virtio-mem` (guest -kernel not recent enough for instance), this should be the standard way of -dynamically managing a VM's memory. This feature is available starting with -Linux 5.8. - -### Guest Driven - -Now that we've covered how the host can manage the guest memory allocated to a -VM, let's look at the way the guest can notify the host for accurate memory -management. - -#### Free Page Reporting - -In general, when a VM is created with a certain amount of memory, only a small -portion of what is available is actually consumed by the VM after boot. But as -soon as one or multiple workloads run inside the guest, the memory starts being -paged. At this point, let's say 90% of the VM's memory have been allocated, the -guest might start freeing some pages after the workloads have been stopped. This -will have no impact on the amount of memory consumed from a host perspective, as -it has no way to know which pages the guest might have freed. - -When looking for a way to overcommit memory, meaning when running multiple VMs -and the sum of all guest RAMs is higher than what the physical RAM can offer, -being able to free pages based on guest's input is a must. And that's what the -feature `free page reporting` has been added for in the `virtio-balloon` -specification. - -This feature requires a `virtio-balloon` device to be created, but it doesn't -require any balloon because inflating or deflating operations are not part of -the mechanism. When enabled, the guest will have a way of notifying the VMM -about set of pages being freed. Based on this information, the VMM will advise -the host that these pages are no longer in use, which effectively gives some -memory back to the host. - -One small drawback of this feature is that depending on how frequently the guest -reports back to the host, the VMM will have more work and be slightly less -efficient. And that's because the slight drop in performance that could be -observed that we didn't enable this feature by default on Cloud Hypervisor. - -#### Deflate on OOM - -When running critical workloads that must not fail, particularly because of -memory pressure in the guest, the feature `deflate on OOM` can be very -convenient as it will give the guest the power to deflate the `balloon` when -an Out Of Memory (OOM) event happens. - -Of course this means the `balloon` must have been previously inflated, otherwise -the guest will have nothing to deflate and no way to release the memory -pressure. - -### References - -If you want to use these features with Cloud Hypervisor, please refer to the -following documentation: -- [Memory Ballooning](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/balloon.md) -- [Memory Hot Plug](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/memory.md) -- [Guest Features](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/balloon.md) diff --git a/content/en/blog/v0.10.0/index.md b/content/en/blog/v0.10.0/index.md deleted file mode 100644 index acc9a682..00000000 --- a/content/en/blog/v0.10.0/index.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Cloud Hypervisor v0.10.0 Released!" -date: 2020-09-18T13:42:24Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.10.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/13). - -Highlights for `cloud-hypervisor` version 0.10.0 include: - -### `virtio-block` Support for Multiple Descriptors - -Some `virtio-block` device drivers may generate requests with multiple descriptors and support has been added for those drivers. - -### Memory Zones - -Support has been added for fine grained control of memory allocation for the guest. This includes controlling the backing of sections of guest memory, assigning to specific host NUMA nodes and assigning memory and vCPUs to specific memory nodes inside the guest. Full details of this can be found in the [memory documentation](docs/memory.md). - -### `Seccomp` Sandbox Improvements - -All the remaining threads and devices are now isolated within their own `seccomp` filters. This provides a layer of sandboxing and enhances the security model of `cloud-hypervisor`. - -### Preliminary KVM HyperV Emulation Control - -A new option (`kvm_hyperv`) has been added to `--cpus` to provide an option to toggle on KVM's HyperV emulation support. This enables progress towards booting Windows without adding extra emulated devices. - -### Notable Bug Fixes - -- When using `ch-remote` to resize the VM parameter now accepts the standard sizes suffices (#1596) -- `cloud-hypervisor` no longer panics when started with `--memory hotplug_method=virtio-mem` and no `hotplug_size` (#1564) -- After a reboot memory can remove when using `--memory hotplug_method=virtio-mem` (#1593) -- `--version` shows the version for released binaries (#1669) -- Errors generated by worker threads for `virtio` devices are now printed out (#1551) - -### Contributors - -Many thanks to everyone who has contributed to our 0.10.0 release including some new faces. - -* Alyssa Ross -* Amey Narkhede -* Anatol Belski -* Bo Chen -* Hui Zhu -* Michael Zhao -* Muminul Islam -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Wei Liu - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.11.0/index.md b/content/en/blog/v0.11.0/index.md deleted file mode 100644 index b96c290a..00000000 --- a/content/en/blog/v0.11.0/index.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: "Cloud Hypervisor v0.11.0 Released!" -date: 2020-10-29T17:55:41Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -# v0.11.0 - -This release has been tracked through the [0.11.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/14). - -Highlights for `cloud-hypervisor` version 0.11.0 include: - -### `io_uring` support by default for `virtio-block` - -Provided that the host OS supports it (Linux kernel 5.8+) then `io_uring` will -be used for a significantly higher performance block device. - -### Windows Guest Support - -This is the first release where we officially support Windows running as a -guest. Full details of how to setup the image and run Cloud Hypervisor with a -Windows guest can be found in the dedicated [Windows -documentation](docs/windows.md). - -### `vhost-user` "Self Spawning" Deprecation - -Automatically spawning a `vhost-user-net` or `vhost-user-block` backend is now -deprecated. Users of this functionality will receive a warning and should make -adjustments. The functionality will be removed in the next release. - -### `virtio-mmmio` Removal - -Support for using the `virtio-mmio` transport, rather than using PCI, has been -removed. This has been to simplify the code and significantly -reduce the testing burden of the project. - -### Snapshot/Restore support for ARM64 - -When running on the ARM64 architecture snapshot and restore has now been -implemented. - -### Improved Linux Boot Time - -The time to boot the Linux kernel has been significantly improved by the -identifying some areas of delays around PCI bus probing, IOAPIC programming and -MPTABLE issues. Full details can be seen in #1728. - -### `SIGTERM/SIGINT` Interrupt Signal Handling - -When the VMM process receives the `SIGTERM` or `SIGINT` signals then it will -trigger the VMM process to cleanly deallocate resources before exiting. The -guest VM will not be cleanly shutdown but the VMM process will clean up its -resources. - -### Default Log Level Changed - -The default logging level was changed to include warnings which should make it -easier to see potential issues. New [logging -documentation](docs/logging) was also added. - -### New `--balloon` Parameter Added - -Control of the setup of `virtio-balloon` has been moved from `--memory` to its -own dedicated parameter. This makes it easier to add more balloon specific -controls without overloading `--memory`. - -### Experimental `virtio-watchdog` Support - -Support for using a new `virtio-watchdog` has been added which can be used to -have the VMM reboot the guest if the guest userspace fails to ping the -watchdog. This is enabled with `--watchdog` and requires kernel support. - -### Notable Bug Fixes - -* MTRR bit was missing from CPUID advertised to guest -* "Return" key could not be used under `CMD.EXE` under Windows SAC (#1170) -* CPU identification string is now exposed to the guest -* `virtio-pmem` with`discard_writes=on` no longer marks the guest memory as - read only so avoids excessive VM exits (#1795) -* PCI device hotplug after an unplug was fixed (#1802) -* When using the ACPI method to resize the guest memory the full reserved size - can be used (#1803) -* Snapshot and restore followed by a second snapshot and restore now works - correctly -* Snapshot and restore of VMs with more than 2GiB in one region now work - correctly - -### Contributors - -Many thanks to everyone who has contributed to our 0.11.0 release including some new faces. - -* Anatol Belski -* Bo Chen -* Daniel Verkamp -* Henry Wang -* Hui Zhu -* Jiangbo Wu -* Josh Soref -* Julio Montes -* Michael Zhao -* Muminul Islam -* pierwill <19642016+pierwill@users.noreply.github.com> -* Praveen Paladugu -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.12.0/index.md b/content/en/blog/v0.12.0/index.md deleted file mode 100644 index 97327a05..00000000 --- a/content/en/blog/v0.12.0/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Cloud Hypervisor v0.12.0 Released!" -date: 2020-12-10T18:56:49Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.12.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/15). - -Highlights for `cloud-hypervisor` version 0.12.0 include: - -### ARM64 enhancements - -The use of `--watchdog` is now fully supported as is the ability to reboot the -VM from within the guest when running Cloud Hypervisor on an ARM64 system. - -### Removal of `vhost-user-net` and `vhost-user-block` self spawning - -In order to use `vhost-user-net` or `vhost-user-block` backends the user is now -responsible for starting the backend and providing the socket for the VMM to -use. This functionality was deprecated in the last release and how now been -removed. - -### Migration of `vhost-user-fs` backend - -The `vhost-user-fs` backend is no longer included in Cloud Hypervisor and it is -instead hosted in [it's own -repository](https://gitlab.com/virtio-fs/virtiofsd-rs) - -### Enhanced "info" API - -The `vm.info` HTTP API endpoint has been extended to include the details of the -devices used by the VM including any VFIO devices used. - -### Contributors - -Many thanks to everyone who has contributed to our 0.12.0 release: - -* Anatol Belski -* Julio Montes -* Michael Zhao -* Muminul Islam -* Rob Bradford -* Samuel Ortiz -* Wei Liu - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.13.0/index.md b/content/en/blog/v0.13.0/index.md deleted file mode 100644 index eaee6f9b..00000000 --- a/content/en/blog/v0.13.0/index.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Cloud Hypervisor v0.13.0 Released!" -date: 2021-02-12T11:02:35Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.13.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/16). - -Highlights for `cloud-hypervisor` version 0.13.0 include: - -### Wider VFIO device support - -It is now possible to use Cloud Hypervisor's VFIO support to passthrough PCI -devices that do not support MSI or MSI-X and instead rely on INTx interrupts. -Most notably this widens the support to most NVIDIA cards with the proprietary -drivers. - -### Improve huge page support - -Through the addition of `hugepage_size` on `--memory` it is now possible to -specify the desired size of the huge pages used when allocating the guest -memory. The user is required to ensure they have sufficient pages of the -desired size in their pool. - -### MACvTAP support - -It is now possible to provide file descriptors using the `fd` parameter to -`--net` which point at TAP devices that have already been opened by the user. -This aids integration with `libvirt` but also permits the use of MACvTAP -support. This is documented in dedicated [macvtap documentation](docs/macvtap-bridge.md). - -### VHD disk image support - -It is now possible to use VHD (fixed) disk images as well as QCOWv2 and raw -disk image with Cloud Hypervisor. - -### Improved Virtio device threading - -Device threads are now derived from the main VMM thread which allows more -restrictive seccomp filters to be applied to them. The threads also have a -predictable name derived from the device id. - -### Clean shutdown support via synthetic power button - -It is now possible to request that the guest VM shut itself down by triggering -a synthetic ACPI power button press from the VMM. If the guest is listening for -such an event (e.g. using systemd) then it will process the event and cleanly -shut down. This functionality is exposed through the HTTP API and can be -triggered via `ch-remote --api-socket= power-button`. - -### Contributors - -Many thanks to everyone who has contributed to our 0.13.0 release including -some new faces. - -* Bo Chen -* Mikko Ylinen -* Muminul Islam -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Vineeth Pillai -* Wei Liu -* William Douglas -* Xie Yongji -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.14.0/index.md b/content/en/blog/v0.14.0/index.md deleted file mode 100644 index 99567e14..00000000 --- a/content/en/blog/v0.14.0/index.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "Cloud Hypervisor v0.14.0 Released!" -date: 2021-03-26T12:01:05Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.14.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/17). - -Highlights for `cloud-hypervisor` version 0.14.0 include: - -### Structured event monitoring - -A new option was added to the VMM `--event-monitor` which reports structured -events (JSON) over a file or file descriptor at key events in the lifecycle of -the VM. The list of events is limited at the moment but will be further -extended over subsequent releases. The events exposed form part of the Cloud -Hypervisor API surface. - -### MSHV improvements - -Basic support has been added for running Windows guests atop the MSHV -hypervisor as an alternative to KVM and further improvements have been made to -the MSHV support. - -### Improved aarch64 platform - -The aarch64 platform has been enhanced with more devices exposed to the running -VM including an enhanced serial UART. - -### Updated hotplug documentation - -The documentation for the hotplug support has been updated to reflect the use -of the `ch-remote` tool and to include details of `virtio-mem` based hotplug as -well as documenting hotplug of paravirtualised and VFIO devices. - -### PTY control for serial and `virtio-console` - -The `--serial` and `--console` parameters can now direct the console to a PTY -allowing programmatic control of the console from another process through the -PTY subsystem. - -### Block device rate limiting - -The block device performance can now be constrained as part of the VM -configuration allowing rate limiting. Full details of the controls are in the -[IO throttling doumentation.](docs/io_throttling.md) - - -### Deprecations - -Deprecated features will be removed in a subsequent release and users should plan to use alternatives - -* Support for booting with the "LinuxBoot" protocol for ELF and `bzImage` - binaries has been deprecated. When using direct boot users should configure - their kernel with `CONFIG_PVH=y`. - - -### Contributors - -Many thanks to everyone who has contributed to our 0.14.0 release including -some new faces. - -* Bo Chen -* Henry Wang -* Iggy Jackson -* Jiachen Zhang -* Michael Zhao -* Muminul Islam -* Penny Zheng -* Rob Bradford -* Sebastien Boeuf -* Vineeth Pillai -* Wei Liu -* William Douglas -* Zide Chen -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.14.1/index.md b/content/en/blog/v0.14.1/index.md deleted file mode 100644 index ef8615b0..00000000 --- a/content/en/blog/v0.14.1/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Cloud Hypervisor v0.14.1 Released!" -date: 2021-03-31T16:11:23Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -Bug fix release branched off the v0.14.0 release. The following bugs -were fixed in this release: - -* CPU hotplug on Windows failed due to misreported CPU state information and - the lack of HyperV CPUID bit enabled (#2437, #2449, #2436) -* A seccomp rule was missing that was triggered on CPU unplug (#2455) -* A bounds check in VIRTIO queue validation was erroneously generating - DescriptorChainTooShort errors in certain circumstances (#2450, #2424) -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.2.0/index.md b/content/en/blog/v0.2.0/index.md deleted file mode 100644 index db163455..00000000 --- a/content/en/blog/v0.2.0/index.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "Cloud Hypervisor v0.2.0 Released!" -date: 2019-09-10T14:00:12Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.2.0 project](https://github.com/intel/cloud-hypervisor/projects/2). - -Highlights for `cloud-hypervisor` version 0.2.0 include: - -### Network device offloading - -As part of our general effort to offload paravirtualized I/O to external -processes, we added support for -[vhost-user-net](https://access.redhat.com/solutions/3394851) backends. This -enables `cloud-hypervisor` users to plug a `vhost-user` based networking device -(e.g. [DPDK](https://dpdk.org)) into the VMM as their virtio network backend. - -### Minimal hardware-reduced ACPI - -In order to properly implement and guest reset and shutdown, we implemented -a minimal version of the hardware-reduced ACPI specification. Together with -a tiny I/O port based ACPI device, this allows `cloud-hypervisor` guests to -cleanly reboot and shutdown. - -The ACPI implementation is a `cloud-hypervisor` build time option that is -enabled by default. - -### Debug I/O port - -Based on the Firecracker idea of using a dedicated I/O port to measure guest -boot times, we added support for logging guest events through the -[0x80](https://www.intel.com/content/www/us/en/support/articles/000005500/boards-and-kits.html) -PC debug port. This allows, among other things, for granular guest boot time -measurements. See our [debug port documentation](https://github.com/intel/cloud-hypervisor/blob/master/docs/debug-port.md) -for more details. - -### Improved direct device assignment - -We fixed a major performance issue with our initial VFIO implementation: When -enabling VT-d through the KVM and VFIO APIs, our guest memory writes and reads -were (in many cases) not cached. After correctly tagging the guest memory from -`cloud-hypervisor` we're now able to reach the expected performance from -directly assigned devices. - -### Improved shared filesystem - -We added shared memory region with [DAX](https://www.kernel.org/doc/Documentation/filesystems/dax.txt) -support to our [virtio-fs](https://virtio-fs.gitlab.io/) shared file system. -This provides better shared filesystem IO performance with a smaller guest -memory footprint. - -### Ubuntu bionic based CI - -Thanks to our [simple KVM firmware](https://github.com/intel/rust-hypervisor-firmware) -improvements, we are now able to boot Ubuntu bionic images. We added those to -our CI pipeline. -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.3.0/index.md b/content/en/blog/v0.3.0/index.md deleted file mode 100644 index e3cb923d..00000000 --- a/content/en/blog/v0.3.0/index.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: "Cloud Hypervisor v0.3.0 Released!" -date: 2019-10-18T11:21:46Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -# v0.3.0 - -This release has been tracked through the [0.3.0 project](https://github.com/intel/cloud-hypervisor/projects/3). - -Highlights for `cloud-hypervisor` version 0.3.0 include: - -### Block device offloading - -We continue to work on offloading paravirtualized I/O to external processes, and we added support for [vhost-user-blk](https://access.redhat.com/solutions/3394851) backends. -This enables `cloud-hypervisor` users to plug a `vhost-user` based block device like [SPDK](https://spdk.io)) into the VMM as their paravirtualized storage backend. - -### Network device backend - -The previous release provided support for [vhost-user-net](https://access.redhat.com/solutions/3394851) backends. Now we also provide a TAP based vhost-user-net backend, implemented in Rust. Together with the vhost-user-net device implementation, this will eventually become the Cloud Hypervisor default paravirtualized networking architecture. - -### Virtual sockets - -In order to more efficiently and securely communicate between host and guest, we added an hybrid implementation of the [VSOCK](http://man7.org/linux/man-pages/man7/vsock.7.html) socket address family over virtio. Credits go to the [Firecracker](https://github.com/firecracker-microvm/firecracker/blob/master/docs/vsock.md) project as our implementation is a copy of theirs. - -### HTTP based API - -In anticipation of the need to support asynchronous operations to Cloud Hypervisor guests (e.g. resources hotplug and guest migration), we added a HTTP based API to the VMM. The API will be more extensively documented during the next release cycle. - -### Memory mapped virtio transport - -In order to support potential PCI-free use cases, we added support for the [virtio MMIO](https://docs.oasis-open.org/virtio/virtio/v1.1/cs01/virtio-v1.1-cs01.html#x1-1440002) transport layer. This will allow us to support simple, minimal guest configurations that do not require a PCI bus emulation. - -### Paravirtualized IOMMU - -As we want to improve our nested guests support, we added support for exposing a [paravirtualized IOMMU](https://github.com/intel/cloud-hypervisor/blob/master/docs/iommu.md) device through virtio. This allows for a safer nested virtio and directly assigned devices support. - -To add the IOMMU support, we had to make some CLI changes for Cloud Hypervisor users to be able to specify if devices had to be handled through this virtual IOMMU or not. In particular, the `--disk` option now expects disk paths to be prefixed with a `path=` string, and supports an optional `iommu=[on|off]` -setting. - -### Ubuntu 19.10 - -With the latest [hypervisor firmware](https://github.com/intel/rust-hypervisor-firmware), we can now support the latest [Ubuntu 19.10 (Eoan Ermine)](http://releases.ubuntu.com/19.10/) cloud images. - -### Large memory guests - -After simplifying and changing our guest address space handling, we can now support guests with large amount of memory (more than 64GB). -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.4.0/index.md b/content/en/blog/v0.4.0/index.md deleted file mode 100644 index 94155e63..00000000 --- a/content/en/blog/v0.4.0/index.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "Cloud Hypervisor v0.4.0 Released!" -date: 2019-12-13T11:39:09Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.4.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/4). - -Highlights for `cloud-hypervisor` version 0.4.0 include: - -### Dynamic virtual CPUs addition - -As a way to vertically scale Cloud-Hypervisor guests, we now support dynamically -adding virtual CPUs to the guests, a mechanism also known as CPU hot plug. -Through hardware-reduced ACPI notifications, Cloud Hypervisor can now add CPUs -to an already running guest and the high level operations for that process are -documented [here](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/master/docs/hotplug.md) - -During the next release cycles we are planning to extend Cloud Hypervisor -hot plug framework to other resources, namely PCI devices and memory. - -### Programmatic firmware tables generation - -As part of the CPU hot plug feature enablement, and as a requirement for hot -plugging other resources like devices or RAM, we added support for -programmatically generating the needed ACPI tables. Through a dedicated -`acpi-tables` crate, we now have a flexible and clean way of generating those -tables based on the VMM device model and topology. - -### Filesystem and block devices vhost-user backends - -Our objective of running all Cloud Hypervisor paravirtualized I/O to a -vhost-user based framework is getting closer as we've added Rust based -implementations for vhost-user-blk and virtiofs backends. Together with the -vhost-user-net backend that came with the 0.3.0 release, this will form the -default Cloud Hypervisor I/O architecture. - -### Guest pause and resume - -As an initial requiremnt for enabling live migration, we added support for -pausing and resuming any VMM components. As an intermediate step towards live -migration, the upcoming guest snapshotting feature will be based on the pause -and resume capabilities. - -### Userspace IOAPIC by default - -As a way to simplify our device manager implementation, but also in order to -stay away from privileged rings as often as possible, any device that relies on -pin based interrupts will be using the userspace IOAPIC implementation by -default. - -### PCI BAR reprogramming - -In order to allow for a more flexible device model, and also support guests -that would want to move PCI devices, we added support for PCI devices BAR -reprogramming. - -### New `cloud-hypervisor` organization - -As we wanted to be more flexible on how we manage the Cloud Hypervisor project, -we decided to move it under a [dedicated GitHub organization](https://github.com/cloud-hypervisor). -Together with the [cloud-hypervisor](https://github.com/cloud-hypervisor/cloud-hypervisor) -project, this new organization also now hosts our [kernel](https://github.com/cloud-hypervisor/linux) -and [firmware](https://github.com/cloud-hypervisor/rust-hypervisor-firmware) -repositories. We may also use it to host any rust-vmm that we'd need to -temporarily fork. -Thanks to GitHub's seamless repository redirections, the move is completely -transparent to all Cloud Hypervisor contributors, users and followers. - -### Contributors - -Many thanks to everyone that contributed to the 0.4.0 release: - -* Cathy Zhang -* Emin Ghuliev -* Jose Carlos Venegas Munoz -* Qiu Wenbo -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Sergio Lopez -* Wu Zongyong -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.5.0/index.md b/content/en/blog/v0.5.0/index.md deleted file mode 100644 index 2429c33c..00000000 --- a/content/en/blog/v0.5.0/index.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Cloud Hypervisor v0.5.0 Released!" -date: 2020-02-07T15:42:54Z -draft: false -contributors: [Cloud Hypervisor Team] ---- - -This release has been tracked through the [0.5.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/6). - -Highlights for `cloud-hypervisor` version 0.5.0 include: - -### Virtual Machine Dynamic Resizing - -With 0.4.0 we added support for CPU hot plug, and 0.5.0 adds CPU hot unplug and memory hot plug as well. This allows to dynamically resize Cloud Hypervisor guests which is needed for e.g. Kubernetes related use cases. -The memory hot plug implementation is based on the same framework as the CPU hot plug/unplug one, i.e. hardware-reduced ACPI notifications to the guest. - -Next on our VM resizing roadmap is the PCI devices hotplug feature. - -### Multi-Queue, Multi-Threaded Paravirtualization - -We enhanced our virtio networking and block support by having both devices use multiple I/O queues handled by multiple threads. This improves our default paravirtualized networking and block devices throughput. - -### New Interrupt Management Framework - -We improved our interrupt management implementation by introducing an Interrupt Manager framework, based on the currently on-going [rust-vmm vm-device](https://github.com/rust-vmm/vm-device) crates discussions. This move made the code significantly cleaner, and allowed us to remove several KVM related dependencies from crates like the PCI and virtio ones. - -### Development Tools - -In order to provide a better developer experience, we worked on improving our build, development and testing tools. -Somehow similar to the excellent [Firecracker's devtool](https://github.com/firecracker-microvm/firecracker/blob/master/tools/devtool), we now provide a [dev_cli script](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/master/scripts/dev_cli.sh). - -With this new tool, our users and contributors will be able to build and test Cloud Hypervisor through a containerized environment. - -### Kata Containers Integration - -We spent some significant time and efforts debugging and fixing our integration with the [Kata Containers](https://github.com/kata-containers) project. Cloud Hypervisor is now a fully supported Kata Containers hypervisor, and is integrated into the project's CI. - -### Contributors - -Many thanks to everyone that contributed to the 0.5.0 release: - -* Bo Chen -* Cathy Zhang -* Qiu Wenbo -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Sergio Lopez -* Yang Zhong -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.6.0/index.md b/content/en/blog/v0.6.0/index.md deleted file mode 100644 index a9d06444..00000000 --- a/content/en/blog/v0.6.0/index.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: "Cloud Hypervisor v0.6.0 Released!" -date: 2020-03-20T11:45:57Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -# v0.6.0 - -This release has been tracked through the [0.6.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/7). - -Highlights for `cloud-hypervisor` version 0.6.0 include: - -### Directly Assigned Devices Hotplug - -We continued our efforts around supporting dynamically changing the guest -resources. After adding support for CPU and memory hotplug, Cloud Hypervisor -now supports hot plugging and hot unplugging directly assigned (a.k.a. `VFIO`) -devices into an already running guest. This closes the features gap for -providing a complete Kata Containers workloads support with Cloud Hypervisor. - -### Shared Filesystem Improvements - -We enhanced our shared filesystem support through many `virtio-fs` improvements. -By adding support for DAX, parallel processing of multiple requests, `FS_IO`, -`LSEEK` and the `MMIO` virtio transport layer to our `vhost_user_fs` daemon, we -improved our filesystem sharing performance, but also made it more stable and -compatible with other `virtio-fs` implementations. - -### Block and Networking IO Self Offloading - -When choosing to offload the paravirtualized block and networking I/O to an -external process (through the `vhost-user` protocol), Cloud Hypervisor now -automatically spawns its default `vhost-user-blk` and `vhost-user-net` backends -into their own, separate processes. -This provides a seamless parvirtualized I/O user experience for those who want -to run their guest I/O into separate executions contexts. - -### Command Line Interface - -More and more Cloud Hypervisor services are exposed through the -[Rest API](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/master/vmm/src/api/openapi/cloud-hypervisor.yaml) and thus only accessible via relatively cumbersome HTTP calls. In order -to abstract those calls into a more user friendly tool, we created a Cloud -Hypervisor Command Line Interface (CLI) called `ch-remote`. -The `ch-remote` binary is created with each build and available e.g. at -`cloud-hypervisor/target/debug/ch-remote` when doing a debug build. - -Please check `ch-remote --help` for a complete description of all available -commands. - -### PVH Boot - -In addition to the traditional Linux boot protocol, Cloud Hypervisor now -supports direct kernel booting through the [PVH ABI](https://xenbits.xen.org/docs/unstable/misc/pvh.html). - -### Contributors - -With the 0.6.0 release, we are welcoming a few new contributors. Many thanks -to them and to everyone that contributed to this release: - -* Alejandro Jimenez -* Arron Wang -* Bin Liu -* Bo Chen -* Cathy Zhang -* Eryu Guan -* Jose Carlos Venegas Munoz -* Liu Bo -* Qiu Wenbo -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Sergio Lopez -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.7.0/index.md b/content/en/blog/v0.7.0/index.md deleted file mode 100644 index e82b4d5d..00000000 --- a/content/en/blog/v0.7.0/index.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: "Cloud Hypervisor v0.7.0 Released!" -date: 2020-04-30T15:52:08Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.7.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/7). - -Highlights for `cloud-hypervisor` version 0.7.0 include: - -### Block, Network, Persistent Memory (PMEM), VirtioFS and Vsock hotplug - -Further to our effort to support modifying a running guest we now support -hotplug and unplug of the following virtio backed devices: block, network, -pmem, virtio-fs and vsock. This functionality is available on the (default) PCI -based tranport and is exposed through the HTTP API. The `ch-remote` utility -provides a CLI for adding or removing these device types after the VM has -booted. User can use the `id` parameter on the devices to choose names for -devices to ease their removal. - -### Alternative `libc` Support - -Cloud Hypervisor can now be compiled with the `musl` C library and this release -contains a static binary compiled using that toolchain. - -### Multithreaded Multi Queued `vhost-user` Backends - -The `vhost-user` backends for network and block support that are shipped by -Cloud Hypervisor have been enhanced to support multiple threads and queues to -improve throughput. These backends are used automatically if `vhost_user=true` -is passed when the devices are created. - -### Initial RamFS Support - -By passing the `--initramfs` command line option the user can specify a file to -be loaded into the guest memory to be used as the kernel initial filesystem. -This is usually used to allow the loading of drivers needed to be able to -access the real root filesystem but it can also be used standalone for a very -minimal image. - -### Alternative Memory Hotplug: `virtio-mem` - -As well as supporting ACPI based hotplug Cloud Hypervisor now supports using -the `virtio-mem` hotplug alternative. This can be controlled by the -`hotplug_method` parameter on the `--memory` command line option. It currently -requires kernel patches to be able to support it. - -### `Seccomp` Sandboxing - -Cloud Hypervisor now has support for restricting the system calls that the -process can use via the `seccomp` security API. This on by default and is -controlled by the `--seccomp` command line option. - -### Updated Distribution Support - -With the release of Ubuntu 20.04 we have added that to the list of supported -distributions and is part of our regular testing programme. - -### Command Line and API Changes - -This is non exhaustive list of HTTP API and command line changes - -* New `id` fields added for devices to allow them to be named to ease removal. - If no name is specified the VMM chooses one. -* Use `--memory`'s `shared` and `hugepages` controls for determining backing - memory instead of providing a path. -* The `--vsock` parameter only takes one device as the Linux kernel only - supports a single Vsock device. The REST API has removed the vector for this - option and replaced it with a single optional field. -* There is enhanced validation of the command line and API provided - configurations to ensure that the provided options are compatible e.g. that - shared memory is in use if any attempt is made to used a `vhost-user` backed - device. -* `ch-remote` has added `add-disk`, `add-fs`, `add-net`, `add-pmem` and - `add-vsock` subcommands. For removal `remove-device` is used. The REST API - has appropriate new HTTP endpoints too. -* Specifying a `size` with `--pmem` is no longer required and instead the size - will be obtained from the file. A `discard_writes` option has also been added - to provide the equivalent of a read-only file. -* The parameters to `--block-backend` have been changed to more closely align - with those used by `--disk`. - -### Contributors - -Many thanks to everyone who has contributed to our 0.7.0 release including some new faces. - -* Alejandro Jimenez -* Bo Chen -* Cathy Zhang -* Damjan Georgievski -* Dean Sheather -* Eryu Guan -* Hui Zhu -* Jose Carlos Venegas Munoz -* Martin Xu -* Muminul Islam -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Sergio Lopez -* Yang Zhong -* Yi Sun - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.8.0/index.md b/content/en/blog/v0.8.0/index.md deleted file mode 100644 index 29644e32..00000000 --- a/content/en/blog/v0.8.0/index.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: "Cloud Hypervisor v0.8.0 Released!" -date: 2020-06-11T17:48:52Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -# v0.8.0 - -This release has been tracked through the [0.8.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/10). - -Highlights for `cloud-hypervisor` version 0.8.0 include: - -### Experimental Snapshot and Restore Support - -This release includes the first version of the snapshot and restore feature. -This allows a VM to be paused and then subsequently snapshotted. At a later -point that snapshot may be restored into a new running VM identical to the -original VM at the point it was paused. - -This feature can be used for offline migration from one VM host to another, to -allow the upgrading or rebooting of the host machine transparently to the guest -or for templating the VM. This is an experimental feature and cannot be used on -a VM using passthrough (VFIO) devices. Issues with SMP have also been observed -(#1176). - -### Experimental ARM64 Support - -Included in this release is experimental support for running on ARM64. -Currently only `virtio-mmio` devices and a serial port are supported. Full -details can be found in the [ARM64 documentation](docs/arm64.md). - -### Support for Using 5-level Paging in Guests - -If the host supports it the guest is now enabled for 5-level paging (aka LA57). -This works when booting the Linux kernel with a vmlinux, bzImage or firmware -based boot. However booting an ELF kernel built with `CONFIG_PVH=y` does not -work due to current limitations in the PVH boot process. - -### Virtio Device Interrupt Suppression for Network Devices - -With `virtio-net` and `vhost-user-net` devices the guest can suppress -interrupts from the VMM by using the `VIRTIO_RING_F_EVENT_IDX` feature. This -can lead to an improvement in performance by reducing the number of interrupts -the guest must service. - -### `vhost_user_fs` Improvements - -The implementation in Cloud Hypervisor of the VirtioFS server now supports sandboxing itself with `seccomp`. - - -### Notable Bug Fixes - -* VMs that have not yet been booted can now be deleted (#1110). -* By creating the `tap` device ahead of creating the VM it is not required to - run the `cloud-hypervisor` binary with `CAP_NET_ADMIN` (#1273). -* Block I/O via `virtio-block` or `vhost-user-block` now correctly adheres to - the specification and synchronizes to the underlying filesystem as required - based on guest feature negotiation. This avoids potential data loss (#399, - #1216). -* When booting with a large number of vCPUs then the ACPI table would be - overwritten by the SMP `MPTABLE`. When compiled with the `acpi` feature the - `MPTABLE` will no longer be generated (#1132). -* Shutting down VMs that have been paused is now supported (#816). -* Created socket files are deleted on shutdown (#1083). -* Trying to use passthrough devices (VFIO) will be rejected on `mmio` builds - (#751). - -### Command Line and API Changes - -This is non exhaustive list of HTTP API and command line changes: - -* All user visible socket parameters are now consistently called `socket` - rather than `sock` in some cases. -* The `ch-remote` tool now shows any error message generated by the VMM -* The `wce` parameter has been removed from `--disk` as the feature is always - offered for negotiation. -* `--net` has gained a `host_mac` option that allows the setting of the MAC - address for the `tap` device on the host. - -### Contributors - -Many thanks to everyone who has contributed to our 0.8.0 release including some new faces. - -* Anatol Belski -* Arron Wang -* Bo Chen -* Dr. David Alan Gilbert -* Henry Wang -* Hui Zhu -* LiYa'nan -* Michael Zhao -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Sergio Lopez - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v0.9.0/index.md b/content/en/blog/v0.9.0/index.md deleted file mode 100644 index 5ea4a600..00000000 --- a/content/en/blog/v0.9.0/index.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Cloud Hypervisor v0.9.0 Released!" -date: 2020-08-06T14:30:07Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [0.9.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/12). - -Highlights for `cloud-hypervisor` version 0.9.0 include: - -### `io_uring` Based Block Device Support - -If the `io_uring` feature is enabled and the host kernel supports it then `io_uring` will be used for block devices. This results a very significant performance improvement. - -### Block and Network Device Statistics - -Statistics for activity of the `virtio` network and block devices is now exposed through a new `vm.counters` HTTP API entry point. These take the form of simple counters which can be used to observe the activity of the VM. - -### HTTP API Responses - -The HTTP API for adding devices now responds with the name that was assigned to the device as well the PCI BDF. - -### CPU Topology - -A `topology` parameter has been added to `--cpus` which allows the configuration of the guest CPU topology allowing the user to specify the numbers of sockets, packages per socket, cores per package and threads per core. - -### Release Build Optimization - -Our release build is now built with LTO (*Link Time Optimization*) which results in a ~20% reduction in the binary size. - -### Hypervisor Abstraction - -A new abstraction has been introduced, in the form of a `hypervisor` crate so as to enable the support of additional hypervisors beyond `KVM`. - -### Snapshot/Restore Improvements - -Multiple improvements have been made to the VM snapshot/restore support that was added in the last release. This includes persisting more vCPU state and in particular preserving the guest paravirtualized clock in order to avoid vCPU hangs inside the guest when running with multiple vCPUs. - -### Virtio Memory Ballooning Support - -A `virtio-balloon` device has been added, controlled through the `resize` control, which allows the reclamation of host memory by resizing a memory balloon inside the guest. - -### Enhancements to ARM64 Support - -The ARM64 support introduced in the last release has been further enhanced with support for using PCI for exposing devices into the guest as well as multiple bug fixes. It also now supports using an initramfs when booting. - -### Intel SGX Support - -The guest can now use Intel SGX if the host supports it. Details can be found in the dedicated [SGX documentation](docs/intel_sgx.md). - -### `Seccomp` Sandbox Improvements - -The most frequently used virtio devices are now isolated with their own `seccomp` filters. It is also now possible to pass `--seccomp=log` which result in the logging of requests that would have otherwise been denied to further aid development. - -### Notable Bug Fixes - -* Our `virtio-vsock` implementation has been resynced with the implementation from Firecracker and includes multiple bug fixes. -* CPU hotplug has been fixed so that it is now possible to add, remove, and re-add vCPUs (#1338) -* A workaround is now in place for when KVM reports MSRs available MSRs that are in fact unreadable preventing snapshot/restore from working correctly (#1543). -* `virtio-mmio` based devices are now more widely tested (#275). -* Multiple issues have been fixed with virtio device configuration (#1217) -* Console input was wrongly consumed by both `virtio-console` and the serial. (#1521) - -### Contributors - -Many thanks to everyone who has contributed to our 0.9.0 release including some new faces. - -* Anatol Belski -* Bo Chen -* Dr. David Alan Gilbert -* Henry Wang -* Howard Zhang -* Hui Zhu -* Jianyong Wu -* Jose Carlos Venegas Munoz -* LiYa'nan -* Michael Zhao -* Muminul Islam -* Praveen Paladugu -* Ricardo Koller -* Rob Bradford -* Samuel Ortiz -* Sebastien Boeuf -* Stefano Garzarella -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v15.0/index.md b/content/en/blog/v15.0/index.md deleted file mode 100644 index de2a84a2..00000000 --- a/content/en/blog/v15.0/index.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: "Cloud Hypervisor v15.0 Released!" -date: 2021-04-29T15:27:07Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v15.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/18). - -Highlights for `cloud-hypervisor` version v15.0 include: - -### Version numbering and stability guarantees - -This release is the first in a new version numbering scheme to represent that -we believe Cloud Hypervisor is maturing and entering a period of stability. -With this new release we are beginning our new stability guarantees: - -* The API (including command line options) will not be removed or changed in a - breaking way without a minimum of 2 releases notice. Where possible warnings - will be given about the use of deprecated functionality and the deprecations - will be documented in the release notes. -* Point releases will be made between individual releases where there are - substantial bug fixes or security issues that need to be fixed. - -Currently the following items are **not** guaranteed across updates: - -* Snapshot/restore is not supported across different versions -* Live migration is not supported across different versions -* The following features are considered experimental and may change - substantially between releases: TDX, SGX. - -### Network device rate limiting - -Building on our existing support for rate limiting block activity the network -device also now supports rate limiting. Full details of the controls are in the -[IO throttling documentation.](docs/io_throttling.md) - -### Support for runtime control of `virtio-net` guest offload - -The guest is now able to change the offload settings for the `virtio-net` -device. As well as providing a useful control this mitigates an issue in the -Linux kernel where the guest will attempt to reprogram the offload settings -even if they are not advertised as configurable (#2528). - -### `--api-socket` supports file descriptor parameter - -The `--api-socket` can now take an `fd=` parameter to specify an existing file -descriptor to use. This is particularly beneficial for frameworks that need to -programmatically control Cloud Hypervisor. - -### Bug fixes - -* A workaround has been put in place to mitigate a Linux kernel issues that - results in the CPU thread spinning at 100% when using `virtio-pmem` (#2277). -* PCI BARs are now correctly aligned removing the need for the guest to - reprogram them (#1797,#1798) -* Handle TAP interface not being writable within virtio-net (due to the buffer - exhaustion on the host) (#2517) -* The recommended Linux kernel is now v5.12.0 as it contains a fix that - prevents snapshot & restore working (#2535) - -### Deprecations - -Deprecated features will be removed in a subsequent release and users should plan to use alternatives - -* Support for booting with the "LinuxBoot" protocol for ELF and `bzImage` - binaries has been deprecated. When using direct boot users should configure - their kernel with `CONFIG_PVH=y`. Will be removed in v16.0. - -### Contributors - -Many thanks to everyone who has contributed to our release including some new faces. - -* Alyssa Ross -* Anatol Belski -* Bo Chen -* Gaelan Steele -* Jianyong Wu -* Michael Zhao -* Muminul Islam -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* William Douglas -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v16.0/index.md b/content/en/blog/v16.0/index.md deleted file mode 100644 index cdbabcce..00000000 --- a/content/en/blog/v16.0/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Cloud Hypervisor v16.0 Released!" -date: 2021-06-10T16:13:47Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v16.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/19). - -### Improved live migration support - -The live migration support inside Cloud Hypervisor has been improved with the addition of the tracking of dirty pages written by the VMM to complement the tracking of dirty pages made by the guest itself. Further the internal state of the VMM now is versioned which allows the safe migration of VMs from one version of the VMM to a newer one. However further testing is required so this should be done with care. See the [live migration documentation](docs/live_migration.md) for more details. - -### Improved `vhost-user` support - -When using `vhost-user` to access devices implemented in different processes there is now support for reconnection of those devices in the case of a restart of the backend. In addition it is now possible to operate with the direction of the `vhost-user-net` connection reversed with the server in the VMM and the client in the backend. This is aligns with the default approach recommended by Open vSwitch. - -### ARM64 ACPI and UEFI support - -Cloud Hypervisor now supports using ACPI and booting from a UEFI image on ARM64. This allows the use of stock OS images without direct kernel boot. - -### Notable bug fixes - -* Activating fewer `virtio-net` queues than advertised is now supported. This appeared when using OVMF with an MQ enabled device (#2578). -* When using MQ with `virtio` devices Cloud Hypervisor now enforces a minimum vCPU count which ensures that the user will not see adverse guest performance (#2563). -* The KVM clock is now correctly handled during live migration / snapshot & restore. - -### Removed functionality - -The following formerly deprecated features have been removed: - -* Support for booting with the "LinuxBoot" protocol for ELF and `bzImage` - binaries has been deprecated. When using direct boot users should configure - their kernel with `CONFIG_PVH=y`. - -### Contributors - -Many thanks to everyone who has contributed to our release including some new faces. - -* Anatol Belski -* Bo Chen -* Dayu Liu -* Henry Wang -* Jiachen Zhang -* Jianyong Wu -* Michael Zhao -* Mikko Ylinen -* Muminul Islam -* Ren Lei -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* Yi Wang - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v17.0/index.md b/content/en/blog/v17.0/index.md deleted file mode 100644 index bc098996..00000000 --- a/content/en/blog/v17.0/index.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Cloud Hypervisor v17.0 Released!" -date: 2021-07-22T16:31:16Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v17.0 -project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/20). - -### ARM64 NUMA support using ACPI - -The support for ACPI on ARM64 has been enhanced to include support for -specifying a NUMA configuration using the existing control options. - -### `Seccomp` support for MSHV backend - -The `seccomp` rules have now been extended to support running against the MSHV -hypervisor backend. - -### Hotplug of `macvtap` devices - -Hotplug of `macvtap` devices is now supported with the file descriptor for the -network device if opened by the user and passed to the VMM. The `ch-remote` -tool supports this functionality when adding a network device. - -### Improved SGX support - -The SGX support has been updated to match the latest Linux kernel support and -now supports SGX provisioning and associating EPC sections to NUMA nodes. - -### Inflight tracking for `vhost-user` devices - -Support for handling inflight tracking of I/O requests has been added to the -`vhost-user` devices allowing recovery after device reconnection. - -### Notable bug fixes - -* VFIO PCI BAR calculation code now correctly handles I/O BARs (#2821). -* The VMM side of `vhost-user` devices no longer advertise the - `VIRTIO_F_RING_PACKED` feature as they are not yet supported in the VMM -(#2833). -* On ARM64 VMs can be created with more than 16 vCPUs (#2763). - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Arafatms -* Bo Chen -* Fei Li -* Henry Wang -* Jiachen Zhang -* Jianyong Wu -* Li Hangjing -* Michael Zhao -* Muminul Islam -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* Yukiteru - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v18.0/index.md b/content/en/blog/v18.0/index.md deleted file mode 100644 index 68c54f3c..00000000 --- a/content/en/blog/v18.0/index.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "Cloud Hypervisor v18.0 Released!" -date: 2021-09-09T14:31:29Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v18.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/21). - -### Experimental User Device (`vfio-user`) support - -Experimental support for running PCI devices in userspace via `vfio-user` -has been included. This allows the use of the SPDK NVMe `vfio-user` controller -with Cloud Hypervisor. This is enabled by `--user-device` on the command line. - -### Migration support for `vhost-user` devices - -Devices exposed into the VM via `vhost-user` can now be migrated using the live -migration support. This requires support from the backend however the commonly -used DPDK `vhost-user` backend does support this. - -### VHDX disk image support - -Images using the VHDX disk image format can now be used with Cloud Hypervisor. - -### Device pass through on MSHV hypervisor - -When running on the MSHV hypervisor it is possible to pass through devices from -the host through to the guest (e.g with `--device`) - -### AArch64 for support `virtio-mem` - -The reference Linux kernel we recommend for using with Cloud Hypervisor now supports `virtio-mem` on AArch64. - -### Live migration on MSHV hypervisor - -Live migration is now supported when running on the MSHV hypervisor including -efficient tracking of dirty pages. - -### AArch64 CPU topology support - -The CPU topology (as configured through `--cpu topology=`) can now be -configured on AArch64 platforms and is conveyed through either ACPI or device -tree. - -### Power button support on AArch64 - -Use of the ACPI power button (e.g `ch-remote --api-socket= power-button`) -is now supported when running on AArch64. - -### Notable bug fixes - -* Using two PTY outputs e.g. `--serial pty --console pty` now works correctly (#3012) -* TTY input is now always sent to the correct destination (#3005) -* The boot is no longer blocked when using a unattached PTY on the serial console (#3004) -* Live migration is now supported on AArch64 (#3049) -* Ensure signal handlers are run on the correct thread (#3069) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Anatol Belski -* Arafatms -* Bo Chen -* Fazla Mehrab -* Henry Wang -* Jianyong Wu -* Jiaqi Gao -* Markus Theil -* Muminul Islam -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* Yu Li -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v19.0/index.md b/content/en/blog/v19.0/index.md deleted file mode 100644 index f849357a..00000000 --- a/content/en/blog/v19.0/index.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Cloud Hypervisor v19.0 Released!" -date: 2021-10-14T15:36:27Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v19.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/22). - -### Improved PTY handling for serial and `virtio-console` - -The PTY support for serial has been enhanced with improved buffering when the -the PTY is not yet connected to. Using `virtio-console` with PTY now results in -the console being resized if the PTY window is also resized. - -### PCI boot time optimisations - -Multiple optimisations have been made to the PCI handling resulting in -significant improvements in the boot time of the guest. - -### Improved TDX support - -When using the latest TDVF firmware the ACPI tables created by the VMM are now -exposed via the firmware to the guest. - -### Live migration enhancements - -Live migration support has been enhanced to support migration with `virtio-mem` -based memory hotplug and the `virtio-balloon` device now supports live -migration. - -### `virtio-mem` support with `vfio-user` - -The use of `vfio-user` userspaces devices can now be used in conjunction with -`virtio-mem` based memory hotplug and unplug. - -### AArch64 for `virtio-iommu` - -A paravirtualised IOMMU can now be used on the AArch64 platform. - -### Notable bug fixes - -* ACPI hotplugged memory is correctly restored after a live migration or - snapshot/restore (#3165) -* Multiple devices from the same IOMMU group can be passed through via VFIO - (#3078 #3113) -* Live migration with large blocks of memory was buggy due to an in issue in - the underlying crate (#3157) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Bo Chen -* Henry Wang -* Hui Zhu -* Jianyong Wu -* Li Yu -* Michael Zhao -* Muminul Islam -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* William Douglas -* Yu Li -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v20.0/index.md b/content/en/blog/v20.0/index.md deleted file mode 100644 index 6566a77b..00000000 --- a/content/en/blog/v20.0/index.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Cloud Hypervisor v20.0 Released!" -date: 2021-12-02T16:15:22Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -# v20.0 - -This release has been tracked through the [v20.0 -project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/23). - -### Multiple PCI segments support - -Cloud Hypervisor is no longer limited to 31 PCI devices. For both `x86_64` and -`aarch64` architectures, it is now possible to create up to 16 PCI segments, -increasing the total amount of supported PCI devices to 496. - -### CPU pinning - -For each vCPU, the user can define a limited set of host CPUs on which it is -allowed to run. This can be useful when assigning a 1:1 mapping between host and -guest resources, or when running a VM on a specific NUMA node. - -### Improved VFIO support - -Based on VFIO region capabilities, all regions can be memory mapped, limiting -the amount of triggered VM exits, and therefore increasing the performance of -the passthrough device. - -### Safer code - -Several sections containing unsafe Rust code have been replaced with safe -alternatives, and multiple comments have been added to clarify why the remaining -unsafe sections are safe to use. - -### Extended documentation - -The documentation related to VFIO has been updated while some new documents have -been introduced to cover the usage of `--cpus` parameter as well as how to run -Cloud Hypervisor on Intel TDX. - -### Notable bug fixes - -* Naturally align PCI BARs on relocation (#3244) -* Fix panic in SIGWINCH listener thread when no seccomp filter set (#3338) -* Use the tty raw mode implementation from libc (#3344) -* Fix the emulation of register D for CMOS/RTC device (#3393) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Bo Chen -* Fabiano Fidêncio -* Michael Zhao -* Muminul Islam -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* Willen Yang -* William Douglas -* Ziye Yang -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v20.1/index.md b/content/en/blog/v20.1/index.md deleted file mode 100644 index 03cd720d..00000000 --- a/content/en/blog/v20.1/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Cloud Hypervisor v20.1 Released!" -date: 2021-12-13T15:06:54Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This is a bug fix release. The following issues have been addressed: - -* Networking performance regression with `virtio-net` (#3450) -* Limit file descriptors sent in `vfio-user` support (#3401) -* Fully advertise PCI MMIO config regions in ACPI tables (#3432) -* Set the TSS and KVM identity maps so they don't overlap with firmware RAM -* Correctly update the `DeviceTree` on restore - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v20.2/index.md b/content/en/blog/v20.2/index.md deleted file mode 100644 index 799519a7..00000000 --- a/content/en/blog/v20.2/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Cloud Hypervisor v20.2 Released!" -date: 2022-01-04T17:57:10Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This is a bug fix release. The following issues have been addressed: - -* Don't error out when setting up the `SIGWINCH` handler (for console resize) - when this fails due to older kernel (#3456) -* Seccomp rules were refined to remove syscalls that are now unused -* Fix reboot on older host kernels when `SIGWINCH` handler was not initialised - (#3496) -* Fix `virtio-vsock` blocking issue (#3497) -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v21.0/index.md b/content/en/blog/v21.0/index.md deleted file mode 100644 index e78b65de..00000000 --- a/content/en/blog/v21.0/index.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: "Cloud Hypervisor v21.0 Released!" -date: 2022-01-20T15:31:31Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v21.0 project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/24). - -### Efficient Local Live Migration (for Live Upgrade) - -In order to support fast live upgrade of the VMM an optimised path has been added in which the memory for the VM is not compared from source to destination. This is activated by passing `--local` to the `ch-remote send-migration` command. This means that the live upgrade can complete in the order of 50ms vs 3s. (#3566) - -### Recommended Kernel is Now 5.15 - -Due to an issue in the `virtio-net` code in 5.14 the recommended Linux kernel is now 5.15. (#3530) - -### Notable Bug fixes - -* Multiple fixes were made to the OpenAPI YAML file to match the implementaion (#3555,#3562) -* Avoid live migration deadlock when triggered during the kernel boot (#3585) -* Support live migration within firmware (#3586) -* Validate the `virtio-net` desciptor chain (#3548) -* `direct=on` (`O_DIRECT`) can now be used with a guest that makes unaligned accesses (e.g. firmware) (#3587) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Barret Rhoden -* Bo Chen -* Fabiano Fidêncio -* Henry Wang -* Liang Zhou -* Michael Zhao -* Muhammad Falak R Wani -* Muminul Islam -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* Ziye Yang - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v21.1/index.md b/content/en/blog/v21.1/index.md deleted file mode 100644 index 4dc03bbb..00000000 --- a/content/en/blog/v21.1/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Cloud Hypervisor v21.1 Released!" -date: 2022-03-11T09:08:36Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This is a bug fix release. The following issues have been addressed: - -* Missing `openat()` syscall from seccomp filter (#3609) -* Ensure MMIO/PIO exits complete before pausing (#3658) -* Support DWORD writes to MSI-X control register (#3714) -* VFIO ioctl reordering to fix MSI on AMD platforms (#3827) -* Fix `virtio-net` control queue (#3829) - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v22.0/index.md b/content/en/blog/v22.0/index.md deleted file mode 100644 index 900829a8..00000000 --- a/content/en/blog/v22.0/index.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Cloud Hypervisor v22.0 Released!" -date: 2022-03-03T18:10:22Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v22.0 -project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/25). - -### GDB Debug Stub Support - -Cloud Hypervisor can now be used as debug target with GDB. This is controlled -by the `gdb` compile time feature and details of how to use it can be found in -the [gdb -documentation](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/gdb.md). - - -### `virtio-iommu` Backed Segments - -In order to facilitate hotplug devices that require being behind an IOMMU (e.g. -QAT) there is a new option `--platform iommu_segments=` that -will place all the specified segments behind the IOMMU. - -### Before Boot Configuration Changes - -It is now possible to change the VM configuration (e.g. add or remove devices, -resize) before the VM is booted. - -### `virtio-balloon` Free Page Reporting - -If `--balloon free_page_reporting=on` is used then the guest can report pages -that is it not using to the VMM. The VMM will then notify the host OS that -those pages are no longer in use and can be freed. This can result in improved -memory density. - -### Support for Direct Kernel Booting with TDX - -Through the use of `TD-Shim` lightweight firmware it is now possible to -directly boot into the kernel with TDX. The [TDX -documentation](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/intel_tdx.md#tdshim) -has been updated for this usage. - -### PMU Support for AArch64 - -A PMU is now available on AArch64 for guest performance profiling. This will be -exposed automatically if available from the host. - -### Documentation Under CC-BY-4.0 License - -The documentation is now licensed under the "Creative Commons Attribution 4.0 -International" license which is aligned with the project charter under the -Linux Foundation. - -### Deprecation of "Classic" `virtiofsd` - -The use of the Rust based [virtiofsd](https://gitlab.com/virtio-fs/virtiofsd) -is now recommended and we are no longer testing against the C based "classic" -version. - -### Notable Bug Fixes - -* Can now be used on kernels without `AF_INET` support (#3785) -* `virtio-balloon` size is now validated against guest RAM size (#3689) -* Ensure that I/O related KVM VM Exits are correctly handled (#3677) -* Multiple TAP file descriptors can be used for `virtio-net` device hotplug (#3607) -* Minor API improvements and fixes (#3756, #3766, #3647, #3578) -* Fix sporadic seccomp violation from glibc memory freeing (#3610, #3609) -* Fix Windows 11 on AArch64 due to wider MSI-X register accesses (#3714, #3720) -* Ensure `vhost-user` features are correct across migration (#3737) -* Improved vCPU topology on AArch64 (#3735, #3733) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Akira Moroo -* Barret Rhoden -* Bo Chen -* Fabiano Fidêncio -* Feng Ye -* Henry Wang -* Jianyong Wu -* lizhaoxin1 -* Michael Zhao -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v22.1/index.md b/content/en/blog/v22.1/index.md deleted file mode 100644 index 04b65ff9..00000000 --- a/content/en/blog/v22.1/index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Cloud Hypervisor v22.1 Released!" -date: 2022-03-11T09:09:21Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This is a bug fix release. The following issues have been addressed: - -* VFIO ioctl reordering to fix MSI on AMD platforms (#3827) -* Fix `virtio-net` control queue (#3829) -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v23.0/index.md b/content/en/blog/v23.0/index.md deleted file mode 100644 index 4b165703..00000000 --- a/content/en/blog/v23.0/index.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "Cloud Hypervisor v23.0 Released!" -date: 2022-04-14T08:42:28Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v23.0 -project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/27). - -### vDPA Support - -A vDPA device has a datapath that complies with the virtio specification but -with a vendor specific control path. The addition of `--vdpa` and the REST API -equivalent allows the use of these devices with Cloud Hypervisor. - -### Updated OS Support list - -The list of officially supported and tested OS versions has been updated to -include Ubuntu "jammy" 22.04 and EOLed versions removed. - -### `AArch64` Memory Map Improvements - -The memory map when running on `AArch64` has been improved for the handling of -the UEFI region which means that the booted guest OS now has full access to its -allocated RAM. (#3938) - -### `AMX` Support - -Under a compile time gate of `amx` it is possible compile in support for the -`AMX` instruction set extension for guest use. This also requires runtime -enabling with `--cpu features=amx`. - -### Notable Bug Fixes - -* Generate error when incorrect HTTP method used for some API endpoints (#3887) -* CMOS based reset is now available to support rebooting on "jammy" (#3914) -* ACPI tables are not produced for memory hotplug when running with - `virtio-mem` (#3883) -* `virtio-iommu` backed PCI segments are now comprehensively placed behind the - vIOMMU (#3870) -* Seccomp rules have been extended for `virtio-fs` to support direct access - (#3848) - -### Deprecations - -Deprecated features will be removed in a subsequent release and users should -plan to use alternatives - -* The `mergeable` option from the `virtio-pmem` support has been deprecated - (#3968) -* The `dax` option from the `virtio-fs` support has been deprecated (#3889) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Bo Chen -* Fabiano Fidêncio -* Henry Wang -* Jianyong Wu -* LiHui -* Michael Zhao -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* William Douglas -* Yi Wang -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v23.1/index.md b/content/en/blog/v23.1/index.md deleted file mode 100644 index b343fadd..00000000 --- a/content/en/blog/v23.1/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Cloud Hypervisor v23.1 Released!" -date: 2022-05-09T14:24:16Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This is a bug fix release. The following issues have been addressed: - -* Add some missing seccomp rules -* Remove `virtio-fs` filesystem entries from config on removal -* Do not delete API socket on API server start (#4026) -* Reject `virtio-mem` resize if the guest doesn't activate the device -* Fix OpenAPI naming of I/O throttling knobs - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v24.0/index.md b/content/en/blog/v24.0/index.md deleted file mode 100644 index 9bb9b236..00000000 --- a/content/en/blog/v24.0/index.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Cloud Hypervisor v24.0 Released!" -date: 2022-05-27T08:00:00Z -draft: false -contributors: [Cloud Hypervisor Team] ---- - -This release has been tracked through the [v24.0 -project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/28). - -### Bypass Mode for `virtio-iommu` - -`virtio-iommu` specification describes how a device can be attached by default -to a bypass domain. This feature is particularly helpful for booting a VM with -guest software which doesn't support `virtio-iommu` but still need to access -the device. Now that Cloud Hypervisor supports this feature, it can boot a VM -with Rust Hypervisor Firmware or OVMF even if the `virtio-block` device exposing -the disk image is placed behind a virtual IOMMU. - -### Ensure Identifiers Uniqueness - -Multiple checks have been added to the code to prevent devices with identical -identifiers from being created, and therefore avoid unexpected behaviors at boot -or whenever a device was hot plugged into the VM. - -### Sparse Mmap support - -Sparse mmap support has been added to both VFIO and vfio-user devices. This -allows the device regions that are not fully mappable to be partially mapped. -And the more a device region can be mapped into the guest address space, the -fewer VM exits will be generated when this device is accessed. This directly -impacts the performance related to this device. - -### Expose Platform Serial Number - -A new `serial_number` option has been added to `--platform`, allowing a user to -set a specific serial number for the platform. This number is exposed to the -guest through the SMBIOS. - -### Notable Bug Fixes - -* Fix loading RAW firmware (#4072) -* Reject compressed QCOW images (#4055) -* Reject virtio-mem resize if device is not activated (#4003) -* Fix potential mmap leaks from VFIO/vfio-user MMIO regions (#4069) -* Fix algorithm finding HOB memory resources (#3983) - -### Notable Improvements - -* Refactor interrupt handling (#4083) -* Load kernel asynchronously (#4022) -* Only create ACPI memory manager DSDT when resizable (#4013) - -### Deprecations - -Deprecated features will be removed in a subsequent release and users should -plan to use alternatives - -* The `mergeable` option from the `virtio-pmem` support has been deprecated - (#3968) -* The `dax` option from the `virtio-fs` support has been deprecated (#3889) - -### New on the Website - -A new blog post [Achieving Bare Metal Performance Within a Virtual -Machine](https://www.cloudhypervisor.org/blog/achieving-bare-metal-performance-within-a-virtual-machine) -has been added to the Cloud Hypervisor website. - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Bo Chen -* Fabiano Fidêncio -* LiHui -* Maksym Pavlenko -* Rob Bradford -* Sebastien Boeuf -* Steven Dake -* Vincent Batts -* Wei Liu - -### Download - - See the GitHub Release for the release assets. \ No newline at end of file diff --git a/content/en/blog/v25.0/index.md b/content/en/blog/v25.0/index.md deleted file mode 100644 index b0eac7c1..00000000 --- a/content/en/blog/v25.0/index.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Cloud Hypervisor v25.0 Released!" -date: 2022-07-07T14:59:55Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v25.0 -project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/29). - -### `ch-remote` Improvements - -The `ch-remote` command has gained support for creating the VM from a JSON -config and support for booting and deleting the VM from the VMM. - -### VM "Coredump" Support - -Under the `guest_debug` feature flag it is now possible to extract the memory -of the guest for use in debugging with e.g. the `crash` utility. (#4012) - -### Notable Bug Fixes - -* Always restore console mode on exit (#4249, #4248) -* Restore vCPUs in numerical order which fixes aarch64 snapshot/restore (#4244) -* Don't try and configure `IFF_RUNNING` on TAP devices (#4279) -* Propagate configured queue size through to vhost-user backend (#4286) -* Always Program vCPU CPUID before running the vCPU to fix running on Linux - 5.16 (#4156) -* Enable ACPI MADT "Online Capable" flag for hotpluggable vCPUs to fix newer - Linux guest - -### Removals - -The following functionality has been removed: - -* The `mergeable` option from the `virtio-pmem` support has been removed - (#3968) -* The `dax` option from the `virtio-fs` support has been removed (#3889) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Dylan Bargatze -* Jinank Jain -* Michael Zhao -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -* Yi Wang -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v26.0/index.md b/content/en/blog/v26.0/index.md deleted file mode 100644 index 72bab8c1..00000000 --- a/content/en/blog/v26.0/index.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Cloud Hypervisor v26.0 Released!" -date: 2022-08-17T16:48:15Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked through the [v26.0 -project](https://github.com/cloud-hypervisor/cloud-hypervisor/projects/30). - -### SMBIOS Improvements via `--platform` - -`--platform` and the appropriate API structure has gained support for supplying -OEM strings (primarily used to communicate metadata to systemd in the guest) -(#4319, #4446) and support for specifying the UUID (#4389.) - -### Unified Binary MSHV and KVM Support - -Support for both the MSHV and KVM hypervisors can be compiled into the same -binary with the detection of the hypervisor to use made at runtime. - -### Notable Bug Fixes - -* The prefetchable flag is preserved on BARs for VFIO devices (#4353, #4454) -* PCI Express capabilties for functionality we do not support are now filtered - out (#4456) -* GDB breakpoint support is more reliable (#4354, #4363) -* `SIGINT` and `SIGTERM` signals are now handled before the VM has booted - (#4269, #4293) -* Multiple API event loop handling bug fixes (#4309, #4362) -* Incorrect assumptions in virtio queue numbering were addressed, allowing - the`virtio-fs` driver in OVMF to be used (#4341, #4314) -* VHDX file format header fix (#4291) -* The same VFIO device cannot be added twice (#4453, #4463) -* SMBIOS tables were being incorrectly generated (#4442) - -### Deprecations - -Deprecated features will be removed in a subsequent release and users should -plan to use alternatives. - -* The top-level `kernel` and `initramfs` members on the `VmConfig` have been - moved inside a `PayloadConfig` as the `payload` member. The OpenAPI document - has been updated to reflect the change and the old API members continue to - function and are mapped to the new version. The expectation is that these old - versions will be removed in the v28.0 release. - -### Removals - -The following functionality has been removed: - -* The unused `poll_queue` parameter has been removed from `--disk` and - equivalent. This was residual from the removal of the `vhost-user-block` - spawning feature (#4402.) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Anatol Belski -* Archana Shinde -* Bo Chen -* lizhaoxin1 -* Maximilian Nitsch -* Michael Zhao -* Rob Bradford -* Sebastien Boeuf -* Steven Dake -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v27.0/index.md b/content/en/blog/v27.0/index.md deleted file mode 100644 index 70937984..00000000 --- a/content/en/blog/v27.0/index.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "Cloud Hypervisor v27.0 Released!" -date: 2022-09-29T18:02:19Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our new [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v27.0. - -### Community Engagement - -A new mailing list has been created to support broader community discussions. -Please consider [subscribing](https://lists.cloudhypervisor.org/g/dev/); an -announcement of a regular meeting will be announced via this list shortly. - -### Prebuilt Packages - -Prebuilt packages are now available. Please see [this -document](https://github.com/cloud-hypervisor/obs-packaging/blob/main/README.md) -on how to install. These packages also include packages for the different -firmware options available. - -### Network Device MTU Exposed to Guest - -The MTU for the TAP device associated with a `virtio-net` device is now exposed -to the guest. If the user provides a MTU with `--net mtu=..` then that MTU is -applied to created TAP interfaces. This functionality is also exposed for -`vhost-user-net` devices including those created with the reference backend -(#4658, #4676.) - -### Boot Tracing - -Support for generating a trace report for the boot time has been added -including a script for generating an SVG from that trace (#4659.) - -### Simplified Build Feature Flags - -The set of feature flags, for e.g. experimental features, have been simplified: - -* `msvh` and `kvm` features provide support for those specific hypervisors - (with `kvm` enabled by default), -* `tdx` provides support for Intel TDX; and although there is no MSHV support - now it is now possible to compile with the `mshv` feature (#4696,) -* `tracing` adds support for boot tracing, -* `guest_debug` now covers both support for gdbing a guest (formerly `gdb` - feature) and dumping guest memory. - -The following feature flags were removed as the functionality was enabled by -default: `amx`, `fwdebug`, `cmos` and `common` (#4679, #4632.) - -### Asynchronous Kernel Loading - -AArch64 has gained support for loading the guest kernel asynchronously like -x86-64. (#4538) - -### GDB Support for AArch64 - -GDB stub support (accessed through `--gdb` under `guest_debug` feature) is now -available on AArch64 as well as as x86-64. - -### Notable Bug Fixes - -* This version incorporates a version of `virtio-queue` that addresses an issue - where a rogue guest can potentially DoS the VMM (rust-vmm/vm-virtio#196.) -* Improvements around PTY handling for `virtio-console` and serial devices - (#4520, #4533, #4535.) -* Improved error handling in virtio devices (#4626, #4605, #4509, #4631, #4697) - -### Deprecations - -Deprecated features will be removed in a subsequent release and users should -plan to use alternatives. - -* Booting legacy firmware (compiled without a PVH header) has been deprecated. - All the firmware options (Cloud Hypervisor OVMF and Rust Hypervisor Firmware) - support booting with PVH so support for loading firmware in a legacy mode is no - longer needed. This functionality will be removed in the next release. - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Bo Chen -* James O. D. Hunt -* Jianyong Wu -* Markus Napierkowski -* Michael Zhao -* Nuno Das Neves -* Rob Bradford -* Sebastien Boeuf -* Smit Gardhariya -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v28.0/index.md b/content/en/blog/v28.0/index.md deleted file mode 100644 index eb950a6e..00000000 --- a/content/en/blog/v28.0/index.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "Cloud Hypervisor v28.0 Released!" -date: 2022-11-17T16:59:00Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our new [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration v28.0. - -### Community Engagement (Reminder) - -Just a reminder that we have a new mailing list to support broader community discussions. Please consider [subscribing](https://lists.cloudhypervisor.org/g/dev/). We plan to use this to announce a regular meeting for those interested in talking about Cloud -Hypervisor development. - -### Long Term Support (LTS) Release - -This is the first version of Cloud Hypervisor to be released under the LTS release process. Point releases for bug fixes will be made for the next 18 months; live migration and live upgrade will be supported between the point releases of the LTS. - -### Virtualised TPM Support - -Support for adding an emulated CRB TPM has been added. This has it's own [TPM documentation](docs/tpm.md). - -### Transparent Huge Page Support - -By default, but controllable through `--memory thp=off` if it possible to back the guest memory with Transparent Huge Pages (no file backing/`shared=off`) then this will be used resulting in improved boot performance. - -### README Quick Start Improved - -The README has been refreshed with the quick start guide updated to reflect the different firmware options and to recommend the use of pre-built binaries. - -### Notable Bug Fixes - -* Inappropriate Copy-on-Write of pinned pages (e.g. VFIO) leading to higher - memory consumption (#4835) -* Multiple `virtio` device bug fixes found through fuzzing (#4859, #4799) -* Large QCOW files (> 4TiB) are now supported (#4767) -* Support for > 31 vCPUS on aarch64 (#4863) -* Multiple fixes to OpenAPI specification file (#4720, #4811) -* Programming of the MSI-X table has been optimised leading to faster boot on - newer Linux kernels (#4744) -* Error on reboot from race to close TAP devices (#4871) -* Non-spec compliant virtio-block read-only support (#4888) - -### Removals - -The following functionality has been removed: - -* Support for non-PVH firmware booting has been removed (#4511) -* I/O ports used for older versions of firmware have been removed (#3926) -* Deprecated API options for kernel/cmdline/initramfs have been removed (#4737) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Bo Chen -* Fabiano Fidêncio -* Jianyong Wu -* Jinank Jain -* Jinrong Liang -* lv.mengzhao -* Michael Zhao -* Muminul Islam -* Praveen K Paladugu -* Rob Bradford -* Sebastien Boeuf -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v28.1/index.md b/content/en/blog/v28.1/index.md deleted file mode 100644 index 151336ad..00000000 --- a/content/en/blog/v28.1/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Cloud Hypervisor v28.1 Released!" -date: 2022-12-14T11:20:23Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This is a bug fix release. The following issues have been addressed: - -* Update dependencies including a version of `linux-loader` that -addresses an infinite loop issue ([details](https://github.com/rust-vmm/linux-loader/security/advisories/GHSA-52h2-m2cf-9jh6)) -* Fix bugs related to `virtio-net` including an integer overflow issue - (#4924, #4949) -* Use host `cpuid` information for L2 cache for older KVM on x86 (#4920) -* Improve README and documentation - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v29.0/index.md b/content/en/blog/v29.0/index.md deleted file mode 100644 index 1d0f6509..00000000 --- a/content/en/blog/v29.0/index.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: "Cloud Hypervisor v29.0 Released!" -date: 2023-01-14T12:46:39Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v29.0. The following user visible changes have been made: - -### Release Binary Supports Both MSHV and KVM - -On `x86-64` the binary included in releases supports both the KVM and MSHV -hypervisor with runtime detection to identify the correct hypervisor to use. - -### Snapshot/Restore and Live Migration Improvements - -Improvements have been made to the data structures used for both live migration -and snapshot/restore. Unfortunately this has broken compatibility with older -versions (support for migrating between major versions is not yet officially -supported but has worked for some versions.) - -### Heap Allocation Improvements - -Improvements have been made to the volume of heap allocations when running with -`virtio-block` devices along with a reduction in the peak heap size. - -### `ch-remote` Improvements - -Support for "pinging" the VMM and shutting the VMM down have been added to -`ch-remote`. - -### `AArch64` Documentation Integration - -The documentation for `AArch64` support has been integrated into the main -README. - -### `virtio-block` Counters Enhancement - -The counters for the `virtio-block` device has extended to include min/mean/max -latency counters. - -### TCP Offload Control - -The `virtio-net` device has gained support for controlling the enabling of -checksum and offloading. This allows the device to be used in environments -where the hardware lacks support for the offloading. - -### Notable Bug Fixes - -* Update dependencies including a version of `linux-loader` that addresses an - infinite loop issue ([details](https://github.com/rust-vmm/linux-loader/security/advisories/GHSA-52h2-m2cf-9jh6)) -* Fix bugs related to `virtio-net` including an integer overflow issue - (#4924, #4949) -* Use host `cpuid` information for L2 cache for older KVM on x86 (#4920) -* Memory mapped into the guest is now marked as non-dumpable which prevents large core files (#5016) -* Fix QCOW2 refcount table size (#5034) -* Fix unpause support on MSHV in dual binary (#5037) -* Threads inside `virtio` devices are now shutdown on reboot (#5095) - -### Removals - -No functionality has been removed in this release. - -### Deprecations - -* Support for specifying a directory with `MemoryZoneConfig::file` or - `MemoryConfig::file` has been deprecated. This was originally used for - supporting huge pages or shared memory backing which is now natively supported - (#5085) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Bo Chen -* Claudio Fontana -* Hao Xu -* Henry Wang -* Jinank Jain -* Michael Zhao -* Muminul Islam -* Philipp Schuster -* Rob Bradford -* Sebastien Boeuf -* Shuaiyi Zhang -* Wei Liu -* Yong He -* Yuji Hagiwara - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v30.0/index.md b/content/en/blog/v30.0/index.md deleted file mode 100644 index bda8e9eb..00000000 --- a/content/en/blog/v30.0/index.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "Cloud Hypervisor v30.0 Released!" -date: 2023-02-24T01:10:15Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v30.0. The following user visible changes have been made: - -### Command Line Changes for Reduced Binary Size - -The `clap` crate was replaced by the `argh` crate to create our command -line, which reduced our release binary size from 3.6MB to 3.3MB. There -were several syntax changes: - -* All `--option=value` commands now are `--option value`. -* The `--disk DISK1 DISK2` command now is `--disk DISK1 --disk DISK2`. -* The `-vvv` command now is `-v -v -v` - -### Basic vfio-user Server Support - -Our `vfio-user` crate is extended to provide basic server side support -with an example of gpio vfio-user device. This crate now is moved to [its -own repository](https://github.com/rust-vmm/vfio-user) under the -`rust-vmm` organization. - -### Heap Profiling Support - -A new building target is added for profiling purposes with examples of -heap profiling using `dhat` gated by the `dhat-heap` feature. - -### Documentation Improvements - -The documentation on Intel TDX is expanded with details of the building -and using [TD-Shim](https://github.com/confidential-containers/td-shim), -references to [TDX Tools](https://github.com/intel/tdx-tools), and -version information of guest/host kernel/TDVF/TDShim being tested. Also, -a new 'heap profiling' documentation is added with improvements on the -existing 'profiling' documentation. - -### Notable Bug Fixes - -* Close FDs for TAP devices that are provided to VM (#5199, #5206) -* Set vcpu thread status properly and signal `exit_evt` upon thread exit (#5211) -* Populate CPUID leaf 0x4000_0010 (TSC frequency) (#5178, #5179) -* Inform the TPM guest driver upon failed TPM requests on the host (#5151) -* Bug fix to OpenAPI specification file (#5186) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Anirudh Rayabharam -* Bo Chen -* Jinank Jain -* Kaihang Zhang -* Michael Zhao -* Muminul Islam -* Philipp Schuster -* Praveen K Paladugu -* Ravi kumar Veeramally -* Rob Bradford -* Ruslan Mstoi -* Sebastien Boeuf -* Wei Liu -* Yong He -* Yu Li -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v31.0/index.md b/content/en/blog/v31.0/index.md deleted file mode 100644 index be3af64f..00000000 --- a/content/en/blog/v31.0/index.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "Cloud Hypervisor v31.0 Released!" -date: 2023-04-06T14:47:15Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v31.0. The following user visible changes have been made: - -### Update to Latest `acpi_tables` - -Adapted to the latest [acpi_tables](https://github.com/rust-vmm/acpi_tables). There has been significant API changes in -the crate. - -### Update Reference Kernel to 6.2 - -Updated the recommended guest kernel version from 6.1.6 to 6.2. - -### Improvements on Console `SIGWINCH` Handler - -A separate thread had been created to capture the `SIGWINCH` signal and resize -the guest console. Now the thread is skipped if the console is not resizable. - -Two completely different code paths existed for handling console resizing, one -for `tty` and the other for `pty`. That makes the understanding of the console -handling code unnecessarily complicated. Now the code paths are unified. Both -`tty` and `pty` are supported in single `SIGWINCH` handler. And the new handler -can works with kernel versions earlier than v5.5. - -### Remove Directory Support from `MemoryZoneConfig::file` - -Setting a directory to `MemoryZoneConfig::file` is no longer supported. - -Before this change, user can set a directory to `file` of the `--memory-zone` -option. In that case, a temporary file will be created as the backing file for -the `mmap(2)` operation. This functionality has been unnecessary since we had -the native support for hugepages and allocating anonymous shared memory. - -### Documentation Improvements - -* Various improvements in API document -* Improvements in Doc comments -* Updated Slack channel information in README - -### Notable Bug Fixes - -* Fixed the offset setting while removing the entire mapping of `vhost-user` FS - client. -* Fixed the `ShutdownVmm` and `Shutdown` commands to call the correct API - endpoint. - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Bo Chen -* Daniel Farina -* Dom -* Hao Xu -* Muminul Islam -* Omer Faruk Bayram -* Ravi kumar Veeramally -* Rob Bradford -* Ruslan Mstoi -* Smit Gardhariya -* Yang -* Yong He -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v32.0/index.md b/content/en/blog/v32.0/index.md deleted file mode 100644 index 2918e305..00000000 --- a/content/en/blog/v32.0/index.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "Cloud Hypervisor v32.0 Released!" -date: 2023-05-18T18:13:12Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration v32.0. The following user visible changes have been made: - -### Increased PCI Segment Limit - -The maximum number of PCI segments that can be used is now 96 (up from 16). - -### API Changes - -* The VmmPingResponse now includes the PID as well as the build details. (#5348) - -### Notable Bug Fixes - -* Ignore and warn TAP FDs sent via the HTTP request body (#5350) -* Properly preserve and close valid FDs for TAP devices (#5373) -* Only use `KVM_ARM_VCPU_PMU_V3` if available (#5360) -* Only touch the tty flags if it's being used (#5343) -* Fix seccomp filter lists for vhost-user devices (#5361) -* The number of vCPUs is capped at the hypervisor maximum (#5357) -* Fixes for TTY reset (#5414) -* CPU topology fixes on MSHV (#5325) -* Seccomp fixes for older distributions (#5397) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Anatol Belski -* Bo Chen -* Hao Xu -* Muminul Islam -* Omer Faruk Bayram -* Rafael Mendonca -* Rob Bradford -* Ruslan Mstoi -* Smit Gardhariya -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v33.0/index.md b/content/en/blog/v33.0/index.md deleted file mode 100644 index 439fd54e..00000000 --- a/content/en/blog/v33.0/index.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Cloud Hypervisor v33.0 Released!" -date: 2023-06-29T17:32:25Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -# v33.0 - -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v33.0. The following user visible changes have been made: - -### D-Bus based API - -A D-Bus based API has been added as an alternative to the existing REST -API. This feature is gated by the `dbus_api` feature. Details can be -found in the [API documentation](docs/api.md). - -### Expose Host CPU Cache Details for AArch64 - -Now the CPU cache information on the host is properly exposed to the -guest on AArch64. - -### Notable Bug Fixes - -* Report errors explicitly to users when VM failed to boot (#5453) -* Fix VFIO on platforms with non-4k page size (#5450, #5469) -* Fix TDX initialization (#5454) -* Ensure all guest memory regions are page-size aligned (#5496) -* Fix seccomp filter lists related to virtio-console, serial and pty - (#5506, #5524) -* Populate APIC ID properly (#5512) -* Ignore and warn TAP FDs in more situations (#5522) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Anatol Belski -* Bo Chen -* Jianyong Wu -* Omer Faruk Bayram -* Rafael Mendonca -* Ravi kumar Veeramally -* Rob Bradford -* Ruslan Mstoi -* Yu Li -* zhongbingnan -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v34.0/index.md b/content/en/blog/v34.0/index.md deleted file mode 100644 index 0bd4f5ca..00000000 --- a/content/en/blog/v34.0/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Cloud Hypervisor v34.0 Released!" -date: 2023-08-10T16:44:32Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration v34.0. The following user visible changes have been made: - -### Paravirtualised Panic Device Support - -A new device has been added that can communicate when the guest kernel has panicked and share those details with the VMM. This is controlled with a new `--pvpanic` command line option and JSON API change equivalent. (#5526) - -### Improvements to VM Core Dump - -Requesting to dump the guest memory as core dump will now transparently pause the VM if required; returning to the original state after. (#5604) - -### QCOW2 Support for Backing Files - -The support for QCOW2 files has been enhanced to include support for using backing files. (#5573) - -### Minimum Host Kernel Bump - -The minimum supported host kernel is now 5.13 in order to incorporate a bug fix for `KVM_FEATURE_ASYNC_PF_INT` functionality. (#5626) - -### Notable Bug Fixes - -* The x86 emulator is only compiled in if MSHV is compiled in (the kernel carries out this job with KVM) (#5561). -* A regression has been fixed in VFIO support for devices that use MSI rather than MSI-X (#5658). -* When triggering a VM shutdown or reset via I/O the vCPU thread will be blocked until that asynchronous event has been received (#5645). -* Pausing a VM is now a synchronous action with the request only completing when all vCPUs are paused (#5611). -* Event monitor support now correctly supports concurrent access (#5633). -* Bug fixes for the QCOW2 file support (#5573). - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Anatol Belski -* Bo Chen -* Changyuan Lyu -* Christian Blichmann -* Manish Goregaokar -* Omer Faruk Bayram -* Philipp Schuster -* Praveen K Paladugu -* Rob Bradford -* Ruslan Mstoi -* Yi Wang -* Yong He -* Yu Li -* dom.song - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v35.0/index.md b/content/en/blog/v35.0/index.md deleted file mode 100644 index 7857565a..00000000 --- a/content/en/blog/v35.0/index.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Cloud Hypervisor v35.0 Released!" -date: 2023-09-21T14:47:24Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration v35.0. -The following user visible changes have been made: - -### `virtio-vsock` Support for Linux Guest Kernel v6.3+ - -Since kernel v6.3, a vsock packet can be included in a single descriptor, -instead of being split over two descriptors. Our `virtio-vsock` implementation -now support both situations. - -### User Specified Serial Number for `virtio-block` - -A new option `serial` is added to the `--block` command that allows users to -specify a serial number for block devices which will be guest visible. - -### vCPU TSC Frequency Included in Migration State - -This ensures migration works correctly between hosts that have different TSC -frequencies if the guest is running with TSC as the source of timekeeping. - -### Notable Bug Fixes - -* Disallow concurrent CPU resizing (#5668) -* Handle APIC EOI message for MSHV (#5681) -* Use wrapping add for memory offset from instruction emulator (#5719) -* Add global spell check via the 'typos' GitHub action (#5720) -* Ensure probing reads are block size aligned (#5727) -* Multiple bug fixes around the latency counter for block devices - (#5712, #5750, #5762, #5763) -* Replace unsound `static mut` with `once_cell` (#5772) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Anatol Belski -* Bo Chen -* Christian Blichmann -* Jianyong Wu -* Jinank Jain -* Julian Stecklina -* Omer Faruk Bayram -* Philipp Schuster -* Rob Bradford -* Ruslan Mstoi -* Thomas Barrett -* Wei Liu -* Yi Wang -* zhongbingnan - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v36.0/index.md b/content/en/blog/v36.0/index.md deleted file mode 100644 index c0aa4ce7..00000000 --- a/content/en/blog/v36.0/index.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "Cloud Hypervisor v36.0 Released!" -date: 2023-11-02T16:06:15Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v36.0. The following user visible changes have been made: - -### Command Line Changes - -We switched back to use the `clap` crate to create our command line, -since the `argh` crate is barely maintained. There were several syntax -changes: - -* All `--option value` commands now are `--option=value`. -* The `--disk DISK1 --disk DISK2` command now is `--disk DISK1 DISK2`. -* The `-v -v -v`command now is `-vvv`. - -Note: the released binary size increased around 0.3M due to this change. - -### Enabled Features Reported via API Endpoint and CLI - -Now the enabled (Cargo) features of the running Cloud Hypervisor -instance can be queried via API endpoint (`/vmm.ping`) and CLI -(`--version -v`). - -### NUMA Support for PCI segments - -The `--numa` command is augmented with a new option `pci_segment=`, so -that users can define the relationship between PCI segments and NUMA -nodes. Examples can be found from the [memory documentation](docs/memory.md) - -### CPU Topology Support on AMD Platforms - -Now the CPU topology on x86_64 platforms supports multiple vendors. - -### Unix Socket Backend for Serial Port - -The `--serial` command is augmented with a new option `socket=`, allowing -users to access the serial port using a Unix socket. - -### AIO Backend for Block Devices - -An AIO backend is added for `virtio-block` devices to improve block -device performance when the `io_uring` feature is not supported by the -host Operating System. - -### Documentation Improvements - -* New [documentation](docs/coverage.md) for collecting coverage data -* Various typo fixes - -### Notable Bug Fixes - -* Fix a deadlock when TDX is enabled (#5845) -* Only advertise AMX feature bits to guest when the AMX cpu feature is - enabled (#5834) -* Correct default value for vCPU topology on AArch64 (#5893) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Bo Chen -* Dario Nieuwenhuis -* Jianyong Wu -* Jinank Jain -* Muminul Islam -* Praveen K Paladugu -* Ravi kumar Veeramally -* Rob Bradford -* Thomas Barrett -* Wei Liu -* Yi Wang -* dom.song -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v37.0/index.md b/content/en/blog/v37.0/index.md deleted file mode 100644 index 5ea818c6..00000000 --- a/content/en/blog/v37.0/index.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Cloud Hypervisor v37.0 Released!" -date: 2023-12-14T18:58:49Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v37.0. The following user visible changes have been made: - -### Long Term Support (LTS) Release - -This release is a LTS release. Point releases for bug fixes will be made -for the next 18 months; live migration and live upgrade will be -supported between the point releases of the LTS. - -### Multiple PCI segments Support for 32-bit VFIO Devices - -Now VFIO devices with 32-bit memory BARs can be attached to non-zero PCI -segments on the guest, allowing users to have more 32-bit devices and -assign such devices to appropriate NUMA nodes for better performance. - -### Configurable Named TAP Devices - -Named TAP devices now accepts IP configuration from users, such as IP -and MAC address, as long as the named TAP device is created by Cloud -Hypervisor (e.g. not existing TAP devices). - -### TTY Output from Both Serial Device and Virtio Console - -Now legacy serial device and virtio console can be set as TTY mode as -the same time. This allows users to capture early boot logs with the -legacy serial device without losing performance benefits of using -virtio-console, when appropriate kernel configuration is used (such as -using kernel command-line `console=hvc0 earlyprintk=ttyS0` on x86). - -### Faster VM Restoration from Snapshots - -The speed of VM restoration from snapshots is improved with a better -implementation of deserializing JSON files. - -### Notable Bug Fixes - -* Fix aio backend behavior for block devices when writeback cache - disabled (#5930) -* Fix PvPanic device PCI BAR alignment (#5956) -* Bug fix to OpenAPI specification file (#5967) -* Error out early for live migration when TDX is enabled (#6025) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Bo Chen -* Jinank Jain -* Markus Sütter -* Michael Zhao -* Muminul Islam -* Rob Bradford -* Rui Chang -* Ruslan Mstoi -* Thomas Barrett -* Wei Liu -* Yi Wang -* Yong He -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v38.0/index.md b/content/en/blog/v38.0/index.md deleted file mode 100644 index 5bd3705c..00000000 --- a/content/en/blog/v38.0/index.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Cloud Hypervisor v38.0 Released!" -date: 2024-02-16T18:20:29Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v38.0. The following user visible changes have been made: - -### Group Rate Limiter on Block Devices - -Users now can throttle a group of block devices with the new -`--rate-limiter-group` option. Details can be found from the [I/O -Throttling documentation](docs/io_throttling.md) - -### CPU Pinning Support for Block Device Worker Thread - -Users now have the option to pin virt-queue threads for block devices -to specific host cpus. - -### Optimized Boot Time with Parallel Memory Prefault - -The boot time with `prefault` option enabled is optimized via parallel -memory prefault. - -### New 'debug-console' Device - -A 'debug-console' device is added to provide a user-configurable debug -port for logging guest information. Details can be found from the [Debug -IO Ports documentation](docs/debug-port.md). - -### Improved VFIO Device Support - -All non-emulated MMIO regions of VFIO devices are now mapped to the VFIO -container, allowing PCIe P2P between all VFIO devices on the same -VM. This is required for a wide variety of multi-GPU workloads involving -GPUDirect P2P (DMA between two GPUs), GPUDirect RDMA (DMA between a GPU -and an IB device). - -### Extended CPU Affinity Support - -Users now can set the vcpu affinity to a host CPU with index larger -than 255. - -### Notable Bug Fixes - -* Enable HTT flag to avoid crashing cpu topology enumeration software -such as hwloc in the guest (#6146) -* Fix several security advisories from dependencies (#6134, #6141) -* Handle non-power-of-two CPU topology properly (#6062) -* Various bug fixes around `virtio-vsock`(#6080, #6091, #6095) -* Enable nested virtualization on AMD if supported (#6106) -* Align VFIO devices PCI BARs naturally (#6196) - -### Contributors - -Many thanks to everyone who has contributed to our release: -* Alyssa Ross -* Bo Chen -* Daniel Farina -* Jinank Jain -* Muminul Islam -* Peteris Rudzusiks -* Philipp Schuster -* Ravi kumar Veeramally -* Rob Bradford -* Ruslan Mstoi -* Sean Banko -* Thomas Barrett -* Wei Liu -* Yi Wang -* acarp -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v39.0/index.md b/content/en/blog/v39.0/index.md deleted file mode 100644 index 14dbd66b..00000000 --- a/content/en/blog/v39.0/index.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "Cloud Hypervisor v39.0 Released!" -date: 2024-04-27T13:40:07Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v39.0. The following user visible changes have been made: - -### Variable Sizing of PCI Apertures for Segments - -It is now possible to use `--pci-segment` to adjust the aperture size that -devices 32-bit and 64-bit PCI device BARs will be allocated from. Previously -the address space was equally distributed across all the segments which may -leave insufficient space for devices that require a large 32-bit space. With -this change the weighting per segment can be adjusted. (#6387) - -### Direct Booting with bzImages - -Support for directly booting Linux from bzImages has been added.(#6200) - -### Support for NVIDIA GPUDirect P2P Support - -The `x_nv_gpudirect_clique` option was added to `--device` to allow the -configuration of device P2P support with NVIDIA GPUs. (#6235) - -### Guest NMI Injection Support - -A new API endpoint and `ch-remote` option added for injecting an NMI into the -guest. (#6047) - -### Notable Bug Fixes - -* Workaround for kernel bug affecting guest IRQ masking on AMD (#6353) -* Correctly cleanup `sigwinch_listener` process (#6208) -* Graceful shutdown of HTTP API thread (#6248, #6247) -* Fix `queue_affinity` option in OpenAPI metadata (#6268) -* Fix documentation to indicate only stream mode is supported by `virtio-vsock` - (#6306) -* Fix `virtio-fs` tag validation (#6358, #6359) -* Add missing `pvpanic` device to OpenAPI metadata (#6372) -* Fixes for nested virtualization with VFIO devices (#6110, #6298, #6297, - #6319) -* Fix for backing file for `virtio-mem` regions with snapshot/restore (#6337, - #6338) -* Explicitly mark FDs used for network devices as invalid across - snapshot/restore (#6332, #6286) -* Improve `event-monitor` events around reboot (#6277, #6274) -* Fix potential deadlock around paused devices during live migration (#6293) -* Fix panic when running `ch-remote` with no subcommand (#6230) -* Fix hotplug of `virtio` devices after snapshot/restore and live migration - (#6326, #6265) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alexandru Matei -* Andrew Carp -* Bo Chen -* Bouke van der Bijl -* Chris Webb -* Jinank Jain -* Lucas Jacques -* Muminul Islam -* Nuno Das Neves -* Ravi kumar Veeramally -* Rob Bradford -* Ruslan Mstoi -* Stefan Nuernberger -* Thomas Barrett -* Wei Liu -* Yi Wang - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v40.0/index.md b/content/en/blog/v40.0/index.md deleted file mode 100644 index 31e8438f..00000000 --- a/content/en/blog/v40.0/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: "Cloud Hypervisor v40.0 Released!" -date: 2024-06-21T11:12:02Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v40.0. The following user visible changes have been made: - -### Support for Restoring File Descriptor Backed Network Devices - -It is now possible to pass file descriptors over the HTTP API (and using -`ch-remote`) when restoring to update the file descriptors for network devices. -This enables snapshot & restore functionality for guests using `macvtap` or -other file descriptor backed network devices. (#6286) - -### Notable Bug Fixes - -* Default values have been removed from required fields in the OpenAPI metadata - (#6495) -* The help syntax of `ch-remote remove-device` has been improved (#6456) -* A double close of file descriptors has been fixed when using `--serial` - (#6486) -* To prevent loops a limit on the nesting level for QCOW2 backing files has - been introduced (#6482) -* Boot time performance has been improved with multiple cores by avoiding - `cpuid` instructions and by seeding the in kernel file descriptor table - (#6498, #6478) -* L1 cache details are more likely to be propagated into the guest (#6523) -* The default topology for guests now uses multiple cores rather than sockets - (#6504) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alexandru Matei -* Bo Chen -* Jinank Jain -* Josh Soref <2119212+jsoref@users.noreply.github.com> -* Muminul Islam -* Nuno Das Neves -* Omer Faruk Bayram -* Praveen K Paladugu -* Purna Pavan Chandra -* Rob Bradford -* SamrutGadde -* Sean Banko -* Songqian Li -* Wei Liu -* Yi Wang -* Yu Li -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v41.0/index.md b/content/en/blog/v41.0/index.md deleted file mode 100644 index 1ee765bf..00000000 --- a/content/en/blog/v41.0/index.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Cloud Hypervisor v41.0 Released!" -date: 2024-08-16T12:17:19Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v41.0. The following user visible changes have been made: - -### Experimental "Pvmemcontrol" Support - -VMM support has been added for this experimental functionality (requires -currently out of tree Linux kernel patches) to allow guests to control its -physical memory properties to allow optimisations and security features. -(#6318, #6467) - -### Sandboxing With Landlock Support - -Support for restricting the VMM process using the Linux kernel "Landlock" API -has been added - this can be used to restrict the files (and the read/write -permissions) that the VMM process can access. This adds another layer of -security alongside the existing sycall filters (`seccomp`) - this can be -enabled with `--landlock` and [fully documentated](docs/landlock.md). (#5170) - -### Notable Performance Improvements - -* Reduced heap allocations in `virtio-net` via the use of a cache of `Iovec` - structures (#6636) -* Notification suppression ("`EVENT_IDX`") support has been added to - `virtio-block` giving a 60% improvement in single queue block throughput and - IOPs performance (#6580) -* Correct size used for `status` field in `virtio-block` state (#6586) - -### Notable Bug Fixes - -* Avoid panic on out-of-bounds PCI MSI-X access (#6657) -* Fix undefined behaviour on AArch64 leading to wrong optimisation on KVM API - access (#6647) -* Rust v1.80.0 added use of `fcntl` syscall on debug assertions so this is now - included in the virtio-device seccomp filters for tests that use this (#6648) -* Short reads are now handled correctly in the `virtio-vsock` device (#6621) -* Fix undefined behaviour on TTY ioctl leading to wrong optimisation (#6568) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Bo Chen -* Changyuan Lyu -* Jinank Jain -* Julian Stecklina -* Muminul Islam -* Nuno Das Neves -* Praveen K Paladugu -* Rob Bradford -* Songqian Li -* Wei Liu -* Yuanchu Xie -* ihciah -* wuxinyue -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v42.0/index.md b/content/en/blog/v42.0/index.md deleted file mode 100644 index 8f2c3891..00000000 --- a/content/en/blog/v42.0/index.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Cloud Hypervisor v42.0 Released!" -date: 2024-10-25T09:20:04Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v42.0. The following user visible changes have been made: - -### SVE/SVE2 Support on AArch64 - -The SVE and SVE2 feature bits are now propagated through to the guest on -AArch64. (#6678, #6691) - -### Notable Bug Fixes - -* Reduce latency notification when rate limited (#6672) -* Fix `virtio-console` resizing (#6704) -* Fix resizing when console uses TTY (#6754) -* Avoid deadlock in PCI BAR reprogramming that can occur when adding a new - `virtio` device to a VM that has been restored (#6775) -* Fix console resizing after VM restore (#6748) -* Fix memory resize error due to incorrect bounds checks (#6736) - -### Sponsorships - -During this release cycle a new VFIO CI worker has been provided by Crusoe -Energy and a new ARM64 CI worker has been provided by Ubicloud. - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alexandru Matei -* Alyssa Ross -* Anirudh Rayabharam -* BharatNarasimman -* Bo Chen -* Jinank Jain -* Jonas Scholz -* Nuno Das Neves -* Praveen K Paladugu -* Purna Pavan Chandra -* Rob Bradford -* Ruoqing He -* Songqian Li -* Tom Dohrmann -* Wei Liu -* Wenyu Huang -* Yuhong Zhong -* wuxinyue -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v43.0/index.md b/content/en/blog/v43.0/index.md deleted file mode 100644 index 9e955fb6..00000000 --- a/content/en/blog/v43.0/index.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Cloud Hypervisor v43.0 Released!" -date: 2024-12-18T21:31:26Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v43.0. The following user visible changes have been made: - -### Live Migration over TCP Connections - -Support has been added to enable direct live migration from two hosts via TCP -connections. This supplements the existing support for migrating over a UNIX -socket which can then be tunnelled as desired. The documentation has been -updated. (#6850) - -### Notable Performance Improvements - -The `VIRTIO_RING_F_INDIRECT_DESC` feature has been enabled for `virtio-block` -devices. This significantly increases the throughput of the devices with a -small negative impact on latency. (#6826) - -### Notable Bug Fixes - -* Cloud Hypervisor now accepts VFIO devices that use I/O PCI BARs on non x86-64 - architectures. Whether they function depends on the host PCI host bridge - support - previously they would be rejected even if the driver did not use - these BARs. (#6871) -* Command line groups were adjusted to ensure that at least one payload - parameter was provided if any other VM parameters provided. (#6832) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Andrew Consroe -* Bo Chen -* Jinrong Liang -* Julian Stecklina -* Muminul Islam -* Rob Bradford -* Ruoqing He -* Wojtek Czekalski - -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v44.0/index.md b/content/en/blog/v44.0/index.md deleted file mode 100644 index b1440327..00000000 --- a/content/en/blog/v44.0/index.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: "Cloud Hypervisor v44.0 Released!" -date: 2025-02-03T19:34:45Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -# v44.0 - -This release has been tracked in our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v44.0. The following user visible changes have been made: - -### Configurable `virtio-iommu` Address Width - -The `iommu_address_width` option has been added to `--platform` to allow users -to limit the `virtio-iommu` address space in the guest. (#6900) - -### Notable Performance Improvements - -The `VIRTIO_BLK_F_SEG_MAX` feature has been enabled for `virtio-block` devices, -which brings significant performance improvements on throughput. (#6885) - -The `io_uring` entries are no longer forced to use async helper workers, -delegating the decision to the kernel. This change resolved the issue of having -excessive amount of worker threads when `io_uring` is being used, which is -expected to improve performance, such as reducing memory usage and reduce CPU -contention. - -### New Fuzzers - -Our continuous fuzzing infrastructure is augmented with two new fuzzers to cover -x86 instruction emulator and `virtio-vsock`. - -### Notable Bug Fixes - -* Fix short read and short write that impact QCOW and VHDX support. (#6884) -* Various bug fixes on VHDX support. (#6890, #6899) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Arvind Vasudev -* Bo Chen -* Nikolay Edigaryev -* Rob Bradford -* Ruoqing He -* Wei Liu - -# v43.0 - -This release has been tracked in our [roadmap -project](https://github.com/orgs/cloud-hypervisor/projects/6) as iteration -v43.0. The following user visible changes have been made: - -### Live Migration over TCP Connections - -Support has been added to enable direct live migration from two hosts via TCP -connections. This supplements the existing support for migrating over a UNIX -socket which can then be tunnelled as desired. The documentation has been -updated. (#6850) - -### Notable Performance Improvements - -The `VIRTIO_RING_F_INDIRECT_DESC` feature has been enabled for `virtio-block` -devices. This significantly increases the throughput of the devices with a -small negative impact on latency. (#6826) - -### Notable Bug Fixes - -* Cloud Hypervisor now accepts VFIO devices that use I/O PCI BARs on non x86-64 - architectures. Whether they function depends on the host PCI host bridge - support - previously they would be rejected even if the driver did not use - these BARs. (#6871) -* Command line groups were adjusted to ensure that at least one payload - parameter was provided if any other VM parameters provided. (#6832) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alyssa Ross -* Andrew Consroe -* Bo Chen -* Jinrong Liang -* Julian Stecklina -* Muminul Islam -* Rob Bradford -* Ruoqing He -* Wojtek Czekalski -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v45.0/index.md b/content/en/blog/v45.0/index.md deleted file mode 100644 index 6916132d..00000000 --- a/content/en/blog/v45.0/index.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Cloud Hypervisor v45.0 Released!" -date: 2025-03-30T17:28:57Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in [v45.0 group](https://github.com/orgs/cloud-hypervisor/projects/6/views/4?filterQuery=release%3A%22Release+45%22) of our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6/). - -Experimental `riscv64` Architecture Support -------------------------------------------- - -Cloud Hypervisor now has experimental `riscv64` architecture -support. Details can be found from the [riscv -documentation](docs/riscv.md). - -Alphabetically Sorted CLI Options ---------------------------------- - -To improve the readability of CLI options, the output of the `--help` -now is alphabetically sorted. (#6988) - -Improved Downtime of VM Live Migration --------------------------------------- - -The downtime of VM live migration is reduced via delaying some of the -tearing down process of the source VM after the destination VM is up and -running. (#6987) - -Notable Bug Fixes ------------------ - -* Fix seccomp filters related to http-api thread (#6967) -* Handle cross-page access in the emulator for mshv (#6968) - -Contributors ------------- - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Andrew Consroe -* Bo Chen -* Jinank Jain -* Jinrong Liang -* Philipp Schuster -* Ruoqing He -* Stefan Kober -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v46.0/index.md b/content/en/blog/v46.0/index.md deleted file mode 100644 index a32bad53..00000000 --- a/content/en/blog/v46.0/index.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Cloud Hypervisor v46.0 Released!" -date: 2025-05-23T22:07:00Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in [v46.0 group](https://github.com/orgs/cloud-hypervisor/projects/6/views/4?filterQuery=release%3A%22Release+46%22) of our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6/). - -File-level Locking Support with `--disk` ----------------------------------------- - -Now file-level locking is enforced for disk images, provided by users -with `--disk`. This ensures that only a single Cloud Hypervisor instance -can obtain write access to a given disk image at any time, preventing -misconfiguration and avoiding potential data corruption. (#6974) - -Improved Error Reporting with VM Resizing ------------------------------------------ - -Instead of returning a generic error `400` (e.g. `BadRequest`), users -now get a more specific error `429` (e.g. `TooManyRequests`) when a -pending VM resizing is not completed. This allows users to better handle -different errors, say retrying the request when applicable. (#7043) - -IPv6 Address Support with `--net` ---------------------------------- - -It is now possible to specify an IPv6 address and mask when creating a -network interface with `--net`. (#7048) - -Experimental AArch64 Support with the MSHV Hypervisor ------------------------------------------------------ - -It is now possible to start VMs on AArch64 platforms when using MSHV -hypervisor. (#7055) - -Deprecated SGX Support ----------------------- - -The SGX support now is deprecated with a warning message if it being -used, with the intention to remove its support from our code base in two -release cycles (e.g. v48.0). (#7090) - -Notable Bug Fixes ------------------ - -* Remove `path` as required for `DiskConfig` from the OpenAPI spec file - (#7017) -* Properly parse PCI capabilities (#7018) -* Reprogram PCI device BAR when its MSE bit is set (#7063) -* Update IOMMU mappings of MMIO regions with BAR reprogram for VFIO - devices (#7064) -* Avoid resizing VMs to zero vCPUs (#7086) -* Fix extended topology enumeration leaf exposed to the guest (#7087) - -Contributors ------------- - -Many thanks to everyone who has contributed to our release: - -* Bingxin Li -* Bo Chen -* Fabiano Fidêncio -* Gregory Anders -* Jinank Jain -* Julian Stecklina -* Muminul Islam -* Paolo Bonzini -* Philipp Schuster -* Rob Bradford -* Ruoqing He -* Thomas Prescher -* abm-77 -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v47.0/index.md b/content/en/blog/v47.0/index.md deleted file mode 100644 index de0236a2..00000000 --- a/content/en/blog/v47.0/index.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Cloud Hypervisor v47.0 Released!" -date: 2025-07-22T22:48:05Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in [v47.0 group](https://github.com/orgs/cloud-hypervisor/projects/6/views/4?filterQuery=release%3A%22Release+47%22) of our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6/). - -Block Device Error Reporting to the Guest ------------------------------------------ - -Instead of exiting on I/O errors, the `virtio-block` device now reports -errors to the guest using `VIRTIO_BLK_S_IOERR`. It improves the user -experience particularly when the guest rootfs is not backed by the -affected block device. (#7107) - -Nice Error Messages on Exit ---------------------------- - -We now have the chain of errors being reported and printed nicely, when -Cloud Hypervisor or ch-remote exits on errors. (#7066) - -Alphabetically Sorted CLI Options for ch-remote ------------------------------------------------ - -To improve readability, ch-remote now prints help information in -alphabetical order. (#7130) - -Notable Bug Fixes ------------------ - -* Error out early when block device serial is too long (#7124) -* Fix partial commands being discarded for `virtio-vsock` (#7195) -* Disable the broken interrupt support for the `rtc_pl031` device to - prevent spurious guest interrupts (#7199) - -Deprecations ------------- - -* A default IP (`192.168.249.1`) and mask (`255.255.255.0`) are - currently assigned to the `virtio-net` device if no value is specified - by users. Such behavior is now deprecated. Users of this behavior will - receive a warning message and should make adjustments. The behavior - will be removed in two release cycles (v49.0). -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v48.0/index.md b/content/en/blog/v48.0/index.md deleted file mode 100644 index 52791c70..00000000 --- a/content/en/blog/v48.0/index.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: "Cloud Hypervisor v48.0 Released!" -date: 2025-09-12T23:05:40Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in [v48.0 group](https://github.com/orgs/cloud-hypervisor/projects/6/views/4?filterQuery=release%3A%22Release+48%22) of our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6/). - -### Experimental `fw_cfg` Device Support - -This feature enables passing configuration data and files, such as VM -boot configurations (kernel, kernel cmdline, e820 memory map, and ACPI -tables), from the host to the guest. (#7117) - -### Experimental `ivshmem` Device Support - -Support for inter-VM shared memory has been added. For more information, -please refer to the [ivshmem documentation](docs/ivshmem.md). (#6703) - -### Firmware Boot Support on `riscv64` - -In addition to direct kernel boot, firmware boot support has been added -on `riscv64` hosts. (#7249) - -### Increased vCPU Limit on x86_64/kvm - -The maximum number of supported vCPUs on x86_64 hosts using KVM has been -raised from 254 to 8192. (#7299) - -### Improved Block Performance with Small Block Sizes - -Performance for `virtio-blk` with small block sizes (16KB and below) -is enhanced via submitting async IO requests in batches. (#7146) - -### Faster VM Pause Operation - -The VM pause operation now is significantly faster particularly for VMs -with a large number of vCPUs. (#7290) - -### Updated Documentation on Windows Guest Support - -Our Windows documentation now includes instructions to run Windows 11 -guests, in addition to Windows Server guests. (#7218) - -### Policy on AI Generated Code - -We will decline any contributions known to contain contents generated or -derived from using Large Language Models (LLMs). Details can be found -in our [contributing documentation](CONTRIBUTING.md). (#7162) - -### Removed SGX Support - -The SGX support has been removed, as announced in the deprecation notice two -release cycles ago. (#7093) - -### Notable Bug Fixes - -* Seccomp filter fixes with glibc v2.42 (#7327) -* Various fixes related to (#7331, #7334, #7335) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Alex Orozco -* Alyssa Ross -* Anirudh Rayabharam -* Bo Chen -* Demi Marie Obenour -* Lucas Grosche -* Muminul Islam -* Oliver Anderson -* Peter Oskolkov -* Philipp Schuster -* Ruoqing He -* Shubham Chakrawar -* Songqian Li -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v49.0/index.md b/content/en/blog/v49.0/index.md deleted file mode 100644 index 672c1685..00000000 --- a/content/en/blog/v49.0/index.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Cloud Hypervisor v49.0 Released!" -date: 2025-11-09T05:36:56Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in [v49.0 group](https://github.com/orgs/cloud-hypervisor/projects/6/views/4?filterQuery=release%3A%22Release+49%22) of our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6/). - -### MSHV Support Improvements - -On AArch64 with MSHV, firmware boot (#7391) and graceful guest shutdown -(#7354) are now supported, and CI coverage has been added (#7381). - -### Logging Improvements - -Logs now use an improved timestamp format (#7355), emit an explicit -message on graceful shutdown (#7346), and reduce noisy warnings with -newer guest kernels (#7423). - -### Removed Default IP and Mask for `virtio-net` Devices - -The implicit default IP (192.168.249.1) and netmask (255.255.255.0) for -`virtio-net` devices have been removed, as previously announced in the -deprecation notice two releases ago (#7365). Users now can create -`virtio-net` devices with no IP and netmask assigned. - -### Notable Bug Fixes - -* Prevent crash on malformed vsock connect requests (#7310) -* Drop the VFIO container when no VFIO devices are active (#7364) -* Gracefully close preserved file descriptors on hot device removal (#7371) -* Fix race condition in pause–resume cycles (#7397) -* Add NetConfig offload parameters to the OpenAPI spec file (#7445) -* Fix seccomp filter violation from the http-server thread (#7454) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Aastha Rawat -* Alyssa Ross -* Anirudh Rayabharam -* Ariel Chenet -* Bo Chen -* Can Zhang -* Eugene Korenevsky -* Maximilian Güntner -* Muminul Islam -* Oliver Anderson -* Philipp Schuster -* Rob Bradford -* Ruoqing He -* Wei Liu -* Yi Wang -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v50.0/index.md b/content/en/blog/v50.0/index.md deleted file mode 100644 index 1c2c27c1..00000000 --- a/content/en/blog/v50.0/index.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Cloud Hypervisor v50.0 Released!" -date: 2025-12-19T03:04:36Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in [v50.0 group](https://github.com/orgs/cloud-hypervisor/projects/6/views/6?filterQuery=release%3A%22Release+50%22) of our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6/). - -### Configurable Nested Virtualization Option on x86_64 - -The `nested=on|off` option has been added to `--cpu` to allow users -to configure nested virtualization support in the guest on x86_64 -hosts (for both KVM and MSHV). The default value is `on` to maintain -consistency with existing behavior. (#7408) - -### Compression Support for QCOW2 - -QCOW2 support has been extended to handle compression clusters based on -zlib and zstd. (#7462) - -### Notable Performance Improvements - -Performance of live migration has been improved via an optimized -implementation of dirty bitmap maintenance. (#7468) - -### Live Disk Resizing Support for Raw Images - -The `/vm.resize-disk` API has been introduced to allow users to resize block -devices backed by raw images while a guest is running. (#7476) - -### Developer Experience Improvements - -Significant improvements have been made to developer experience and -productivity. These include a simplified root manifest, codified and -tightened Clippy lints, and streamlined workflows for `cargo clippy` and -`cargo test`. (#7489) - -### Improved File-level Locking Support - -Block devices now use byte-range advisory locks instead of whole-file -locks. While both approaches prevent multiple Cloud Hypervisor instances -from simultaneously accessing the same disk image with write -permissions, byte-range locks provide better compatibility with network -storage backends. (#7494) - -### Logging Improvements - -Logs now include event information generated by the event-monitor -module. (#7512) - -### Notable Bug Fixes - -* Fix several issues around CPUID in the guest (#7485, #7495, #7508) -* Fix snapshot/restore for Windows Guest (#7492) -* Respect queue size in block performance tests (#7515) -* Fix several Serial Manager issues (#7502) -* Fix several seccomp violation issues (#7477, #7497, #7518) -* Fix various issues around block and qcow (#7526, #7528, #7537, #7546, - #7549) -* Retrieve MSRs list correctly on MSHV (#7543) -* Fix live migration (and snapshot/restore) with AMX state (#7534) - -### Contributors - -Many thanks to everyone who has contributed to our release: - -* Anatol Belski -* Anirudh Rayabharam -* Bo Chen -* Changyuan Lyu -* Chengyu Fu -* Connor Brewster -* Demi Marie Obenour -* Eugene Korenevsky -* Julian Stecklina -* Matt Moriarity -* Muminul Islam -* Oliver Anderson -* Pascal Scholz -* Philipp Schuster -* Praveen K Paladugu -* Rob Bradford -* Sebastien Boeuf -* Songqian Li -* Stefan Nürnberger -* Thomas Prescher -* Wei Liu -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v50.1/index.md b/content/en/blog/v50.1/index.md deleted file mode 100644 index 0f52a84b..00000000 --- a/content/en/blog/v50.1/index.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: "Cloud Hypervisor v50.1 Released!" -date: 2026-02-20T01:21:45Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This is a point release containing security fixes and bug fixes. - -Security Fixes --------------- - -This release fixes a security vulnerability in disk image handling. -Details can be found in [GHSA-jmr4-g2hv-mjj6](https://github.com/cloud-hypervisor/cloud-hypervisor/security/advisories/GHSA-jmr4-g2hv-mjj6). - -* A new `backing_files=on|off` option has been added to `--disk` to - explicitly control whether QCOW2 backing files are permitted. This - defaults to `off` to prevent the loading of backing files entirely. - (#7685) -* Explicit image type specification via the user interface, removing - reliance on format autodetection (#7728). -* Prevent sector-zero writes for autodetected raw images (#7728). - -Bug Fixes ---------- - -* Fix various inconsistencies in our OpenAPI specification file - (#7716, #7726) -* Fix QCOW2 thread safety for multiple virtio queues - (`num_queues > 1`) (#7661) -### Download - See the GitHub Release for the release assets. diff --git a/content/en/blog/v51.0/index.md b/content/en/blog/v51.0/index.md deleted file mode 100644 index f048c6d1..00000000 --- a/content/en/blog/v51.0/index.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: "Cloud Hypervisor v51.0 Released!" -date: 2026-02-20T01:34:50Z -draft: false -contributors: [Cloud Hypervisor Team] ---- -This release has been tracked in [v51.0 group](https://github.com/orgs/cloud-hypervisor/projects/6/views/6?filterQuery=release%3A%22Release+51%22) of our [roadmap project](https://github.com/orgs/cloud-hypervisor/projects/6/). - -Security Fixes --------------- - -This release fixes a security vulnerability in disk image handling. -Details can be found in [GHSA-jmr4-g2hv-mjj6](https://github.com/cloud-hypervisor/cloud-hypervisor/security/advisories/GHSA-jmr4-g2hv-mjj6). - -* A new `backing_files=on|off` option has been added to `--disk` to - explicitly control whether QCOW2 backing files are permitted. This - defaults to `off` to prevent the loading of backing files entirely. - (#7685) -* Explicit image type specification via the user interface, removing - reliance on format autodetection (#7728). -* Prevent sector-zero writes for autodetected raw images (#7728). - -Significant QCOW2 v3 Improvements ---------------------------------- - -A large number of QCOW2 v3 specification features have been implemented: - -* RAW backing file support for QCOW2 overlays (#7570) -* Zero bit in L2 entries (#7627) -* Incompatible feature bit validation (#7612) -* Dirty bit support (#7636) -* Variable refcount widths (1 to 64-bit) (#7633) -* Corrupt bit detection and marking (#7639) -* Autoclear feature bits handling (#7648) -* Thread safety fix for multiple virtio queues (`num_queues > 1`) - (#7661) -* Correct zero-fill for reads beyond backing file size (#7678) -* Live disk resize support (#7687) - -ACPI Generic Initiator Support ------------------------------- - -ACPI Generic Initiator Affinity (SRAT Type 5) support has been added -to associate VFIO-PCI devices with dedicated memory/CPU-less NUMA -nodes. This enables the guest OS to make NUMA-aware memory allocation -decisions for device workloads. A new `device_id` parameter has been -added to `--numa` for specifying VFIO devices. (#7626) - -Block Device DISCARD and WRITE_ZEROES Support ---------------------------------------------- - -The `virtio-blk` device now supports `DISCARD` and `WRITE_ZEROES` -operations for QCOW2 and RAW image formats. This enables thin -provisioning and efficient space reclamation when guests trim -filesystems. A new `sparse=on|off` option has been added to `--disk` to -control disk space management: `sparse=on` (default) enables thin -provisioning with space reclamation, while `sparse=off` provides thick -provisioning with consistent I/O latency. (#7666) - -Notable Performance Improvements --------------------------------- - -* Transparent Huge Pages (THP) support has been extended to cover - anonymous shared memory (`shared=on`) via `madvise`. Previously, THP - was only used for non-shared memory. (#7646) -* The `vhost-user-net` device now uses the default set of vhost-user - virtio features, including `VIRTIO_F_RING_INDIRECT_DESC`, which - provides a performance improvement. (#7653) - -MSHV Support Improvements -------------------------- - -* Optimize CPU state update after emulation by only updating special - registers when changed (#7603) -* Enable SMT for guests with `threads_per_core > 1` (#7668) -* Stub `save_data_tables()` to unblock VM pause/resume (#7692) -* Handle `GHCB_INFO_SPECIAL_DBGPRINT` VMG exit in SEV-SNP guest exit - handler (#7703) -* Fix CVM boot failure on MSHV (#7548) -* Fix CPU topology detection for multithreaded configurations (#7576) - -Notable Bug Fixes ------------------ - -* Fix VFIO device hot-remove leaving group and container file - descriptors open, preventing re-add (#7676) -* Fix snapshot restore when backing file is on read-only storage with - `shared=false` (#7674) -* Enforce `VIRTIO_BLK_F_RO` even if guest does not negotiate it - (#7705) -* Fix read-only block device FLUSH requests from OVMF preventing VMs - from booting (#7706) -* Fix vhost-user device not properly dropping unowned file descriptors - (#7679) -* Fix `vhost-user-block` `get_config` interoperability (#7617) -* Fix vsock TOCTOU race condition by copying packet header from guest - memory before processing (#7530) -* Fix vsock handling of large TX packets spanning multiple data - descriptors (#7680) -* Add `gettid()` to all seccomp filters (#7596) -* Fix MAC address parsing that wrongly allowed `+` instead of hex - characters (#7579) -* Improve UUID parse error message and `--net` fd help text (#7702) -* Fix various inconsistencies in our OpenAPI specification file - (#7716, #7726) -* Various documentation fixes (#7602, #7606) - -Contributors ------------- - -Many thanks to everyone who has contributed to our release: - -* Aastha Rawat -* Alyssa Ross -* Anatol Belski -* Anirudh Rayabharam -* Bo Chen -* Champ-Goblem -* Changyuan Lyu -* Damian Barabonkov -* Demi Marie Obenour -* Leander Kohler -* Muminul Islam -* Philipp Schuster -* Rob Bradford -* Rowen-Ye -* Saravanan D -* Stanislav Kinsburskii -* Thomas Leroy -* Wei Liu -* Yi Wang -* Zhibin Li -* stevenhorsman -### Download - See the GitHub Release for the release assets. diff --git a/content/en/docs/_index.md b/content/en/docs/_index.md deleted file mode 100644 index f807c652..00000000 --- a/content/en/docs/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title : "Docs" -description: "Docs Doks." -lead: "" -date: 2020-10-06T08:48:23+00:00 -lastmod: 2020-10-06T08:48:23+00:00 -draft: false -images: [] ---- diff --git a/content/en/docs/prologue/_index.md b/content/en/docs/prologue/_index.md deleted file mode 100644 index c3c1c40b..00000000 --- a/content/en/docs/prologue/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title : "Prologue" -description: "Prologue Doks." -lead: "" -date: 2020-10-06T08:48:45+00:00 -lastmod: 2020-10-06T08:48:45+00:00 -draft: false -images: [] ---- diff --git a/content/en/docs/prologue/commands.md b/content/en/docs/prologue/commands.md deleted file mode 100644 index 87e99c96..00000000 --- a/content/en/docs/prologue/commands.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: "Commands" -description: "Cloud Hypervisor is composed of multiple binaries. This document shows what they are and their help output." -lead: "Cloud Hypervisor is composed of multiple binaries. This document shows what they are and their help output." -date: 2020-10-13T15:21:01+02:00 -lastmod: 2020-10-13T15:21:01+02:00 -draft: false -images: [] -menu: - docs: - parent: "prologue" -weight: 130 -toc: true ---- - -## cloud-hypervisor binary - -The main `cloud-hypervisor` has the following help output (as of v37.0): - -``` -cloud-hypervisor --help -Launch a cloud-hypervisor VMM. - -Usage: cloud-hypervisor [OPTIONS] - -Options: - --cpus boot=,max=,topology=:::,kvm_hyperv=on|off,max_phys_bits=,affinity=,features= [default: boot=1,max_phys_bits=46] - --platform num_pci_segments=,iommu_segments=,serial_number=,uuid=,oem_strings= - --memory Memory parameters "size=,mergeable=on|off,shared=on|off,hugepages=on|off,hugepage_size=,hotplug_method=acpi|virtio-mem,hotplug_size=,hotplugged_size=,prefault=on|off,thp=on|off" [default: size=512M] - --memory-zone ... User defined memory zone parameters "size=,file=,shared=on|off,hugepages=on|off,hugepage_size=,host_numa_node=,id=,hotplug_size=,hotplugged_size=,prefault=on|off" - --firmware Path to firmware that is loaded in an architectural specific way - --kernel Path to kernel to load. This may be a kernel or firmware that supports a PVH entry point (e.g. vmlinux) or architecture equivalent - --initramfs Path to initramfs image - --cmdline Kernel command line - --disk ... Disk parameters "path=,readonly=on|off,direct=on|off,iommu=on|off,num_queues=,queue_size=,vhost_user=on|off,socket=,bw_size=,bw_one_time_burst=,bw_refill_time=,ops_size=,ops_one_time_burst=,ops_refill_time=,id=,pci_segment=" - --net ... Network parameters "tap=,ip=,mask=,mac=,fd=,iommu=on|off,num_queues=,queue_size=,id=,vhost_user=,socket=,vhost_mode=client|server,bw_size=,bw_one_time_burst=,bw_refill_time=,ops_size=,ops_one_time_burst=,ops_refill_time=,pci_segment=offload_tso=on|off,offload_ufo=on|off,offload_csum=on|off" - --rng Random number generator parameters "src=,iommu=on|off" [default: src=/dev/urandom] - --balloon Balloon parameters "size=,deflate_on_oom=on|off,free_page_reporting=on|off" - --fs ... virtio-fs parameters "tag=,socket=,num_queues=,queue_size=,id=,pci_segment=" - --pmem ... Persistent memory parameters "file=,size=,iommu=on|off,discard_writes=on|off,id=,pci_segment=" - --serial Control serial port: off|null|pty|tty|file=|socket= [default: null] - --console Control (virtio) console: "off|null|pty|tty|file=,iommu=on|off" [default: tty] - --device ... Direct device assignment parameters "path=,iommu=on|off,id=,pci_segment=" - --user-device ... Userspace device socket=,id=,pci_segment=" - --vdpa ... vDPA device "path=,num_queues=,iommu=on|off,id=,pci_segment=" - --vsock Virtio VSOCK parameters "cid=,socket=,iommu=on|off,id=,pci_segment=" - --pvpanic Enable pvpanic device - --numa ... Settings related to a given NUMA node "guest_numa_id=,cpus=,distances=,memory_zones=,sgx_epc_sections=,pci_segments=" - --watchdog Enable virtio-watchdog - -v... Sets the level of debugging output - --log-file Log file. Standard error is used if not specified - --api-socket HTTP API socket (UNIX domain socket): path= or fd=. - --event-monitor File to report events on: path= or fd= - --restore Restore from a VM snapshot. - Restore parameters "source_url=,prefault=on|off" - `source_url` should be a valid URL (e.g file:///foo/bar or tcp://192.168.1.10/foo) - `prefault` brings memory pages in when enabled (disabled by default) - --seccomp [default: true] [possible values: true, false, log] - --tpm TPM device "(UNIX Domain Socket from swtpm) socket=" - --sgx-epc ... SGX EPC parameters "id=,size=,prefault=on|off" - -V, --version Print version - -h, --help Print help -``` - -## ch-remote binary - -The `ch-remote` binary that is used for controlling an running Virtual Machine has the following help output (as of v37.0): - -``` -ch-remote --help -Remotely control a cloud-hypervisor VMM. - -Usage: ch-remote [OPTIONS] [COMMAND] - -Commands: - add-device Add VFIO device - add-disk Add block device - add-fs Add virtio-fs backed fs device - add-pmem Add persistent memory device - add-net Add network device - add-user-device Add userspace device - add-vdpa Add vDPA device - add-vsock Add vsock device - remove-device Remove VFIO device - info Info on the VM - counters Counters from the VM - pause Pause the VM - reboot Reboot the VM - power-button Trigger a power button in the VM - resize Resize the VM - resize-zone Resize a memory zone - resume Resume the VM - boot Boot a created VM - delete Delete a VM - shutdown Shutdown the VM - snapshot Create a snapshot from VM - restore Restore VM from a snapshot - coredump Create a coredump from VM - send-migration Initiate a VM migration - receive-migration Receive a VM migration - create Create VM from a JSON configuration - ping Ping the VMM to check for API server availability - shutdown-vmm Shutdown the VMM - help Print this message or the help of the given subcommand(s) - -Options: - --api-socket HTTP API socket path (UNIX domain socket). - -h, --help Print help - -V, --version Print version -``` diff --git a/content/en/docs/prologue/introduction.md b/content/en/docs/prologue/introduction.md deleted file mode 100644 index f4beea78..00000000 --- a/content/en/docs/prologue/introduction.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Introduction" -description: "Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) implemented in Rust that focuses on running modern, cloud workloads, with minimal hardware emulation." -lead: "Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) implemented in Rust that focuses on running modern, cloud workloads, with minimal hardware emulation." -date: 2020-10-06T08:48:57+00:00 -lastmod: 2020-10-06T08:48:57+00:00 -draft: false -images: [] -menu: - docs: - parent: "prologue" -weight: 100 -toc: true ---- - -## Quick Start - -See the [Quick Start →]({{< relref "quick-start" >}}) for a single page guide to getting started with Cloud Hypervisor. - -## Go further - -Currently the majority of the documentation is in the source tree but a user guide, which will be hosted on this website is planned. - -### User documentation - -Here are some documents related to particular features and functionality that a user of Cloud Hypervisor might be interested in: - -* [HTTP API](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/api.md) -* [Virtual CPU configuration](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/cpu.md) -* [Using virtio-fs](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/fs.md) -* [How to hotplug devices](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/hotplug.md) -* [vIOMMU configuration](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/iommu.md) -* [I/O throttling for network and block devices](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/io_throttling.md) -* [Live migration](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/live_migration.md) -* [Using a MACvTAP bridge to place a VM on the host network](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/macvtap-bridge.md) -* [Advanced memory configuration](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/memory.md) -* [Snapshot & Restore of a VM](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/snapshot_restore.md) -* [Building a UEFI firmware for use with Cloud Hypervisor](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/uefi.md) -* [Using VFIO to passthrough PCI devices](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/vfio.md) -* [Emulated NVMe controller via vfio-user](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/vfio-user.md) -* [Using virtio-fs as as a root filesystem](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/virtiofs-root.md) -* [Running and debugging Windows guests](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/windows.md) - -### Developer documentation - -These documents are primarily for developers who are working on the project: - -* [Updating the custom image](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/custom-image.md) -* [Debug port logging for performance testing](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/debug-port.md) -* [Correct use of logging](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/logging.md) -* [How to profile Cloud Hypervisor](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/profiling.md) -* [Seccomp filter debugging](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/seccomp.md) -* [Testing vhost-user-block](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/vhost-user-blk-testing.md) -* [Testing vhost-user-net](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/vhost-user-net-testing.md) - -## Contributing - -See the [CONTRIBUTING file](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/CONTRIBUTING.md) in the source tree for details of how to contribute. -## Help - -Need help with Cloud Hypervisor? Open a [discussion thread on Github](https://github.com/cloud-hypervisor/cloud-hypervisor/discussions) or ask in [our Slack](https://join.slack.com/t/cloud-hypervisor/shared_invite/enQtNjY3MTE3MDkwNDQ4LWQ1MTA1ZDVmODkwMWQ1MTRhYzk4ZGNlN2UwNTI3ZmFlODU0OTcwOWZjMTkwZDExYWE3YjFmNzgzY2FmNDAyMjI). diff --git a/content/en/docs/prologue/quick-start.md b/content/en/docs/prologue/quick-start.md deleted file mode 100644 index b75c4271..00000000 --- a/content/en/docs/prologue/quick-start.md +++ /dev/null @@ -1,215 +0,0 @@ ---- -title: "Quick Start" -description: "One page summary of how to get started with Cloud Hypervisor" -lead: "One page summary of how to get started with Cloud Hypervisor" -date: 2020-11-16T13:59:39+01:00 -lastmod: 2020-11-16T13:59:39+01:00 -draft: false -images: [] -menu: - docs: - parent: "prologue" -weight: 110 -toc: true ---- - -The following sections describe how to build and run Cloud Hypervisor. - -## Prerequisites for AArch64 - -- AArch64 servers (recommended) or development boards equipped with the GICv3 - interrupt controller. - -## Host OS - -For required KVM functionality the minimum host kernel version is 4.11. For -adequate performance the minimum recommended host kernel version is 5.6. The -majority of the CI currently tests with kernel version 5.15. - -## Use Pre-built Binaries - -The recommended approach to getting started with Cloud Hypervisor is by using a -pre-built binary. Binaries are available for the [latest -release](https://github.com/cloud-hypervisor/cloud-hypervisor/releases/latest). -Use `cloud-hypervisor-static` for `x86-64` or `cloud-hypervisor-static-aarch64` -for `AArch64` platform. - -## Packages - -For convenience, packages are also available targeting some popular Linux -distributions. This is thanks to the [Open Build -Service](https://build.opensuse.org). The [OBS -README](https://github.com/cloud-hypervisor/obs-packaging) explains how to -enable the repository in a supported Linux distribution and install Cloud Hypervisor -and accompanying packages. Please report any packaging issues in the -[obs-packaging](https://github.com/cloud-hypervisor/obs-packaging) repository. - -## Building from Source - -Please see the [instructions for building from source](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/building.md) if you do not wish to use the pre-built binaries. - -## Booting Linux - -Cloud Hypervisor supports direct kernel boot (the x86-64 kernel requires the kernel -built with PVH support) or booting via a firmware (either [Rust Hypervisor -Firmware](https://github.com/cloud-hypervisor/rust-hypervisor-firmware) or an -edk2 UEFI firmware called `CLOUDHV` / `CLOUDHV_EFI`.) - -Binary builds of the firmware files are available for the latest release of -[Rust Hypervisor -Firmware](https://github.com/cloud-hypervisor/rust-hypervisor-firmware/releases/latest) -and [our edk2 -repository](https://github.com/cloud-hypervisor/edk2/releases/latest) - -The choice of firmware depends on your guest OS choice; some experimentation -may be required. - -### Firmware Booting - -Cloud Hypervisor supports booting disk images containing all needed components -to run cloud workloads, a.k.a. cloud images. - -The following sample commands will download an Ubuntu Cloud image, converting -it into a format that Cloud Hypervisor can use and a firmware to boot the image -with. - -```shell -$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img -$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-amd64.img focal-server-cloudimg-amd64.raw -$ wget https://github.com/cloud-hypervisor/rust-hypervisor-firmware/releases/download/0.4.2/hypervisor-fw -``` - -The Ubuntu cloud images do not ship with a default password so it necessary to -use a `cloud-init` disk image to customise the image on the first boot. A basic -`cloud-init` image is generated by this [script](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/scripts/create-cloud-init.sh). -This seeds the image with a default username/password of `cloud/cloud123`. It -is only necessary to add this disk image on the first boot. Script also assigns -default IP address using `test_data/cloud-init/ubuntu/local/network-config` details -with `--net "mac=12:34:56:78:90:ab,tap="` option. Then the matching mac address -interface will be enabled as per `network-config` details. - -```shell -$ sudo setcap cap_net_admin+ep ./cloud-hypervisor -$ ./create-cloud-init.sh -$ ./cloud-hypervisor \ - --kernel ./hypervisor-fw \ - --disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \ - --cpus boot=4 \ - --memory size=1024M \ - --net "tap=,mac=,ip=,mask=" -``` - -If access to the firmware messages or interaction with the boot loader (e.g. -GRUB) is required then it necessary to switch to the serial console instead of -`virtio-console`. - -```shell -$ ./cloud-hypervisor \ - --kernel ./hypervisor-fw \ - --disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \ - --cpus boot=4 \ - --memory size=1024M \ - --net "tap=,mac=,ip=,mask=" \ - --serial tty \ - --console off -``` - -### Custom Kernel and Disk Image - -#### Building your Kernel - -Cloud Hypervisor also supports direct kernel boot. For x86-64, a `vmlinux` ELF kernel (compiled with PVH support) is needed. In order to support development there is a custom branch; however provided the required options are enabled any recent kernel will suffice. - -To build the kernel: - -```shell -# Clone the Cloud Hypervisor Linux branch -$ git clone --depth 1 https://github.com/cloud-hypervisor/linux.git -b ch-6.12.8 linux-cloud-hypervisor -$ pushd linux-cloud-hypervisor -$ make ch_defconfig -# Do native build of the x86-64 kernel -$ KCFLAGS="-Wa,-mx86-used-note=no" make bzImage -j `nproc` -# Do native build of the AArch64 kernel -$ make -j `nproc` -$ popd -``` - -For x86-64, the `vmlinux` kernel image will then be located at -`linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin`. -For AArch64, the `Image` kernel image will then be located at -`linux-cloud-hypervisor/arch/arm64/boot/Image`. - -#### Disk image - -For the disk image the same Ubuntu image as before can be used. This contains -an `ext4` root filesystem. - -```shell -$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img # x86-64 -$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-arm64.img # AArch64 -$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-amd64.img focal-server-cloudimg-amd64.raw # x86-64 -$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-arm64.img focal-server-cloudimg-arm64.raw # AArch64 -``` - -#### Booting the guest VM - -These sample commands boot the disk image using the custom kernel whilst also -supplying the desired kernel command line. - -- x86-64 - -```shell -$ sudo setcap cap_net_admin+ep ./cloud-hypervisor -$ ./create-cloud-init.sh -$ ./cloud-hypervisor \ - --kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \ - --disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \ - --cmdline "console=hvc0 root=/dev/vda1 rw" \ - --cpus boot=4 \ - --memory size=1024M \ - --net "tap=,mac=,ip=,mask=" -``` - -- AArch64 - -```shell -$ sudo setcap cap_net_admin+ep ./cloud-hypervisor -$ ./create-cloud-init.sh -$ ./cloud-hypervisor \ - --kernel ./linux-cloud-hypervisor/arch/arm64/boot/Image \ - --disk path=focal-server-cloudimg-arm64.raw path=/tmp/ubuntu-cloudinit.img \ - --cmdline "console=hvc0 root=/dev/vda1 rw" \ - --cpus boot=4 \ - --memory size=1024M \ - --net "tap=,mac=,ip=,mask=" -``` - -If earlier kernel messages are required the serial console should be used instead of `virtio-console`. - -- x86-64 - -```shell -$ ./cloud-hypervisor \ - --kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \ - --console off \ - --serial tty \ - --disk path=focal-server-cloudimg-amd64.raw \ - --cmdline "console=ttyS0 root=/dev/vda1 rw" \ - --cpus boot=4 \ - --memory size=1024M \ - --net "tap=,mac=,ip=,mask=" -``` - -- AArch64 - -```shell -$ ./cloud-hypervisor \ - --kernel ./linux-cloud-hypervisor/arch/arm64/boot/Image \ - --console off \ - --serial tty \ - --disk path=focal-server-cloudimg-arm64.raw \ - --cmdline "console=ttyAMA0 root=/dev/vda1 rw" \ - --cpus boot=4 \ - --memory size=1024M \ - --net "tap=,mac=,ip=,mask=" -``` diff --git a/contributors/cloud-hypervisor-team/index.html b/contributors/cloud-hypervisor-team/index.html new file mode 100644 index 00000000..94b52799 --- /dev/null +++ b/contributors/cloud-hypervisor-team/index.html @@ -0,0 +1,5 @@ +Cloud Hypervisor Team - Cloud Hypervisor

Cloud Hypervisor Team

Cloud Hypervisor v51.0 Released!

Posted February 20, 2026 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v50.1 Released!

Posted February 20, 2026 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v50.0 Released!

Posted December 19, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v49.0 Released!

Posted November 9, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v48.0 Released!

Posted September 12, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v47.0 Released!

Posted July 22, 2025 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v46.0 Released!

Posted May 23, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v45.0 Released!

Posted March 30, 2025 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v44.0 Released!

Posted February 3, 2025 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v43.0 Released!

Posted December 18, 2024 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v42.0 Released!

Posted October 25, 2024 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v41.0 Released!

Posted August 16, 2024 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v40.0 Released!

Posted June 21, 2024 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v39.0 Released!

Posted April 27, 2024 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v38.0 Released!

Posted February 16, 2024 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v37.0 Released!

Posted December 14, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v36.0 Released!

Posted November 2, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v35.0 Released!

Posted September 21, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v34.0 Released!

Posted August 10, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v33.0 Released!

Posted June 29, 2023 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v32.0 Released!

Posted May 18, 2023 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v31.0 Released!

Posted April 6, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v30.0 Released!

Posted February 24, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v29.0 Released!

Posted January 14, 2023 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v28.1 Released!

Posted December 14, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v28.0 Released!

Posted November 17, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v27.0 Released!

Posted September 29, 2022 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v26.0 Released!

Posted August 17, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v25.0 Released!

Posted July 7, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v24.0 Released!

Posted May 27, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v23.1 Released!

Posted May 9, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v23.0 Released!

Posted April 14, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v22.1 Released!

Posted March 11, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v21.1 Released!

Posted March 11, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v22.0 Released!

Posted March 3, 2022 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v21.0 Released!

Posted January 20, 2022 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v20.2 Released!

Posted January 4, 2022 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v20.1 Released!

Posted December 13, 2021 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v20.0 Released!

Posted December 2, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v19.0 Released!

Posted October 14, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v18.0 Released!

Posted September 9, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v17.0 Released!

Posted July 22, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v16.0 Released!

Posted June 10, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v15.0 Released!

Posted April 29, 2021 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.14.1 Released!

Posted March 31, 2021 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v0.14.0 Released!

Posted March 26, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.13.0 Released!

Posted February 12, 2021 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.12.0 Released!

Posted December 10, 2020 by Cloud Hypervisor Team ‐ 1 min read

Cloud Hypervisor v0.11.0 Released!

Posted October 29, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.10.0 Released!

Posted September 18, 2020 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.9.0 Released!

Posted August 6, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.8.0 Released!

Posted June 11, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.7.0 Released!

Posted April 30, 2020 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.6.0 Released!

Posted March 20, 2020 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.5.0 Released!

Posted February 7, 2020 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.4.0 Released!

Posted December 13, 2019 by Cloud Hypervisor Team ‐ 3 min read

Cloud Hypervisor v0.3.0 Released!

Posted October 18, 2019 by Cloud Hypervisor Team ‐ 2 min read

Cloud Hypervisor v0.2.0 Released!

Posted September 10, 2019 by Cloud Hypervisor Team ‐ 2 min read

  • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
    + + \ No newline at end of file diff --git a/contributors/cloud-hypervisor-team/index.xml b/contributors/cloud-hypervisor-team/index.xml new file mode 100644 index 00000000..b603e7ab --- /dev/null +++ b/contributors/cloud-hypervisor-team/index.xml @@ -0,0 +1,25 @@ +Cloud Hypervisor Team onhttps://www.cloudhypervisor.org/contributors/cloud-hypervisor-team/Recent content in Cloud Hypervisor Team onHugo -- gohugo.ioen-USFri, 20 Feb 2026 01:34:50 +0000Cloud Hypervisor v51.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v51.0-released/Fri, 20 Feb 2026 01:34:50 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v51.0-released/This release has been tracked in v51.0 group of our roadmap project. +Security Fixes # This release fixes a security vulnerability in disk image handling. Details can be found in GHSA-jmr4-g2hv-mjj6. +A new backing_files=on|off option has been added to --disk to explicitly control whether QCOW2 backing files are permitted. This defaults to off to prevent the loading of backing files entirely. (#7685) Explicit image type specification via the user interface, removing reliance on format autodetection (#7728).Cloud Hypervisor v50.1 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.1-released/Fri, 20 Feb 2026 01:21:45 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.1-released/This is a point release containing security fixes and bug fixes. +Security Fixes # This release fixes a security vulnerability in disk image handling. Details can be found in GHSA-jmr4-g2hv-mjj6. +A new backing_files=on|off option has been added to --disk to explicitly control whether QCOW2 backing files are permitted. This defaults to off to prevent the loading of backing files entirely. (#7685) Explicit image type specification via the user interface, removing reliance on format autodetection (#7728).Cloud Hypervisor v50.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.0-released/Fri, 19 Dec 2025 03:04:36 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.0-released/This release has been tracked in v50.0 group of our roadmap project. +Configurable Nested Virtualization Option on x86_64 # The nested=on|off option has been added to --cpu to allow users to configure nested virtualization support in the guest on x86_64 hosts (for both KVM and MSHV). The default value is on to maintain consistency with existing behavior. (#7408) +Compression Support for QCOW2 # QCOW2 support has been extended to handle compression clusters based on zlib and zstd.Cloud Hypervisor v49.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v49.0-released/Sun, 09 Nov 2025 05:36:56 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v49.0-released/This release has been tracked in v49.0 group of our roadmap project. +MSHV Support Improvements # On AArch64 with MSHV, firmware boot (#7391) and graceful guest shutdown (#7354) are now supported, and CI coverage has been added (#7381). +Logging Improvements # Logs now use an improved timestamp format (#7355), emit an explicit message on graceful shutdown (#7346), and reduce noisy warnings with newer guest kernels (#7423). +Removed Default IP and Mask for virtio-net Devices # The implicit default IP (192.Cloud Hypervisor v48.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v48.0-released/Fri, 12 Sep 2025 23:05:40 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v48.0-released/This release has been tracked in v48.0 group of our roadmap project. +Experimental fw_cfg Device Support # This feature enables passing configuration data and files, such as VM boot configurations (kernel, kernel cmdline, e820 memory map, and ACPI tables), from the host to the guest. (#7117) +Experimental ivshmem Device Support # Support for inter-VM shared memory has been added. For more information, please refer to the ivshmem documentation. (#6703) +Firmware Boot Support on riscv64 # In addition to direct kernel boot, firmware boot support has been added on riscv64 hosts.Cloud Hypervisor v47.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v47.0-released/Tue, 22 Jul 2025 22:48:05 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v47.0-released/This release has been tracked in v47.0 group of our roadmap project. +Block Device Error Reporting to the Guest # Instead of exiting on I/O errors, the virtio-block device now reports errors to the guest using VIRTIO_BLK_S_IOERR. It improves the user experience particularly when the guest rootfs is not backed by the affected block device. (#7107) +Nice Error Messages on Exit # We now have the chain of errors being reported and printed nicely, when Cloud Hypervisor or ch-remote exits on errors.Cloud Hypervisor v46.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v46.0-released/Fri, 23 May 2025 22:07:00 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v46.0-released/This release has been tracked in v46.0 group of our roadmap project. +File-level Locking Support with --disk # Now file-level locking is enforced for disk images, provided by users with --disk. This ensures that only a single Cloud Hypervisor instance can obtain write access to a given disk image at any time, preventing misconfiguration and avoiding potential data corruption. (#6974) +Improved Error Reporting with VM Resizing # Instead of returning a generic error 400 (e.Cloud Hypervisor v45.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v45.0-released/Sun, 30 Mar 2025 17:28:57 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v45.0-released/This release has been tracked in v45.0 group of our roadmap project. +Experimental riscv64 Architecture Support # Cloud Hypervisor now has experimental riscv64 architecture support. Details can be found from the riscv documentation. +Alphabetically Sorted CLI Options # To improve the readability of CLI options, the output of the --help now is alphabetically sorted. (#6988) +Improved Downtime of VM Live Migration # The downtime of VM live migration is reduced via delaying some of the tearing down process of the source VM after the destination VM is up and running.Cloud Hypervisor v44.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v44.0-released/Mon, 03 Feb 2025 19:34:45 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v44.0-released/v44.0 # This release has been tracked in our roadmap project as iteration v44.0. The following user visible changes have been made: +Configurable virtio-iommu Address Width # The iommu_address_width option has been added to --platform to allow users to limit the virtio-iommu address space in the guest. (#6900) +Notable Performance Improvements # The VIRTIO_BLK_F_SEG_MAX feature has been enabled for virtio-block devices, which brings significant performance improvements on throughput. (#6885) +The io_uring entries are no longer forced to use async helper workers, delegating the decision to the kernel.Cloud Hypervisor v43.0 Released!https://www.cloudhypervisor.org/blog/cloud-hypervisor-v43.0-released/Wed, 18 Dec 2024 21:31:26 +0000https://www.cloudhypervisor.org/blog/cloud-hypervisor-v43.0-released/This release has been tracked in our roadmap project as iteration v43.0. The following user visible changes have been made: +Live Migration over TCP Connections # Support has been added to enable direct live migration from two hosts via TCP connections. This supplements the existing support for migrating over a UNIX socket which can then be tunnelled as desired. The documentation has been updated. (#6850) +Notable Performance Improvements # The VIRTIO_RING_F_INDIRECT_DESC feature has been enabled for virtio-block devices. \ No newline at end of file diff --git a/contributors/index.html b/contributors/index.html new file mode 100644 index 00000000..f401cf83 --- /dev/null +++ b/contributors/index.html @@ -0,0 +1,5 @@ +Contributors - Cloud Hypervisor
    • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
      + + \ No newline at end of file diff --git a/contributors/index.xml b/contributors/index.xml new file mode 100644 index 00000000..9a795344 --- /dev/null +++ b/contributors/index.xml @@ -0,0 +1 @@ +Contributors onhttps://www.cloudhypervisor.org/contributors/Recent content in Contributors onHugo -- gohugo.ioen-USFri, 20 Feb 2026 01:34:50 +0000Cloud Hypervisor Teamhttps://www.cloudhypervisor.org/contributors/cloud-hypervisor-team/Fri, 20 Feb 2026 01:34:50 +0000https://www.cloudhypervisor.org/contributors/cloud-hypervisor-team/Sebastien Boeufhttps://www.cloudhypervisor.org/contributors/sebastien-boeuf/Thu, 07 Jul 2022 08:00:00 +0000https://www.cloudhypervisor.org/contributors/sebastien-boeuf/ \ No newline at end of file diff --git a/contributors/sebastien-boeuf/index.html b/contributors/sebastien-boeuf/index.html new file mode 100644 index 00000000..f8d5842a --- /dev/null +++ b/contributors/sebastien-boeuf/index.html @@ -0,0 +1,5 @@ +Sebastien Boeuf - Cloud Hypervisor
      • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
        + + \ No newline at end of file diff --git a/contributors/sebastien-boeuf/index.xml b/contributors/sebastien-boeuf/index.xml new file mode 100644 index 00000000..179b164f --- /dev/null +++ b/contributors/sebastien-boeuf/index.xml @@ -0,0 +1,3 @@ +Sebastien Boeuf onhttps://www.cloudhypervisor.org/contributors/sebastien-boeuf/Recent content in Sebastien Boeuf onHugo -- gohugo.ioen-USThu, 07 Jul 2022 08:00:00 +0000Memory Management Techniqueshttps://www.cloudhypervisor.org/blog/memory-management-techniques/Thu, 07 Jul 2022 08:00:00 +0000https://www.cloudhypervisor.org/blog/memory-management-techniques/Depending on the expectations around the workload running in a Virtual Machine (VM), as well as the agreement between a customer and an operator, multiple use cases related to memory management between host and guest arise and they can be addressed through different techniques. +Host Managed # This section is about how memory can be managed by the host, as it knows the VM is going to need more or less memory during its runtime.Achieving Bare Metal Performance Within a Virtual Machinehttps://www.cloudhypervisor.org/blog/achieving-bare-metal-performance-within-a-virtual-machine/Thu, 19 May 2022 08:00:00 +0000https://www.cloudhypervisor.org/blog/achieving-bare-metal-performance-within-a-virtual-machine/There are use cases for which a workload needs to access specific hardware such as accelerators, GPU or network adapters to maximise potential performance. And since these workloads run inside virtual machines (VM) for security reasons, the challenge is to make this hardware available from within the VM, but without degrading the performance that can be achieved from bare metal. +VFIO, the Ideal Choice # This is a mature framework allowing a PCI device to be bound to the vfio-pci driver instead of the default driver it is usually attached to. \ No newline at end of file diff --git a/assets/images/.gitkeep b/css/vendor/.gitkeep similarity index 100% rename from assets/images/.gitkeep rename to css/vendor/.gitkeep diff --git a/data/docs-versions.yml b/data/docs-versions.yml deleted file mode 100644 index 8e7e5dd9..00000000 --- a/data/docs-versions.yml +++ /dev/null @@ -1,60 +0,0 @@ -# - group: v1.x -# baseurl: "https://getbootstrap.com" -# description: "Every minor and patch release from v1 is listed below." -# versions: -# - v: "1.0.0" -# - v: "1.1.0" -# - v: "1.1.1" -# - v: "1.2.0" -# - v: "1.3.0" -# - v: "1.4.0" -# -# - group: v2.x -# baseurl: "https://getbootstrap.com" -# description: "Every minor and patch release from v2 is listed below." -# versions: -# - v: "2.0.0" -# - v: "2.0.1" -# - v: "2.0.2" -# - v: "2.0.3" -# - v: "2.0.4" -# - v: "2.1.0" -# - v: "2.1.1" -# - v: "2.2.0" -# - v: "2.2.1" -# - v: "2.2.2" -# - v: "2.3.0" -# - v: "2.3.1" -# - v: "2.3.2" -# -# - group: v3.x -# baseurl: "https://getbootstrap.com/docs" -# description: "Every minor and patch release from v3 is listed below. Last update was v3.4.1." -# versions: -# - v: "3.3" -# - v: "3.4" -# -# - group: v4.x -# baseurl: "https://getbootstrap.com/docs" -# description: "Our previous major release with its minor releases. Last update was v4.6.0." -# versions: -# - v: "4.0" -# - v: "4.1" -# - v: "4.2" -# - v: "4.3" -# - v: "4.4" -# - v: "4.5" -# - v: "4.6" - -- group: v0.x - baseurl: "/docs" - description: "Current major release. Last update was v0.2.0." - versions: - - v: "0.1" - - v: "0.2" - -- group: v1.x - baseurl: "/docs" - description: "Every minor and patch release from v1 is listed below. Last update was v1.0.0." - versions: - - v: "1.0" diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..d96a9a8f --- /dev/null +++ b/docs/index.html @@ -0,0 +1,7 @@ +Docs - Cloud Hypervisor
        • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
          + + + \ No newline at end of file diff --git a/docs/index.xml b/docs/index.xml new file mode 100644 index 00000000..0696c061 --- /dev/null +++ b/docs/index.xml @@ -0,0 +1 @@ +Docs onhttps://www.cloudhypervisor.org/docs/Recent content in Docs onHugo -- gohugo.ioen-USTue, 06 Oct 2020 08:48:23 +0000 \ No newline at end of file diff --git a/docs/prologue/commands/index.html b/docs/prologue/commands/index.html new file mode 100644 index 00000000..545f0db4 --- /dev/null +++ b/docs/prologue/commands/index.html @@ -0,0 +1,90 @@ +Commands - Cloud Hypervisor

          Commands

          Cloud Hypervisor is composed of multiple binaries. This document shows what they are and their help output.

          cloud-hypervisor binary

          The main cloud-hypervisor has the following help output (as of v37.0):

          cloud-hypervisor --help
          +Launch a cloud-hypervisor VMM.
          +
          +Usage: cloud-hypervisor [OPTIONS]
          +
          +Options:
          +      --cpus <cpus>                    boot=<boot_vcpus>,max=<max_vcpus>,topology=<threads_per_core>:<cores_per_die>:<dies_per_package>:<packages>,kvm_hyperv=on|off,max_phys_bits=<maximum_number_of_physical_bits>,affinity=<list_of_vcpus_with_their_associated_cpuset>,features=<list_of_features_to_enable> [default: boot=1,max_phys_bits=46]
          +      --platform <platform>            num_pci_segments=<num_pci_segments>,iommu_segments=<list_of_segments>,serial_number=<dmi_device_serial_number>,uuid=<dmi_device_uuid>,oem_strings=<list_of_strings>
          +      --memory <memory>                Memory parameters "size=<guest_memory_size>,mergeable=on|off,shared=on|off,hugepages=on|off,hugepage_size=<hugepage_size>,hotplug_method=acpi|virtio-mem,hotplug_size=<hotpluggable_memory_size>,hotplugged_size=<hotplugged_memory_size>,prefault=on|off,thp=on|off" [default: size=512M]
          +      --memory-zone <memory-zone>...   User defined memory zone parameters "size=<guest_memory_region_size>,file=<backing_file>,shared=on|off,hugepages=on|off,hugepage_size=<hugepage_size>,host_numa_node=<node_id>,id=<zone_identifier>,hotplug_size=<hotpluggable_memory_size>,hotplugged_size=<hotplugged_memory_size>,prefault=on|off"
          +      --firmware <firmware>            Path to firmware that is loaded in an architectural specific way
          +      --kernel <kernel>                Path to kernel to load. This may be a kernel or firmware that supports a PVH entry point (e.g. vmlinux) or architecture equivalent
          +      --initramfs <initramfs>          Path to initramfs image
          +      --cmdline <cmdline>              Kernel command line
          +      --disk <disk>...                 Disk parameters "path=<disk_image_path>,readonly=on|off,direct=on|off,iommu=on|off,num_queues=<number_of_queues>,queue_size=<size_of_each_queue>,vhost_user=on|off,socket=<vhost_user_socket_path>,bw_size=<bytes>,bw_one_time_burst=<bytes>,bw_refill_time=<ms>,ops_size=<io_ops>,ops_one_time_burst=<io_ops>,ops_refill_time=<ms>,id=<device_id>,pci_segment=<segment_id>"
          +      --net <net>...                   Network parameters "tap=<if_name>,ip=<ip_addr>,mask=<net_mask>,mac=<mac_addr>,fd=<fd1,fd2...>,iommu=on|off,num_queues=<number_of_queues>,queue_size=<size_of_each_queue>,id=<device_id>,vhost_user=<vhost_user_enable>,socket=<vhost_user_socket_path>,vhost_mode=client|server,bw_size=<bytes>,bw_one_time_burst=<bytes>,bw_refill_time=<ms>,ops_size=<io_ops>,ops_one_time_burst=<io_ops>,ops_refill_time=<ms>,pci_segment=<segment_id>offload_tso=on|off,offload_ufo=on|off,offload_csum=on|off"
          +      --rng <rng>                      Random number generator parameters "src=<entropy_source_path>,iommu=on|off" [default: src=https://www.cloudhypervisor.org/dev/urandom]
          +      --balloon <balloon>              Balloon parameters "size=<balloon_size>,deflate_on_oom=on|off,free_page_reporting=on|off"
          +      --fs <fs>...                     virtio-fs parameters "tag=<tag_name>,socket=<socket_path>,num_queues=<number_of_queues>,queue_size=<size_of_each_queue>,id=<device_id>,pci_segment=<segment_id>"
          +      --pmem <pmem>...                 Persistent memory parameters "file=<backing_file_path>,size=<persistent_memory_size>,iommu=on|off,discard_writes=on|off,id=<device_id>,pci_segment=<segment_id>"
          +      --serial <serial>                Control serial port: off|null|pty|tty|file=</path/to/a/file>|socket=</path/to/a/file> [default: null]
          +      --console <console>              Control (virtio) console: "off|null|pty|tty|file=</path/to/a/file>,iommu=on|off" [default: tty]
          +      --device <device>...             Direct device assignment parameters "path=<device_path>,iommu=on|off,id=<device_id>,pci_segment=<segment_id>"
          +      --user-device <user-device>...   Userspace device socket=<socket_path>,id=<device_id>,pci_segment=<segment_id>"
          +      --vdpa <vdpa>...                 vDPA device "path=<device_path>,num_queues=<number_of_queues>,iommu=on|off,id=<device_id>,pci_segment=<segment_id>"
          +      --vsock <vsock>                  Virtio VSOCK parameters "cid=<context_id>,socket=<socket_path>,iommu=on|off,id=<device_id>,pci_segment=<segment_id>"
          +      --pvpanic                        Enable pvpanic device
          +      --numa <numa>...                 Settings related to a given NUMA node "guest_numa_id=<node_id>,cpus=<cpus_id>,distances=<list_of_distances_to_destination_nodes>,memory_zones=<list_of_memory_zones>,sgx_epc_sections=<list_of_sgx_epc_sections>,pci_segments=<list_of_pci_segments>"
          +      --watchdog                       Enable virtio-watchdog
          +  -v...                                Sets the level of debugging output
          +      --log-file <log-file>            Log file. Standard error is used if not specified
          +      --api-socket <api-socket>        HTTP API socket (UNIX domain socket): path=</path/to/a/file> or fd=<fd>.
          +      --event-monitor <event-monitor>  File to report events on: path=</path/to/a/file> or fd=<fd>
          +      --restore <restore>              Restore from a VM snapshot.
          +                                       Restore parameters "source_url=<source_url>,prefault=on|off"
          +                                       `source_url` should be a valid URL (e.g file:///foo/bar or tcp://192.168.1.10/foo)
          +                                       `prefault` brings memory pages in when enabled (disabled by default)
          +      --seccomp <seccomp>              [default: true] [possible values: true, false, log]
          +      --tpm <tpm>                      TPM device "(UNIX Domain Socket from swtpm) socket=</path/to/a/socket>"
          +      --sgx-epc <sgx-epc>...           SGX EPC parameters "id=<epc_section_identifier>,size=<epc_section_size>,prefault=on|off"
          +  -V, --version                        Print version
          +  -h, --help                           Print help
          +

          ch-remote binary

          The ch-remote binary that is used for controlling an running Virtual Machine has the following help output (as of v37.0):

          ch-remote --help
          +Remotely control a cloud-hypervisor VMM.
          +
          +Usage: ch-remote [OPTIONS] [COMMAND]
          +
          +Commands:
          +  add-device         Add VFIO device
          +  add-disk           Add block device
          +  add-fs             Add virtio-fs backed fs device
          +  add-pmem           Add persistent memory device
          +  add-net            Add network device
          +  add-user-device    Add userspace device
          +  add-vdpa           Add vDPA device
          +  add-vsock          Add vsock device
          +  remove-device      Remove VFIO device
          +  info               Info on the VM
          +  counters           Counters from the VM
          +  pause              Pause the VM
          +  reboot             Reboot the VM
          +  power-button       Trigger a power button in the VM
          +  resize             Resize the VM
          +  resize-zone        Resize a memory zone
          +  resume             Resume the VM
          +  boot               Boot a created VM
          +  delete             Delete a VM
          +  shutdown           Shutdown the VM
          +  snapshot           Create a snapshot from VM
          +  restore            Restore VM from a snapshot
          +  coredump           Create a coredump from VM
          +  send-migration     Initiate a VM migration
          +  receive-migration  Receive a VM migration
          +  create             Create VM from a JSON configuration
          +  ping               Ping the VMM to check for API server availability
          +  shutdown-vmm       Shutdown the VMM
          +  help               Print this message or the help of the given subcommand(s)
          +
          +Options:
          +      --api-socket <api-socket>  HTTP API socket path (UNIX domain socket).
          +  -h, --help                     Print help
          +  -V, --version                  Print version
          +
          • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
            + + + \ No newline at end of file diff --git a/docs/prologue/index.html b/docs/prologue/index.html new file mode 100644 index 00000000..61e19011 --- /dev/null +++ b/docs/prologue/index.html @@ -0,0 +1,7 @@ +Prologue - Cloud Hypervisor
            • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
              + + + \ No newline at end of file diff --git a/docs/prologue/index.xml b/docs/prologue/index.xml new file mode 100644 index 00000000..625ef8e6 --- /dev/null +++ b/docs/prologue/index.xml @@ -0,0 +1,7 @@ +Prologue onhttps://www.cloudhypervisor.org/docs/prologue/Recent content in Prologue onHugo -- gohugo.ioen-USTue, 06 Oct 2020 08:48:45 +0000Introductionhttps://www.cloudhypervisor.org/docs/prologue/introduction/Tue, 06 Oct 2020 08:48:57 +0000https://www.cloudhypervisor.org/docs/prologue/introduction/Quick Start # See the Quick Start → for a single page guide to getting started with Cloud Hypervisor. +Go further # Currently the majority of the documentation is in the source tree but a user guide, which will be hosted on this website is planned. +User documentation # Here are some documents related to particular features and functionality that a user of Cloud Hypervisor might be interested in: +HTTP API Virtual CPU configuration Using virtio-fs How to hotplug devices vIOMMU configuration I/O throttling for network and block devices Live migration Using a MACvTAP bridge to place a VM on the host network Advanced memory configuration Snapshot &amp; Restore of a VM Building a UEFI firmware for use with Cloud Hypervisor Using VFIO to passthrough PCI devices Emulated NVMe controller via vfio-user Using virtio-fs as as a root filesystem Running and debugging Windows guests Developer documentation # These documents are primarily for developers who are working on the project:Quick Starthttps://www.cloudhypervisor.org/docs/prologue/quick-start/Mon, 16 Nov 2020 13:59:39 +0100https://www.cloudhypervisor.org/docs/prologue/quick-start/The following sections describe how to build and run Cloud Hypervisor. +Prerequisites for AArch64 # AArch64 servers (recommended) or development boards equipped with the GICv3 interrupt controller. Host OS # For required KVM functionality the minimum host kernel version is 4.11. For adequate performance the minimum recommended host kernel version is 5.6. The majority of the CI currently tests with kernel version 5.15. +Use Pre-built Binaries # The recommended approach to getting started with Cloud Hypervisor is by using a pre-built binary.Commandshttps://www.cloudhypervisor.org/docs/prologue/commands/Tue, 13 Oct 2020 15:21:01 +0200https://www.cloudhypervisor.org/docs/prologue/commands/cloud-hypervisor binary # The main cloud-hypervisor has the following help output (as of v37.0): +cloud-hypervisor --help Launch a cloud-hypervisor VMM. Usage: cloud-hypervisor [OPTIONS] Options: --cpus &lt;cpus&gt; boot=&lt;boot_vcpus&gt;,max=&lt;max_vcpus&gt;,topology=&lt;threads_per_core&gt;:&lt;cores_per_die&gt;:&lt;dies_per_package&gt;:&lt;packages&gt;,kvm_hyperv=on|off,max_phys_bits=&lt;maximum_number_of_physical_bits&gt;,affinity=&lt;list_of_vcpus_with_their_associated_cpuset&gt;,features=&lt;list_of_features_to_enable&gt; [default: boot=1,max_phys_bits=46] --platform &lt;platform&gt; num_pci_segments=&lt;num_pci_segments&gt;,iommu_segments=&lt;list_of_segments&gt;,serial_number=&lt;dmi_device_serial_number&gt;,uuid=&lt;dmi_device_uuid&gt;,oem_strings=&lt;list_of_strings&gt; --memory &lt;memory&gt; Memory parameters &quot;size=&lt;guest_memory_size&gt;,mergeable=on|off,shared=on|off,hugepages=on|off,hugepage_size=&lt;hugepage_size&gt;,hotplug_method=acpi|virtio-mem,hotplug_size=&lt;hotpluggable_memory_size&gt;,hotplugged_size=&lt;hotplugged_memory_size&gt;,prefault=on|off,thp=on|off&quot; [default: size=512M] --memory-zone &lt;memory-zone&gt;... User defined memory zone parameters &quot;size=&lt;guest_memory_region_size&gt;,file=&lt;backing_file&gt;,shared=on|off,hugepages=on|off,hugepage_size=&lt;hugepage_size&gt;,host_numa_node=&lt;node_id&gt;,id=&lt;zone_identifier&gt;,hotplug_size=&lt;hotpluggable_memory_size&gt;,hotplugged_size=&lt;hotplugged_memory_size&gt;,prefault=on|off&quot; --firmware &lt;firmware&gt; Path to firmware that is loaded in an architectural specific way --kernel &lt;kernel&gt; Path to kernel to load. This may be a kernel or firmware that supports a PVH entry point (e. \ No newline at end of file diff --git a/docs/prologue/introduction/index.html b/docs/prologue/introduction/index.html new file mode 100644 index 00000000..3c6ec075 --- /dev/null +++ b/docs/prologue/introduction/index.html @@ -0,0 +1,8 @@ +Introduction - Cloud Hypervisor

              Introduction

              Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) implemented in Rust that focuses on running modern, cloud workloads, with minimal hardware emulation.

              Quick Start

              See the Quick Start → for a single page guide to getting started with Cloud Hypervisor.

              Go further

              Currently the majority of the documentation is in the source tree but a user guide, which will be hosted on this website is planned.

              User documentation

              Here are some documents related to particular features and functionality that a user of Cloud Hypervisor might be interested in:

              Developer documentation

              These documents are primarily for developers who are working on the project:

              Contributing

              See the CONTRIBUTING file in the source tree for details of how to contribute.

              Help

              Need help with Cloud Hypervisor? Open a discussion thread on Github or ask in our Slack.

              • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
                + + + \ No newline at end of file diff --git a/docs/prologue/quick-start/index.html b/docs/prologue/quick-start/index.html new file mode 100644 index 00000000..03fbd5e3 --- /dev/null +++ b/docs/prologue/quick-start/index.html @@ -0,0 +1,114 @@ +Quick Start - Cloud Hypervisor

                Quick Start

                One page summary of how to get started with Cloud Hypervisor

                The following sections describe how to build and run Cloud Hypervisor.

                Prerequisites for AArch64

                • AArch64 servers (recommended) or development boards equipped with the GICv3 +interrupt controller.

                Host OS

                For required KVM functionality the minimum host kernel version is 4.11. For +adequate performance the minimum recommended host kernel version is 5.6. The +majority of the CI currently tests with kernel version 5.15.

                Use Pre-built Binaries

                The recommended approach to getting started with Cloud Hypervisor is by using a +pre-built binary. Binaries are available for the latest +release. +Use cloud-hypervisor-static for x86-64 or cloud-hypervisor-static-aarch64 +for AArch64 platform.

                Packages

                For convenience, packages are also available targeting some popular Linux +distributions. This is thanks to the Open Build +Service. The OBS +README explains how to +enable the repository in a supported Linux distribution and install Cloud Hypervisor +and accompanying packages. Please report any packaging issues in the +obs-packaging repository.

                Building from Source

                Please see the instructions for building from source if you do not wish to use the pre-built binaries.

                Booting Linux

                Cloud Hypervisor supports direct kernel boot (the x86-64 kernel requires the kernel +built with PVH support) or booting via a firmware (either Rust Hypervisor +Firmware or an +edk2 UEFI firmware called CLOUDHV / CLOUDHV_EFI.)

                Binary builds of the firmware files are available for the latest release of +Rust Hypervisor +Firmware +and our edk2 +repository

                The choice of firmware depends on your guest OS choice; some experimentation +may be required.

                Firmware Booting

                Cloud Hypervisor supports booting disk images containing all needed components +to run cloud workloads, a.k.a. cloud images.

                The following sample commands will download an Ubuntu Cloud image, converting +it into a format that Cloud Hypervisor can use and a firmware to boot the image +with.

                $ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
                +$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-amd64.img focal-server-cloudimg-amd64.raw
                +$ wget https://github.com/cloud-hypervisor/rust-hypervisor-firmware/releases/download/0.4.2/hypervisor-fw
                +

                The Ubuntu cloud images do not ship with a default password so it necessary to +use a cloud-init disk image to customise the image on the first boot. A basic +cloud-init image is generated by this script. +This seeds the image with a default username/password of cloud/cloud123. It +is only necessary to add this disk image on the first boot. Script also assigns +default IP address using test_data/cloud-init/ubuntu/local/network-config details +with --net "mac=12:34:56:78:90:ab,tap=" option. Then the matching mac address +interface will be enabled as per network-config details.

                $ sudo setcap cap_net_admin+ep ./cloud-hypervisor
                +$ ./create-cloud-init.sh
                +$ ./cloud-hypervisor \
                +	--kernel ./hypervisor-fw \
                +	--disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \
                +	--cpus boot=4 \
                +	--memory size=1024M \
                +	--net "tap=,mac=,ip=,mask="
                +

                If access to the firmware messages or interaction with the boot loader (e.g. +GRUB) is required then it necessary to switch to the serial console instead of +virtio-console.

                $ ./cloud-hypervisor \
                +	--kernel ./hypervisor-fw \
                +	--disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \
                +	--cpus boot=4 \
                +	--memory size=1024M \
                +	--net "tap=,mac=,ip=,mask=" \
                +	--serial tty \
                +	--console off
                +

                Custom Kernel and Disk Image

                Building your Kernel

                Cloud Hypervisor also supports direct kernel boot. For x86-64, a vmlinux ELF kernel (compiled with PVH support) is needed. In order to support development there is a custom branch; however provided the required options are enabled any recent kernel will suffice.

                To build the kernel:

                # Clone the Cloud Hypervisor Linux branch
                +$ git clone --depth 1 https://github.com/cloud-hypervisor/linux.git -b ch-6.12.8 linux-cloud-hypervisor
                +$ pushd linux-cloud-hypervisor
                +$ make ch_defconfig
                +# Do native build of the x86-64 kernel
                +$ KCFLAGS="-Wa,-mx86-used-note=no" make bzImage -j `nproc`
                +# Do native build of the AArch64 kernel
                +$ make -j `nproc`
                +$ popd
                +

                For x86-64, the vmlinux kernel image will then be located at +linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin. +For AArch64, the Image kernel image will then be located at +linux-cloud-hypervisor/arch/arm64/boot/Image.

                Disk image

                For the disk image the same Ubuntu image as before can be used. This contains +an ext4 root filesystem.

                $ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img # x86-64
                +$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-arm64.img # AArch64
                +$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-amd64.img focal-server-cloudimg-amd64.raw # x86-64
                +$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-arm64.img focal-server-cloudimg-arm64.raw # AArch64
                +

                Booting the guest VM

                These sample commands boot the disk image using the custom kernel whilst also +supplying the desired kernel command line.

                • x86-64
                $ sudo setcap cap_net_admin+ep ./cloud-hypervisor
                +$ ./create-cloud-init.sh
                +$ ./cloud-hypervisor \
                +	--kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \
                +	--disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \
                +	--cmdline "console=hvc0 root=/dev/vda1 rw" \
                +	--cpus boot=4 \
                +	--memory size=1024M \
                +	--net "tap=,mac=,ip=,mask="
                +
                • AArch64
                $ sudo setcap cap_net_admin+ep ./cloud-hypervisor
                +$ ./create-cloud-init.sh
                +$ ./cloud-hypervisor \
                +	--kernel ./linux-cloud-hypervisor/arch/arm64/boot/Image \
                +	--disk path=focal-server-cloudimg-arm64.raw path=/tmp/ubuntu-cloudinit.img \
                +	--cmdline "console=hvc0 root=/dev/vda1 rw" \
                +	--cpus boot=4 \
                +	--memory size=1024M \
                +	--net "tap=,mac=,ip=,mask="
                +

                If earlier kernel messages are required the serial console should be used instead of virtio-console.

                • x86-64
                $ ./cloud-hypervisor \
                +	--kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \
                +	--console off \
                +	--serial tty \
                +	--disk path=focal-server-cloudimg-amd64.raw \
                +	--cmdline "console=ttyS0 root=/dev/vda1 rw" \
                +	--cpus boot=4 \
                +	--memory size=1024M \
                +	--net "tap=,mac=,ip=,mask="
                +
                • AArch64
                $ ./cloud-hypervisor \
                +	--kernel ./linux-cloud-hypervisor/arch/arm64/boot/Image \
                +	--console off \
                +	--serial tty \
                +	--disk path=focal-server-cloudimg-arm64.raw \
                +	--cmdline "console=ttyAMA0 root=/dev/vda1 rw" \
                +	--cpus boot=4 \
                +	--memory size=1024M \
                +	--net "tap=,mac=,ip=,mask="
                +
                • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
                  + + + \ No newline at end of file diff --git a/docs/prologue/sitemap.xml b/docs/prologue/sitemap.xml new file mode 100644 index 00000000..3220fcab --- /dev/null +++ b/docs/prologue/sitemap.xml @@ -0,0 +1 @@ +https://www.cloudhypervisor.org/docs/prologue/introduction/2020-10-06T08:48:57+00:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/quick-start/2020-11-16T13:59:39+01:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/commands/2020-10-13T15:21:01+02:00weekly0.5 \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 00000000..c714f1f9 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1 @@ +https://www.cloudhypervisor.org/docs/prologue/2020-10-06T08:48:45+00:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/introduction/2020-10-06T08:48:57+00:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/quick-start/2020-11-16T13:59:39+01:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/commands/2020-10-13T15:21:01+02:00weekly0.5 \ No newline at end of file diff --git a/static/doks.png b/doks.png similarity index 100% rename from static/doks.png rename to doks.png diff --git a/static/doks.svg b/doks.svg similarity index 100% rename from static/doks.svg rename to doks.svg diff --git a/static/favicon-16x16.png b/favicon-16x16.png similarity index 100% rename from static/favicon-16x16.png rename to favicon-16x16.png diff --git a/static/favicon-32x32.png b/favicon-32x32.png similarity index 100% rename from static/favicon-32x32.png rename to favicon-32x32.png diff --git a/static/favicon.ico b/favicon.ico similarity index 100% rename from static/favicon.ico rename to favicon.ico diff --git a/static/fonts/KaTeX_AMS-Regular.ttf b/fonts/KaTeX_AMS-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_AMS-Regular.ttf rename to fonts/KaTeX_AMS-Regular.ttf diff --git a/static/fonts/KaTeX_AMS-Regular.woff b/fonts/KaTeX_AMS-Regular.woff similarity index 100% rename from static/fonts/KaTeX_AMS-Regular.woff rename to fonts/KaTeX_AMS-Regular.woff diff --git a/static/fonts/KaTeX_AMS-Regular.woff2 b/fonts/KaTeX_AMS-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_AMS-Regular.woff2 rename to fonts/KaTeX_AMS-Regular.woff2 diff --git a/static/fonts/KaTeX_Caligraphic-Bold.ttf b/fonts/KaTeX_Caligraphic-Bold.ttf similarity index 100% rename from static/fonts/KaTeX_Caligraphic-Bold.ttf rename to fonts/KaTeX_Caligraphic-Bold.ttf diff --git a/static/fonts/KaTeX_Caligraphic-Bold.woff b/fonts/KaTeX_Caligraphic-Bold.woff similarity index 100% rename from static/fonts/KaTeX_Caligraphic-Bold.woff rename to fonts/KaTeX_Caligraphic-Bold.woff diff --git a/static/fonts/KaTeX_Caligraphic-Bold.woff2 b/fonts/KaTeX_Caligraphic-Bold.woff2 similarity index 100% rename from static/fonts/KaTeX_Caligraphic-Bold.woff2 rename to fonts/KaTeX_Caligraphic-Bold.woff2 diff --git a/static/fonts/KaTeX_Caligraphic-Regular.ttf b/fonts/KaTeX_Caligraphic-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Caligraphic-Regular.ttf rename to fonts/KaTeX_Caligraphic-Regular.ttf diff --git a/static/fonts/KaTeX_Caligraphic-Regular.woff b/fonts/KaTeX_Caligraphic-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Caligraphic-Regular.woff rename to fonts/KaTeX_Caligraphic-Regular.woff diff --git a/static/fonts/KaTeX_Caligraphic-Regular.woff2 b/fonts/KaTeX_Caligraphic-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Caligraphic-Regular.woff2 rename to fonts/KaTeX_Caligraphic-Regular.woff2 diff --git a/static/fonts/KaTeX_Fraktur-Bold.ttf b/fonts/KaTeX_Fraktur-Bold.ttf similarity index 100% rename from static/fonts/KaTeX_Fraktur-Bold.ttf rename to fonts/KaTeX_Fraktur-Bold.ttf diff --git a/static/fonts/KaTeX_Fraktur-Bold.woff b/fonts/KaTeX_Fraktur-Bold.woff similarity index 100% rename from static/fonts/KaTeX_Fraktur-Bold.woff rename to fonts/KaTeX_Fraktur-Bold.woff diff --git a/static/fonts/KaTeX_Fraktur-Bold.woff2 b/fonts/KaTeX_Fraktur-Bold.woff2 similarity index 100% rename from static/fonts/KaTeX_Fraktur-Bold.woff2 rename to fonts/KaTeX_Fraktur-Bold.woff2 diff --git a/static/fonts/KaTeX_Fraktur-Regular.ttf b/fonts/KaTeX_Fraktur-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Fraktur-Regular.ttf rename to fonts/KaTeX_Fraktur-Regular.ttf diff --git a/static/fonts/KaTeX_Fraktur-Regular.woff b/fonts/KaTeX_Fraktur-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Fraktur-Regular.woff rename to fonts/KaTeX_Fraktur-Regular.woff diff --git a/static/fonts/KaTeX_Fraktur-Regular.woff2 b/fonts/KaTeX_Fraktur-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Fraktur-Regular.woff2 rename to fonts/KaTeX_Fraktur-Regular.woff2 diff --git a/static/fonts/KaTeX_Main-Bold.ttf b/fonts/KaTeX_Main-Bold.ttf similarity index 100% rename from static/fonts/KaTeX_Main-Bold.ttf rename to fonts/KaTeX_Main-Bold.ttf diff --git a/static/fonts/KaTeX_Main-Bold.woff b/fonts/KaTeX_Main-Bold.woff similarity index 100% rename from static/fonts/KaTeX_Main-Bold.woff rename to fonts/KaTeX_Main-Bold.woff diff --git a/static/fonts/KaTeX_Main-Bold.woff2 b/fonts/KaTeX_Main-Bold.woff2 similarity index 100% rename from static/fonts/KaTeX_Main-Bold.woff2 rename to fonts/KaTeX_Main-Bold.woff2 diff --git a/static/fonts/KaTeX_Main-BoldItalic.ttf b/fonts/KaTeX_Main-BoldItalic.ttf similarity index 100% rename from static/fonts/KaTeX_Main-BoldItalic.ttf rename to fonts/KaTeX_Main-BoldItalic.ttf diff --git a/static/fonts/KaTeX_Main-BoldItalic.woff b/fonts/KaTeX_Main-BoldItalic.woff similarity index 100% rename from static/fonts/KaTeX_Main-BoldItalic.woff rename to fonts/KaTeX_Main-BoldItalic.woff diff --git a/static/fonts/KaTeX_Main-BoldItalic.woff2 b/fonts/KaTeX_Main-BoldItalic.woff2 similarity index 100% rename from static/fonts/KaTeX_Main-BoldItalic.woff2 rename to fonts/KaTeX_Main-BoldItalic.woff2 diff --git a/static/fonts/KaTeX_Main-Italic.ttf b/fonts/KaTeX_Main-Italic.ttf similarity index 100% rename from static/fonts/KaTeX_Main-Italic.ttf rename to fonts/KaTeX_Main-Italic.ttf diff --git a/static/fonts/KaTeX_Main-Italic.woff b/fonts/KaTeX_Main-Italic.woff similarity index 100% rename from static/fonts/KaTeX_Main-Italic.woff rename to fonts/KaTeX_Main-Italic.woff diff --git a/static/fonts/KaTeX_Main-Italic.woff2 b/fonts/KaTeX_Main-Italic.woff2 similarity index 100% rename from static/fonts/KaTeX_Main-Italic.woff2 rename to fonts/KaTeX_Main-Italic.woff2 diff --git a/static/fonts/KaTeX_Main-Regular.ttf b/fonts/KaTeX_Main-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Main-Regular.ttf rename to fonts/KaTeX_Main-Regular.ttf diff --git a/static/fonts/KaTeX_Main-Regular.woff b/fonts/KaTeX_Main-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Main-Regular.woff rename to fonts/KaTeX_Main-Regular.woff diff --git a/static/fonts/KaTeX_Main-Regular.woff2 b/fonts/KaTeX_Main-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Main-Regular.woff2 rename to fonts/KaTeX_Main-Regular.woff2 diff --git a/static/fonts/KaTeX_Math-BoldItalic.ttf b/fonts/KaTeX_Math-BoldItalic.ttf similarity index 100% rename from static/fonts/KaTeX_Math-BoldItalic.ttf rename to fonts/KaTeX_Math-BoldItalic.ttf diff --git a/static/fonts/KaTeX_Math-BoldItalic.woff b/fonts/KaTeX_Math-BoldItalic.woff similarity index 100% rename from static/fonts/KaTeX_Math-BoldItalic.woff rename to fonts/KaTeX_Math-BoldItalic.woff diff --git a/static/fonts/KaTeX_Math-BoldItalic.woff2 b/fonts/KaTeX_Math-BoldItalic.woff2 similarity index 100% rename from static/fonts/KaTeX_Math-BoldItalic.woff2 rename to fonts/KaTeX_Math-BoldItalic.woff2 diff --git a/static/fonts/KaTeX_Math-Italic.ttf b/fonts/KaTeX_Math-Italic.ttf similarity index 100% rename from static/fonts/KaTeX_Math-Italic.ttf rename to fonts/KaTeX_Math-Italic.ttf diff --git a/static/fonts/KaTeX_Math-Italic.woff b/fonts/KaTeX_Math-Italic.woff similarity index 100% rename from static/fonts/KaTeX_Math-Italic.woff rename to fonts/KaTeX_Math-Italic.woff diff --git a/static/fonts/KaTeX_Math-Italic.woff2 b/fonts/KaTeX_Math-Italic.woff2 similarity index 100% rename from static/fonts/KaTeX_Math-Italic.woff2 rename to fonts/KaTeX_Math-Italic.woff2 diff --git a/static/fonts/KaTeX_SansSerif-Bold.ttf b/fonts/KaTeX_SansSerif-Bold.ttf similarity index 100% rename from static/fonts/KaTeX_SansSerif-Bold.ttf rename to fonts/KaTeX_SansSerif-Bold.ttf diff --git a/static/fonts/KaTeX_SansSerif-Bold.woff b/fonts/KaTeX_SansSerif-Bold.woff similarity index 100% rename from static/fonts/KaTeX_SansSerif-Bold.woff rename to fonts/KaTeX_SansSerif-Bold.woff diff --git a/static/fonts/KaTeX_SansSerif-Bold.woff2 b/fonts/KaTeX_SansSerif-Bold.woff2 similarity index 100% rename from static/fonts/KaTeX_SansSerif-Bold.woff2 rename to fonts/KaTeX_SansSerif-Bold.woff2 diff --git a/static/fonts/KaTeX_SansSerif-Italic.ttf b/fonts/KaTeX_SansSerif-Italic.ttf similarity index 100% rename from static/fonts/KaTeX_SansSerif-Italic.ttf rename to fonts/KaTeX_SansSerif-Italic.ttf diff --git a/static/fonts/KaTeX_SansSerif-Italic.woff b/fonts/KaTeX_SansSerif-Italic.woff similarity index 100% rename from static/fonts/KaTeX_SansSerif-Italic.woff rename to fonts/KaTeX_SansSerif-Italic.woff diff --git a/static/fonts/KaTeX_SansSerif-Italic.woff2 b/fonts/KaTeX_SansSerif-Italic.woff2 similarity index 100% rename from static/fonts/KaTeX_SansSerif-Italic.woff2 rename to fonts/KaTeX_SansSerif-Italic.woff2 diff --git a/static/fonts/KaTeX_SansSerif-Regular.ttf b/fonts/KaTeX_SansSerif-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_SansSerif-Regular.ttf rename to fonts/KaTeX_SansSerif-Regular.ttf diff --git a/static/fonts/KaTeX_SansSerif-Regular.woff b/fonts/KaTeX_SansSerif-Regular.woff similarity index 100% rename from static/fonts/KaTeX_SansSerif-Regular.woff rename to fonts/KaTeX_SansSerif-Regular.woff diff --git a/static/fonts/KaTeX_SansSerif-Regular.woff2 b/fonts/KaTeX_SansSerif-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_SansSerif-Regular.woff2 rename to fonts/KaTeX_SansSerif-Regular.woff2 diff --git a/static/fonts/KaTeX_Script-Regular.ttf b/fonts/KaTeX_Script-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Script-Regular.ttf rename to fonts/KaTeX_Script-Regular.ttf diff --git a/static/fonts/KaTeX_Script-Regular.woff b/fonts/KaTeX_Script-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Script-Regular.woff rename to fonts/KaTeX_Script-Regular.woff diff --git a/static/fonts/KaTeX_Script-Regular.woff2 b/fonts/KaTeX_Script-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Script-Regular.woff2 rename to fonts/KaTeX_Script-Regular.woff2 diff --git a/static/fonts/KaTeX_Size1-Regular.ttf b/fonts/KaTeX_Size1-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Size1-Regular.ttf rename to fonts/KaTeX_Size1-Regular.ttf diff --git a/static/fonts/KaTeX_Size1-Regular.woff b/fonts/KaTeX_Size1-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Size1-Regular.woff rename to fonts/KaTeX_Size1-Regular.woff diff --git a/static/fonts/KaTeX_Size1-Regular.woff2 b/fonts/KaTeX_Size1-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Size1-Regular.woff2 rename to fonts/KaTeX_Size1-Regular.woff2 diff --git a/static/fonts/KaTeX_Size2-Regular.ttf b/fonts/KaTeX_Size2-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Size2-Regular.ttf rename to fonts/KaTeX_Size2-Regular.ttf diff --git a/static/fonts/KaTeX_Size2-Regular.woff b/fonts/KaTeX_Size2-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Size2-Regular.woff rename to fonts/KaTeX_Size2-Regular.woff diff --git a/static/fonts/KaTeX_Size2-Regular.woff2 b/fonts/KaTeX_Size2-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Size2-Regular.woff2 rename to fonts/KaTeX_Size2-Regular.woff2 diff --git a/static/fonts/KaTeX_Size3-Regular.ttf b/fonts/KaTeX_Size3-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Size3-Regular.ttf rename to fonts/KaTeX_Size3-Regular.ttf diff --git a/static/fonts/KaTeX_Size3-Regular.woff b/fonts/KaTeX_Size3-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Size3-Regular.woff rename to fonts/KaTeX_Size3-Regular.woff diff --git a/static/fonts/KaTeX_Size3-Regular.woff2 b/fonts/KaTeX_Size3-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Size3-Regular.woff2 rename to fonts/KaTeX_Size3-Regular.woff2 diff --git a/static/fonts/KaTeX_Size4-Regular.ttf b/fonts/KaTeX_Size4-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Size4-Regular.ttf rename to fonts/KaTeX_Size4-Regular.ttf diff --git a/static/fonts/KaTeX_Size4-Regular.woff b/fonts/KaTeX_Size4-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Size4-Regular.woff rename to fonts/KaTeX_Size4-Regular.woff diff --git a/static/fonts/KaTeX_Size4-Regular.woff2 b/fonts/KaTeX_Size4-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Size4-Regular.woff2 rename to fonts/KaTeX_Size4-Regular.woff2 diff --git a/static/fonts/KaTeX_Typewriter-Regular.ttf b/fonts/KaTeX_Typewriter-Regular.ttf similarity index 100% rename from static/fonts/KaTeX_Typewriter-Regular.ttf rename to fonts/KaTeX_Typewriter-Regular.ttf diff --git a/static/fonts/KaTeX_Typewriter-Regular.woff b/fonts/KaTeX_Typewriter-Regular.woff similarity index 100% rename from static/fonts/KaTeX_Typewriter-Regular.woff rename to fonts/KaTeX_Typewriter-Regular.woff diff --git a/static/fonts/KaTeX_Typewriter-Regular.woff2 b/fonts/KaTeX_Typewriter-Regular.woff2 similarity index 100% rename from static/fonts/KaTeX_Typewriter-Regular.woff2 rename to fonts/KaTeX_Typewriter-Regular.woff2 diff --git a/assets/js/vendor/.gitkeep b/fonts/vendor/.gitkeep similarity index 100% rename from assets/js/vendor/.gitkeep rename to fonts/vendor/.gitkeep diff --git a/static/fonts/vendor/jost/jost-v4-latin-500.woff b/fonts/vendor/jost/jost-v4-latin-500.woff similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-500.woff rename to fonts/vendor/jost/jost-v4-latin-500.woff diff --git a/static/fonts/vendor/jost/jost-v4-latin-500.woff2 b/fonts/vendor/jost/jost-v4-latin-500.woff2 similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-500.woff2 rename to fonts/vendor/jost/jost-v4-latin-500.woff2 diff --git a/static/fonts/vendor/jost/jost-v4-latin-500italic.woff b/fonts/vendor/jost/jost-v4-latin-500italic.woff similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-500italic.woff rename to fonts/vendor/jost/jost-v4-latin-500italic.woff diff --git a/static/fonts/vendor/jost/jost-v4-latin-500italic.woff2 b/fonts/vendor/jost/jost-v4-latin-500italic.woff2 similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-500italic.woff2 rename to fonts/vendor/jost/jost-v4-latin-500italic.woff2 diff --git a/static/fonts/vendor/jost/jost-v4-latin-700.woff b/fonts/vendor/jost/jost-v4-latin-700.woff similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-700.woff rename to fonts/vendor/jost/jost-v4-latin-700.woff diff --git a/static/fonts/vendor/jost/jost-v4-latin-700.woff2 b/fonts/vendor/jost/jost-v4-latin-700.woff2 similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-700.woff2 rename to fonts/vendor/jost/jost-v4-latin-700.woff2 diff --git a/static/fonts/vendor/jost/jost-v4-latin-700italic.woff b/fonts/vendor/jost/jost-v4-latin-700italic.woff similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-700italic.woff rename to fonts/vendor/jost/jost-v4-latin-700italic.woff diff --git a/static/fonts/vendor/jost/jost-v4-latin-700italic.woff2 b/fonts/vendor/jost/jost-v4-latin-700italic.woff2 similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-700italic.woff2 rename to fonts/vendor/jost/jost-v4-latin-700italic.woff2 diff --git a/static/fonts/vendor/jost/jost-v4-latin-italic.woff b/fonts/vendor/jost/jost-v4-latin-italic.woff similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-italic.woff rename to fonts/vendor/jost/jost-v4-latin-italic.woff diff --git a/static/fonts/vendor/jost/jost-v4-latin-italic.woff2 b/fonts/vendor/jost/jost-v4-latin-italic.woff2 similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-italic.woff2 rename to fonts/vendor/jost/jost-v4-latin-italic.woff2 diff --git a/static/fonts/vendor/jost/jost-v4-latin-regular.woff b/fonts/vendor/jost/jost-v4-latin-regular.woff similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-regular.woff rename to fonts/vendor/jost/jost-v4-latin-regular.woff diff --git a/static/fonts/vendor/jost/jost-v4-latin-regular.woff2 b/fonts/vendor/jost/jost-v4-latin-regular.woff2 similarity index 100% rename from static/fonts/vendor/jost/jost-v4-latin-regular.woff2 rename to fonts/vendor/jost/jost-v4-latin-regular.woff2 diff --git a/functions/hi-from-lambda.js b/functions/hi-from-lambda.js deleted file mode 100644 index 88e4fa00..00000000 --- a/functions/hi-from-lambda.js +++ /dev/null @@ -1,11 +0,0 @@ -exports.handler = (event, context, callback) => { - callback (null, { - statusCode: 200, - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - message: 'Hi from Lambda.', - }), - }); -} diff --git a/i18n/en.toml b/i18n/en.toml deleted file mode 100644 index cb52685f..00000000 --- a/i18n/en.toml +++ /dev/null @@ -1,2 +0,0 @@ -[get-started] - other = "Get Started" \ No newline at end of file diff --git a/images/screenshot.png b/images/screenshot.png deleted file mode 100644 index 072753bb..00000000 Binary files a/images/screenshot.png and /dev/null differ diff --git a/images/tn.png b/images/tn.png deleted file mode 100644 index ff29c682..00000000 Binary files a/images/tn.png and /dev/null differ diff --git a/assets/scss/vendor/.gitkeep b/images/vendor/.gitkeep similarity index 100% rename from assets/scss/vendor/.gitkeep rename to images/vendor/.gitkeep diff --git a/index.html b/index.html new file mode 100644 index 00000000..23979f0b --- /dev/null +++ b/index.html @@ -0,0 +1,40 @@ +Cloud Hypervisor - Run Cloud Virtual Machines Securely and Efficiently

                  Run Cloud Virtual Machines Securely and Efficiently

                  Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) implemented in Rust that focuses on running modern, cloud workloads, with minimal hardware emulation.

                  Get Started

                  Get the source on GitHub

                  Secure 🔒

                  Minimal emulated devices and implemented in Rust to avoid many common security issues

                  Fast ⚡️

                  Boot to userspace in less than 100ms with direct kernel boot

                  🪟 & 🐧

                  Supports running modern Linux and Windows guests

                  Kata Containers

                  Supported by Kata Containers for running secure containerised workloads

                  Powerful REST API

                  Programmatically control the lifecyle of the VM using an HTTP API

                  Slim

                  Minimal memory overhead for dense deployments

                  Cross platform

                  Runs on both x86-64 and aarch64

                  Broad device support

                  Support for wide range of paravirtualised devices and physical device passthrough

                  Live migration

                  Migrate VMs from one host to another without interruption

                  Get Involved:

                  Cloud Hypervisor is governed openly as part of the Linux Foundation and supported by multiple organisations:

                  • Alibaba
                  • AMD
                  • Ampere
                  • ARM
                  • ByteDance
                  • Cyberus Technology
                  • Intel
                  • Microsoft
                  • SAP
                  • Tencent Cloud

                  Join our Slack community: Invite

                  Participate in our community activities: Slack channel

                  Check out and participate in our roadmap on +GitHub

                  For full details of our governance model please see our community repository on GitHub and our +founding +charter.

                  For bug reports please use GitHub +isssues; for broader community discussions please use our mailing list

                  Latest news from Cloud Hypervisor project:

                  Cloud Hypervisor v51.0 Released!

                  Posted February 20, 2026 by Cloud Hypervisor Team ‐ 3 min read

                  This release has been tracked in v51.0 group of our roadmap project.

                  Security Fixes

                  This release fixes a security vulnerability in disk image handling. +Details can be found in GHSA-jmr4-g2hv-mjj6.

                  • A new backing_files=on|off option has been added to --disk to +explicitly control whether QCOW2 backing files are permitted. This +defaults to off to prevent the loading of backing files entirely. +(#7685)
                  • Explicit image type specification via the user interface, removing +reliance on format autodetection (#7728).
                  • Prevent sector-zero writes for autodetected raw images (#7728).

                  Significant QCOW2 v3 Improvements

                  A large number of QCOW2 v3 specification features have been implemented:

                  • RAW backing file support for QCOW2 overlays (#7570)
                  • Zero bit in L2 entries (#7627)
                  • Incompatible feature bit validation (#7612)
                  • Dirty bit support (#7636)
                  • Variable refcount widths (1 to 64-bit) (#7633)
                  • Corrupt bit detection and marking (#7639)
                  • Autoclear feature bits handling (#7648)
                  • Thread safety fix for multiple virtio queues (num_queues > 1) +(#7661)
                  • Correct zero-fill for reads beyond backing file size (#7678)
                  • Live disk resize support (#7687)

                  ACPI Generic Initiator Support

                  ACPI Generic Initiator Affinity (SRAT Type 5) support has been added +to associate VFIO-PCI devices with dedicated memory/CPU-less NUMA +nodes. This enables the guest OS to make NUMA-aware memory allocation +decisions for device workloads. A new device_id parameter has been +added to --numa for specifying VFIO devices. (#7626)

                  Block Device DISCARD and WRITE_ZEROES Support

                  The virtio-blk device now supports DISCARD and WRITE_ZEROES +operations for QCOW2 and RAW image formats. This enables thin +provisioning and efficient space reclamation when guests trim +filesystems. A new sparse=on|off option has been added to --disk to +control disk space management: sparse=on (default) enables thin +provisioning with space reclamation, while sparse=off provides thick +provisioning with consistent I/O latency. (#7666)

                  Notable Performance Improvements

                  • Transparent Huge Pages (THP) support has been extended to cover +anonymous shared memory (shared=on) via madvise. Previously, THP +was only used for non-shared memory. (#7646)
                  • The vhost-user-net device now uses the default set of vhost-user +virtio features, including VIRTIO_F_RING_INDIRECT_DESC, which +provides a performance improvement. (#7653)

                  MSHV Support Improvements

                  • Optimize CPU state update after emulation by only updating special +registers when changed (#7603)
                  • Enable SMT for guests with threads_per_core > 1 (#7668)
                  • Stub save_data_tables() to unblock VM pause/resume (#7692)
                  • Handle GHCB_INFO_SPECIAL_DBGPRINT VMG exit in SEV-SNP guest exit +handler (#7703)
                  • Fix CVM boot failure on MSHV (#7548)
                  • Fix CPU topology detection for multithreaded configurations (#7576)

                  Notable Bug Fixes

                  • Fix VFIO device hot-remove leaving group and container file +descriptors open, preventing re-add (#7676)
                  • Fix snapshot restore when backing file is on read-only storage with +shared=false (#7674)
                  • Enforce VIRTIO_BLK_F_RO even if guest does not negotiate it +(#7705)
                  • Fix read-only block device FLUSH requests from OVMF preventing VMs +from booting (#7706)
                  • Fix vhost-user device not properly dropping unowned file descriptors +(#7679)
                  • Fix vhost-user-block get_config interoperability (#7617)
                  • Fix vsock TOCTOU race condition by copying packet header from guest +memory before processing (#7530)
                  • Fix vsock handling of large TX packets spanning multiple data +descriptors (#7680)
                  • Add gettid() to all seccomp filters (#7596)
                  • Fix MAC address parsing that wrongly allowed + instead of hex +characters (#7579)
                  • Improve UUID parse error message and --net fd help text (#7702)
                  • Fix various inconsistencies in our OpenAPI specification file +(#7716, #7726)
                  • Various documentation fixes (#7602, #7606)

                  Contributors

                  Many thanks to everyone who has contributed to our release:

                  Download

                  See the GitHub Release for the release assets.

                  • Copyright © 2021 Cloud Hypervisor a Series of LF Projects, LLC. For website terms of use, trademark policy, privacy policy and other project policies please see https://lfprojects.org/policies. Rendered with Hugo, and Doks
                    + + \ No newline at end of file diff --git a/index.min.6dc0e9f937ea9b89cdcff69d2084925ef0e80b2a93c675db3d7964c1a7b5510554d4d5b74edb299757a9d6480683289266b1b7b79f149de89cdb647a7a233aea.js b/index.min.6dc0e9f937ea9b89cdcff69d2084925ef0e80b2a93c675db3d7964c1a7b5510554d4d5b74edb299757a9d6480683289266b1b7b79f149de89cdb647a7a233aea.js new file mode 100644 index 00000000..ab639bf0 --- /dev/null +++ b/index.min.6dc0e9f937ea9b89cdcff69d2084925ef0e80b2a93c675db3d7964c1a7b5510554d4d5b74edb299757a9d6480683289266b1b7b79f149de89cdb647a7a233aea.js @@ -0,0 +1 @@ +var suggestions=document.getElementById('suggestions'),search=document.getElementById('search');search!==null&&document.addEventListener('keydown',inputFocus);function inputFocus(a){a.ctrlKey&&a.key==='/'&&(a.preventDefault(),search.focus()),a.key==='Escape'&&(search.blur(),suggestions.classList.add('d-none'))}document.addEventListener('click',function(a){var b=suggestions.contains(a.target);b||suggestions.classList.add('d-none')}),document.addEventListener('keydown',suggestionFocus);function suggestionFocus(c){const d=suggestions.classList.contains('d-none');if(d)return;const a=[...suggestions.querySelectorAll('a')];if(a.length===0)return;const b=a.indexOf(document.activeElement);if(c.key==="ArrowUp"){c.preventDefault();const d=b>0?b-1:0;a[d].focus()}else if(c.key==="ArrowDown"){c.preventDefault();const d=b+1a.result)){if(c.has(a.doc.href))continue;c.set(a.doc.href,a.doc)}if(suggestions.innerHTML="",suggestions.classList.remove('d-none'),c.size===0&&b){const a=document.createElement('div');a.innerHTML=`No results for "${b}"`,a.classList.add("suggestion__no-results"),suggestions.appendChild(a);return}for(const[h,g]of c){const b=document.createElement('div');suggestions.appendChild(b);const a=document.createElement('a');a.href=h,b.appendChild(a);const e=document.createElement('span');e.textContent=g.title,e.classList.add("suggestion__title"),a.appendChild(e);const f=document.createElement('span');if(f.textContent=g.description,f.classList.add("suggestion__description"),a.appendChild(f),suggestions.appendChild(b),suggestions.childElementCount==d)break}}})() \ No newline at end of file diff --git a/index.xml b/index.xml new file mode 100644 index 00000000..fcfd5eeb --- /dev/null +++ b/index.xml @@ -0,0 +1 @@ +Run Cloud Virtual Machines Securely and Efficiently onhttps://www.cloudhypervisor.org/Recent content in Run Cloud Virtual Machines Securely and Efficiently onHugo -- gohugo.ioen-USCopyright (c) 2019-2021 Cloud Hypervisor authorsTue, 06 Oct 2020 08:47:36 +0000Bloghttps://www.cloudhypervisor.org/blog/Tue, 06 Oct 2020 08:49:55 +0000https://www.cloudhypervisor.org/blog/Docshttps://www.cloudhypervisor.org/docs/Tue, 06 Oct 2020 08:48:23 +0000https://www.cloudhypervisor.org/docs/ \ No newline at end of file diff --git a/js/bootstrap.min.cce6a176802954e99a4d0f67a9793ff6cbb2da0f463e9d8e211ebb39361791fb3da02b597371bf36367363f6b0956eb01378dcf51c8ceb6d455e4f2060afea14.js b/js/bootstrap.min.cce6a176802954e99a4d0f67a9793ff6cbb2da0f463e9d8e211ebb39361791fb3da02b597371bf36367363f6b0956eb01378dcf51c8ceb6d455e4f2060afea14.js new file mode 100644 index 00000000..1fb09854 --- /dev/null +++ b/js/bootstrap.min.cce6a176802954e99a4d0f67a9793ff6cbb2da0f463e9d8e211ebb39361791fb3da02b597371bf36367363f6b0956eb01378dcf51c8ceb6d455e4f2060afea14.js @@ -0,0 +1 @@ +(()=>{var b=Object.create,a=Object.defineProperty,c=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,e=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty,g=b=>a(b,"__esModule",{value:!0}),h=(b,a)=>function(){return a||(0,b[Object.keys(b)[0]])((a={exports:{}}).exports,a),a.exports},i=(e,b,g)=>{if(b&&typeof b=="object"||typeof b=="function")for(let h of d(b))!f.call(e,h)&&h!=="default"&&a(e,h,{get:()=>b[h],enumerable:!(g=c(b,h))||g.enumerable});return e},j=c=>i(g(a(c!=null?b(e(c)):{},"default",c&&c.__esModule&&"default"in c?{get:()=>c.default,enumerable:!0}:{value:c,enumerable:!0})),c),k=h({"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"(a,b){!function(d,c){typeof a=="object"&&typeof b!="undefined"?b.exports=c():typeof define=="function"&&define.amd?define(c):(d=typeof globalThis!="undefined"?globalThis:d||self).bootstrap=c()}(a,function(){"use strict";var d,e,f,c,af,G,u,E,ba,aw,H,bd,av,at,bg,bh,bi,bj,bk,bl,bD,bn,bo,bp,z,ah,L,bR,aa,bW,bY,aP,cu,cv,az;const A=new Map,bC={set(b,c,d){A.has(b)||A.set(b,new Map);const a=A.get(b);a.has(c)||a.size===0?a.set(c,d):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(a.keys())[0]}.`)},get:(a,b)=>A.has(a)&&A.get(a).get(b)||null,remove(a,c){if(!A.has(a))return;const b=A.get(a);b.delete(c),b.size===0&&A.delete(a)}},bB="transitionend",cW=a=>(a&&window.CSS&&window.CSS.escape&&(a=a.replace(/#([^\s"#']+)/g,(b,a)=>`#${CSS.escape(a)}`)),a),fm=a=>a==null?`${a}`:Object.prototype.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase(),cS=a=>{a.dispatchEvent(new Event(bB))},r=a=>!(!a||typeof a!="object")&&(a.jquery!==void 0&&(a=a[0]),a.nodeType!==void 0),B=a=>r(a)?a.jquery?a[0]:a:typeof a=="string"&&a.length>0?document.querySelector(cW(a)):null,R=a=>{if(!r(a)||a.getClientRects().length===0)return!1;const c=getComputedStyle(a).getPropertyValue("visibility")==="visible",b=a.closest("details:not([open])");if(!b)return c;if(b!==a){const c=a.closest("summary");if(c&&c.parentNode!==b)return!1;if(c===null)return!1}return c},y=a=>!a||a.nodeType!==Node.ELEMENT_NODE||!!a.classList.contains("disabled")||(a.disabled!==void 0?a.disabled:a.hasAttribute("disabled")&&a.getAttribute("disabled")!=="false"),cQ=a=>{if(!document.documentElement.attachShadow)return null;if(typeof a.getRootNode=="function"){const b=a.getRootNode();return b instanceof ShadowRoot?b:null}return a instanceof ShadowRoot?a:a.parentNode?cQ(a.parentNode):null},ao=()=>{},ag=a=>{a.offsetHeight},cP=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,bt=[],i=()=>document.documentElement.dir==="rtl",j=a=>{var b;b=()=>{const b=cP();if(b){const c=a.NAME,d=b.fn[c];b.fn[c]=a.jQueryInterface,b.fn[c].Constructor=a,b.fn[c].noConflict=()=>(b.fn[c]=d,a.jQueryInterface)}},document.readyState==="loading"?(bt.length||document.addEventListener("DOMContentLoaded",()=>{for(const a of bt)a()}),bt.push(b)):b()},g=(a,b=[],c=a)=>typeof a=="function"?a.call(...b):c,cN=(b,a,e=!0)=>{if(!e)return void g(b);const f=(c=>{if(!c)return 0;let{transitionDuration:a,transitionDelay:b}=window.getComputedStyle(c);const d=Number.parseFloat(a),e=Number.parseFloat(b);return d||e?(a=a.split(",")[0],b=b.split(",")[0],1e3*(Number.parseFloat(a)+Number.parseFloat(b))):0})(a)+5;let c=!1;const d=({target:e})=>{e===a&&(c=!0,a.removeEventListener(bB,d),g(b))};a.addEventListener(bB,d),setTimeout(()=>{c||cS(a)},f)},br=(a,f,d,e)=>{const c=a.length;let b=a.indexOf(f);return b===-1?!d&&e?a[c-1]:a[0]:(b+=d?1:-1,e&&(b=(b+c)%c),a[Math.max(0,Math.min(b,c-1))])},fl=/[^.]*(?=\..*)\.|.*/,fk=/\..*/,fb=/::\d+$/,bm={};let cK=1;const cF={mouseenter:"mouseover",mouseleave:"mouseout"},fp=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function cE(b,a){return a&&`${a}::${cK++}`||b.uidEvent||cK++}function cD(b){const a=cE(b);return b.uidEvent=a,bm[a]=bm[a]||{},bm[a]}function cB(a,b,c=null){return Object.values(a).find(a=>a.callable===b&&a.delegationSelector===c)}function cA(b,c,d){const e=typeof c=="string",f=e?d:c||d;let a=cw(b);return fp.has(a)||(a=b),[e,f,a]}function cz(d,g,e,n,l){if(typeof g!="string"||!d)return;let[f,b,i]=cA(g,e,n);if(g in cF){const a=a=>function(b){if(!b.relatedTarget||b.relatedTarget!==b.delegateTarget&&!b.delegateTarget.contains(b.relatedTarget))return a.call(this,b)};b=a(b)}const k=cD(d),j=k[i]||(k[i]={}),h=cB(j,b,f?e:null);if(h)return void(h.oneOff=h.oneOff&&l);const m=cE(b,g.replace(fl,"")),c=f?function(b,c,d){return function f(e){const g=b.querySelectorAll(c);for(let{target:h}=e;h&&h!==this;h=h.parentNode)for(const i of g)if(i===h)return aV(e,{delegateTarget:h}),f.oneOff&&a.off(b,e.type,c,d),d.apply(h,[e])}}(d,e,b):function(b,c){return function e(d){return aV(d,{delegateTarget:b}),e.oneOff&&a.off(b,d.type,c),c.apply(b,[d])}}(d,b);c.delegationSelector=f?e:null,c.callable=b,c.oneOff=l,c.uidEvent=m,j[m]=c,d.addEventListener(i,c,f)}function aZ(e,c,a,f,d){const b=cB(c[a],f,d);b&&(e.removeEventListener(a,b,Boolean(d)),delete c[a][b.uidEvent])}function e_(c,a,b,d){const e=a[b]||{};for(const[g,f]of Object.entries(e))g.includes(d)&&aZ(c,a,b,f.callable,f.delegationSelector)}function cw(a){return a=a.replace(fk,""),cF[a]||a}const a={on(a,b,c,d){cz(a,b,c,d,!1)},one(a,b,c,d){cz(a,b,c,d,!0)},off(b,a,g,j){if(typeof a!="string"||!b)return;const[h,f,d]=cA(a,g,j),i=d!==a,c=cD(b),e=c[d]||{},k=a.startsWith(".");if(f===void 0){if(k)for(const d of Object.keys(c))e_(b,c,d,a.slice(1));for(const[g,f]of Object.entries(e)){const h=g.replace(fb,"");i&&!a.includes(h)||aZ(b,c,d,f.callable,f.delegationSelector)}}else{if(!Object.keys(e).length)return;aZ(b,c,d,f,h?g:null)}},trigger(d,b,i){if(typeof b!="string"||!d)return null;const e=cP();let a=null,f=!0,g=!0,h=!1;b!==cw(b)&&e&&(a=e.Event(b,i),e(d).trigger(a),f=!a.isPropagationStopped(),g=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented());const c=aV(new Event(b,{bubbles:f,cancelable:!0}),i);return h&&c.preventDefault(),g&&d.dispatchEvent(c),c.defaultPrevented&&a&&a.preventDefault(),c}};function aV(a,b={}){for(const[c,d]of Object.entries(b))try{a[c]=d}catch(b){Object.defineProperty(a,c,{configurable:!0,get:()=>d})}return a}function ct(a){if(a==="true")return!0;if(a==="false")return!1;if(a===Number(a).toString())return Number(a);if(a===""||a==="null")return null;if(typeof a!="string")return a;try{return JSON.parse(decodeURIComponent(a))}catch(b){return a}}function aT(a){return a.replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`)}const q={setDataAttribute(a,b,c){a.setAttribute(`data-bs-${aT(b)}`,c)},removeDataAttribute(a,b){a.removeAttribute(`data-bs-${aT(b)}`)},getDataAttributes(a){if(!a)return{};const b={},c=Object.keys(a.dataset).filter(a=>a.startsWith("bs")&&!a.startsWith("bsConfig"));for(const e of c){let d=e.replace(/^bs/,"");d=d.charAt(0).toLowerCase()+d.slice(1),b[d]=ct(a.dataset[e])}return b},getDataAttribute:(a,b)=>ct(a.getAttribute(`data-bs-${aT(b)}`))};class ad{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(a){return a=this._mergeConfigObj(a),a=this._configAfterMerge(a),this._typeCheckConfig(a),a}_configAfterMerge(a){return a}_mergeConfigObj(b,a){const c=r(a)?q.getDataAttribute(a,"config"):{};return{...this.constructor.Default,...typeof c=="object"?c:{},...r(a)?q.getDataAttributes(a):{},...typeof b=="object"?b:{}}}_typeCheckConfig(a,b=this.constructor.DefaultType){for(const[c,d]of Object.entries(b)){const e=a[c],f=r(e)?"element":fm(e);if(!new RegExp(d).test(f))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${c}" provided type "${f}" but expected type "${d}".`)}}}class m extends ad{constructor(a,b){super(),(a=B(a))&&(this._element=a,this._config=this._getConfig(b),bC.set(this._element,this.constructor.DATA_KEY,this))}dispose(){bC.remove(this._element,this.constructor.DATA_KEY),a.off(this._element,this.constructor.EVENT_KEY);for(const a of Object.getOwnPropertyNames(this))this[a]=null}_queueCallback(a,b,c=!0){cN(a,b,c)}_getConfig(a){return a=this._mergeConfigObj(a,this._element),a=this._configAfterMerge(a),this._typeCheckConfig(a),a}static getInstance(a){return bC.get(B(a),this.DATA_KEY)}static getOrCreateInstance(a,b={}){return this.getInstance(a)||new this(a,typeof b=="object"?b:null)}static get VERSION(){return"5.3.8"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(a){return`${a}${this.EVENT_KEY}`}}const aJ=b=>{let a=b.getAttribute("data-bs-target");if(!a||a==="#"){let c=b.getAttribute("href");if(!c||!c.includes("#")&&!c.startsWith("."))return null;c.includes("#")&&!c.startsWith("#")&&(c=`#${c.split("#")[1]}`),a=c&&c!=="#"?c.trim():null}return a?a.split(",").map(a=>cW(a)).join(","):null},b={find:(a,b=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(b,a)),findOne:(a,b=document.documentElement)=>Element.prototype.querySelector.call(b,a),children:(a,b)=>[].concat(...a.children).filter(a=>a.matches(b)),parents(d,b){const c=[];let a=d.parentNode.closest(b);for(;a;)c.push(a),a=a.parentNode.closest(b);return c},prev(b,c){let a=b.previousElementSibling;for(;a;){if(a.matches(c))return[a];a=a.previousElementSibling}return[]},next(b,c){let a=b.nextElementSibling;for(;a;){if(a.matches(c))return[a];a=a.nextElementSibling}return[]},focusableChildren(a){const b=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(a=>`${a}:not([tabindex^="-"])`).join(",");return this.find(b,a).filter(a=>!y(a)&&R(a))},getSelectorFromElement(c){const a=aJ(c);return a&&b.findOne(a)?a:null},getElementFromSelector(c){const a=aJ(c);return a?b.findOne(a):null},getMultipleElementsFromSelector(c){const a=aJ(c);return a?b.find(a):[]}},aC=(c,e="hide")=>{const f=`click.dismiss${c.EVENT_KEY}`,d=c.NAME;a.on(document,f,`[data-bs-dismiss="${d}"]`,function(a){if(["A","AREA"].includes(this.tagName)&&a.preventDefault(),y(this))return;const f=b.getElementFromSelector(this)||this.closest(`.${d}`);c.getOrCreateInstance(f)[e]()})},cr=".bs.alert",eZ=`close${cr}`,eY=`closed${cr}`;class ak extends m{static get NAME(){return"alert"}close(){if(a.trigger(this._element,eZ).defaultPrevented)return;this._element.classList.remove("show");const b=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,b)}_destroyElement(){this._element.remove(),a.trigger(this._element,eY),this.dispose()}static jQueryInterface(a){return this.each(function(){const b=ak.getOrCreateInstance(this);if(typeof a=="string"){if(b[a]===void 0||a.startsWith("_")||a==="constructor")throw new TypeError(`No method named "${a}"`);b[a](this)}})}}aC(ak,"close"),j(ak);const ci='[data-bs-toggle="button"]';class aE extends m{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(a){return this.each(function(){const b=aE.getOrCreateInstance(this);a==="toggle"&&b[a]()})}}a.on(document,"click.bs.button.data-api",ci,a=>{a.preventDefault();const b=a.target.closest(ci);aE.getOrCreateInstance(b).toggle()}),j(aE);const X=".bs.swipe",eX=`touchstart${X}`,eW=`touchmove${X}`,eV=`touchend${X}`,eU=`pointerdown${X}`,eT=`pointerup${X}`,eS={endCallback:null,leftCallback:null,rightCallback:null},eR={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class by extends ad{constructor(a,b){super(),this._element=a,a&&by.isSupported()&&(this._config=this._getConfig(b),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return eS}static get DefaultType(){return eR}static get NAME(){return"swipe"}dispose(){a.off(this._element,X)}_start(a){this._supportPointerEvents?this._eventIsPointerPenTouch(a)&&(this._deltaX=a.clientX):this._deltaX=a.touches[0].clientX}_end(a){this._eventIsPointerPenTouch(a)&&(this._deltaX=a.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(a){this._deltaX=a.touches&&a.touches.length>1?0:a.touches[0].clientX-this._deltaX}_handleSwipe(){const a=Math.abs(this._deltaX);if(a<=40)return;const b=a/this._deltaX;this._deltaX=0,b&&g(b>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(a.on(this._element,eU,a=>this._start(a)),a.on(this._element,eT,a=>this._end(a)),this._element.classList.add("pointer-event")):(a.on(this._element,eX,a=>this._start(a)),a.on(this._element,eW,a=>this._move(a)),a.on(this._element,eV,a=>this._end(a)))}_eventIsPointerPenTouch(a){return this._supportPointerEvents&&(a.pointerType==="pen"||a.pointerType==="touch")}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const C=".bs.carousel",b$=".data-api",eP="ArrowLeft",eG="ArrowRight",_="next",S="prev",N="left",an="right",eF=`slide${C}`,bs=`slid${C}`,eB=`keydown${C}`,eA=`mouseenter${C}`,ez=`mouseleave${C}`,ex=`dragstart${C}`,ev=`load${C}${b$}`,eu=`click${C}${b$}`,bV="carousel",ay="active",bU=".active",bT=".carousel-item",ep=bU+bT,el={[eP]:an,[eG]:N},ek={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ej={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Z extends m{constructor(a,c){super(a,c),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=b.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===bV&&this.cycle()}static get Default(){return ek}static get DefaultType(){return ej}static get NAME(){return"carousel"}next(){this._slide(_)}nextWhenVisible(){!document.hidden&&R(this._element)&&this.next()}prev(){this._slide(S)}pause(){this._isSliding&&cS(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?a.one(this._element,bs,()=>this.cycle()):this.cycle())}to(b){const c=this._getItems();if(b>c.length-1||b<0)return;if(this._isSliding)return void a.one(this._element,bs,()=>this.to(b));const d=this._getItemIndex(this._getActive());if(d===b)return;const e=b>d?_:S;this._slide(e,c[b])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(a){return a.defaultInterval=a.interval,a}_addEventListeners(){this._config.keyboard&&a.on(this._element,eB,a=>this._keydown(a)),this._config.pause==="hover"&&(a.on(this._element,eA,()=>this.pause()),a.on(this._element,ez,()=>this._maybeEnableCycle())),this._config.touch&&by.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const c of b.find(".carousel-item img",this._element))a.on(c,ex,a=>a.preventDefault());const c={leftCallback:()=>this._slide(this._directionToOrder(N)),rightCallback:()=>this._slide(this._directionToOrder(an)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new by(this._element,c)}_keydown(a){if(/input|textarea/i.test(a.target.tagName))return;const b=el[a.key];b&&(a.preventDefault(),this._slide(this._directionToOrder(b)))}_getItemIndex(a){return this._getItems().indexOf(a)}_setActiveIndicatorElement(d){if(!this._indicatorsElement)return;const c=b.findOne(bU,this._indicatorsElement);c.classList.remove(ay),c.removeAttribute("aria-current");const a=b.findOne(`[data-bs-slide-to="${d}"]`,this._indicatorsElement);a&&(a.classList.add(ay),a.setAttribute("aria-current","true"))}_updateInterval(){const a=this._activeElement||this._getActive();if(!a)return;const b=Number.parseInt(a.getAttribute("data-bs-interval"),10);this._config.interval=b||this._config.defaultInterval}_slide(g,j=null){if(this._isSliding)return;const c=this._getActive(),e=g===_,b=j||br(this._getItems(),c,e,this._config.wrap);if(b===c)return;const h=this._getItemIndex(b),i=d=>a.trigger(this._element,d,{relatedTarget:b,direction:this._orderToDirection(g),from:this._getItemIndex(c),to:h});if(i(eF).defaultPrevented)return;if(!c||!b)return;const k=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(h),this._activeElement=b;const d=e?"carousel-item-start":"carousel-item-end",f=e?"carousel-item-next":"carousel-item-prev";b.classList.add(f),ag(b),c.classList.add(d),b.classList.add(d),this._queueCallback(()=>{b.classList.remove(d,f),b.classList.add(ay),c.classList.remove(ay,f,d),this._isSliding=!1,i(bs)},c,this._isAnimated()),k&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return b.findOne(ep,this._element)}_getItems(){return b.find(bT,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(a){return i()?a===N?S:_:a===N?_:S}_orderToDirection(a){return i()?a===S?N:an:a===S?an:N}static jQueryInterface(a){return this.each(function(){const b=Z.getOrCreateInstance(this,a);if(typeof a!="number"){if(typeof a=="string"){if(b[a]===void 0||a.startsWith("_")||a==="constructor")throw new TypeError(`No method named "${a}"`);b[a]()}}else b.to(a)})}}a.on(document,eu,"[data-bs-slide], [data-bs-slide-to]",function(e){const c=b.getElementFromSelector(this);if(!c||!c.classList.contains(bV))return;e.preventDefault();const a=Z.getOrCreateInstance(c),d=this.getAttribute("data-bs-slide-to");return d?(a.to(d),void a._maybeEnableCycle()):q.getDataAttribute(this,"slide")==="next"?(a.next(),void a._maybeEnableCycle()):(a.prev(),void a._maybeEnableCycle())}),a.on(window,ev,()=>{const a=b.find('[data-bs-ride="carousel"]');for(const b of a)Z.getOrCreateInstance(b)}),j(Z);const aj=".bs.collapse",ei=`show${aj}`,eh=`shown${aj}`,ef=`hide${aj}`,ee=`hidden${aj}`,dX=`click${aj}.data-api`,aM="show",U="collapse",aD="collapsing",dW=`:scope .${U} .${U}`,aQ='[data-bs-toggle="collapse"]',dQ={parent:null,toggle:!0},dP={parent:"(null|element)",toggle:"boolean"};class ae extends m{constructor(a,c){super(a,c),this._isTransitioning=!1,this._triggerArray=[];const d=b.find(aQ);for(const a of d){const c=b.getSelectorFromElement(a),e=b.find(c).filter(a=>a===this._element);c!==null&&e.length&&this._triggerArray.push(a)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return dQ}static get DefaultType(){return dP}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let c=[];if(this._config.parent&&(c=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter(a=>a!==this._element).map(a=>ae.getOrCreateInstance(a,{toggle:!1}))),c.length&&c[0]._isTransitioning)return;if(a.trigger(this._element,ei).defaultPrevented)return;for(const a of c)a.hide();const b=this._getDimension();this._element.classList.remove(U),this._element.classList.add(aD),this._element.style[b]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const d=`scroll${b[0].toUpperCase()+b.slice(1)}`;this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(aD),this._element.classList.add(U,aM),this._element.style[b]="",a.trigger(this._element,eh)},this._element,!0),this._element.style[b]=`${this._element[d]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(a.trigger(this._element,ef).defaultPrevented)return;const c=this._getDimension();this._element.style[c]=`${this._element.getBoundingClientRect()[c]}px`,ag(this._element),this._element.classList.add(aD),this._element.classList.remove(U,aM);for(const a of this._triggerArray){const c=b.getElementFromSelector(a);c&&!this._isShown(c)&&this._addAriaAndCollapsedClass([a],!1)}this._isTransitioning=!0,this._element.style[c]="",this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(aD),this._element.classList.add(U),a.trigger(this._element,ee)},this._element,!0)}_isShown(a=this._element){return a.classList.contains(aM)}_configAfterMerge(a){return a.toggle=Boolean(a.toggle),a.parent=B(a.parent),a}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const a=this._getFirstLevelChildren(aQ);for(const c of a){const d=b.getElementFromSelector(c);d&&this._addAriaAndCollapsedClass([c],this._isShown(d))}}_getFirstLevelChildren(a){const c=b.find(dW,this._config.parent);return b.find(a,this._config.parent).filter(a=>!c.includes(a))}_addAriaAndCollapsedClass(a,b){if(a.length)for(const c of a)c.classList.toggle("collapsed",!b),c.setAttribute("aria-expanded",b)}static jQueryInterface(a){const b={};return typeof a=="string"&&/show|hide/.test(a)&&(b.toggle=!1),this.each(function(){const c=ae.getOrCreateInstance(this,b);if(typeof a=="string"){if(c[a]===void 0)throw new TypeError(`No method named "${a}"`);c[a]()}})}}a.on(document,dX,aQ,function(a){(a.target.tagName==="A"||a.delegateTarget&&a.delegateTarget.tagName==="A")&&a.preventDefault();for(const a of b.getMultipleElementsFromSelector(this))ae.getOrCreateInstance(a,{toggle:!1}).toggle()}),j(ae),d="top",e="bottom",f="right",c="left",af="auto",G=[d,e,f,c],u="start",E="end",ba="clippingParents",aw="viewport",H="popper",bd="reference",av=G.reduce(function(b,a){return b.concat([a+"-"+u,a+"-"+E])},[]),at=[].concat(G,[af]).reduce(function(b,a){return b.concat([a,a+"-"+u,a+"-"+E])},[]),bg="beforeRead",bh="read",bi="afterRead",bj="beforeMain",bk="main",bl="afterMain",bD="beforeWrite",bn="write",bo="afterWrite",bp=[bg,bh,bi,bj,bk,bl,bD,bn,bo];function o(a){return a?(a.nodeName||"").toLowerCase():null}function h(a){if(a==null)return window;if(a.toString()!=="[object Window]"){var b=a.ownerDocument;return b&&b.defaultView||window}return a}function J(a){return a instanceof h(a).Element||a instanceof Element}function k(a){return a instanceof h(a).HTMLElement||a instanceof HTMLElement}function bu(a){return typeof ShadowRoot!="undefined"&&(a instanceof h(a).ShadowRoot||a instanceof ShadowRoot)}const bv={name:"applyStyles",enabled:!0,phase:"write",fn:function(b){var a=b.state;Object.keys(a.elements).forEach(function(c){var e=a.styles[c]||{},d=a.attributes[c]||{},b=a.elements[c];k(b)&&o(b)&&(Object.assign(b.style,e),Object.keys(d).forEach(function(a){var c=d[a];c===!1?b.removeAttribute(a):b.setAttribute(a,c===!0?"":c)}))})},effect:function(c){var a=c.state,b={popper:{position:a.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(a.elements.popper.style,b.popper),a.styles=b,a.elements.arrow&&Object.assign(a.elements.arrow.style,b.arrow),function(){Object.keys(a.elements).forEach(function(c){var d=a.elements[c],e=a.attributes[c]||{},f=Object.keys(a.styles.hasOwnProperty(c)?a.styles[c]:b[c]).reduce(function(a,b){return a[b]="",a},{});k(d)&&o(d)&&(Object.assign(d.style,f),Object.keys(e).forEach(function(a){d.removeAttribute(a)}))})}},requires:["computeStyles"]};function n(a){return a.split("-")[0]}z=Math.max,ah=Math.min,L=Math.round;function bA(){var a=navigator.userAgentData;return a!=null&&a.brands&&Array.isArray(a.brands)?a.brands.map(function(a){return a.brand+"/"+a.version}).join(" "):navigator.userAgent}function bH(){return!/^((?!chrome|android).)*safari/i.test(bA())}function T(a,i,l){var b,e,f,c,j,d,g,m,n;return i===void 0&&(i=!1),l===void 0&&(l=!1),b=a.getBoundingClientRect(),e=1,f=1,i&&k(a)&&(e=a.offsetWidth>0&&L(b.width)/a.offsetWidth||1,f=a.offsetHeight>0&&L(b.height)/a.offsetHeight||1),c=(J(a)?h(a):window).visualViewport,j=!bH()&&l,d=(b.left+(j&&c?c.offsetLeft:0))/e,g=(b.top+(j&&c?c.offsetTop:0))/f,m=b.width/e,n=b.height/f,{width:m,height:n,top:g,right:d+m,bottom:g+n,left:d,x:d,y:g}}function aX(a){var b=T(a),c=a.offsetWidth,d=a.offsetHeight;return Math.abs(b.width-c)<=1&&(c=b.width),Math.abs(b.height-d)<=1&&(d=b.height),{x:a.offsetLeft,y:a.offsetTop,width:c,height:d}}function bF(c,b){var d=b.getRootNode&&b.getRootNode(),a;if(c.contains(b))return!0;if(d&&bu(d)){a=b;do{if(a&&c.isSameNode(a))return!0;a=a.parentNode||a.host}while(a)}return!1}function t(a){return h(a).getComputedStyle(a)}function dL(a){return["table","td","th"].indexOf(o(a))>=0}function x(a){return((J(a)?a.ownerDocument:a.document)||window.document).documentElement}function aB(a){return o(a)==="html"?a:a.assignedSlot||a.parentNode||(bu(a)?a.host:null)||x(a)}function bJ(a){return k(a)&&t(a).position!=="fixed"?a.offsetParent:null}function ab(b){for(var c=h(b),a=bJ(b);a&&dL(a)&&t(a).position==="static";)a=bJ(a);return a&&(o(a)==="html"||o(a)==="body"&&t(a).position==="static")?c:a||function(c){var d=/firefox/i.test(bA()),a,b;if(/Trident/i.test(bA())&&k(c)&&t(c).position==="fixed")return null;a=aB(c);for(bu(a)&&(a=a.host);k(a)&&["html","body"].indexOf(o(a))<0;){if(b=t(a),b.transform!=="none"||b.perspective!=="none"||b.contain==="paint"||["transform","perspective"].indexOf(b.willChange)!==-1||d&&b.willChange==="filter"||d&&b.filter&&b.filter!=="none")return a;a=a.parentNode}return null}(b)||c}function aL(a){return["top","bottom"].indexOf(a)>=0?"x":"y"}function $(a,b,c){return z(a,ah(b,c))}function bN(a){return Object.assign({},{top:0,right:0,bottom:0,left:0},a)}function bO(a,b){return b.reduce(function(b,c){return b[c]=a,b},{})}const bP={name:"arrow",enabled:!0,phase:"main",fn:function(i){var h,a=i.state,B=i.name,A=i.options,j=a.elements.arrow,k=a.modifiersData.popperOffsets,m=n(a.placement),b=aL(m),g=[c,f].indexOf(m)>=0?"height":"width",p,q,t,w,v,u,l,s,x,y,z,o,r,C;j&&k&&(p=function(a,b){return bN(typeof(a=typeof a=="function"?a(Object.assign({},b.rects,{placement:b.placement})):a)!="number"?a:bO(a,G))}(A.padding,a),q=aX(j),t=b==="y"?d:c,w=b==="y"?e:f,v=a.rects.reference[g]+a.rects.reference[b]-k[b]-a.rects.popper[g],u=k[b]-a.rects.reference[b],l=ab(j),s=l?b==="y"?l.clientHeight||0:l.clientWidth||0:0,x=v/2-u/2,y=p[t],z=s-q[g]-p[w],o=s/2-q[g]/2+x,r=$(y,o,z),C=b,a.modifiersData[B]=((h={})[C]=r,h.centerOffset=r-o,h))},effect:function(c){var b=c.state,d=c.options.element,a=d===void 0?"[data-popper-arrow]":d;a!=null&&(typeof a!="string"||(a=b.elements.popper.querySelector(a)))&&bF(b.elements.popper,a)&&(b.elements.arrow=a)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Y(a){return a.split("-")[1]}bR={top:"auto",right:"auto",bottom:"auto",left:"auto"};function bS(g){var n,o=g.popper,H=g.popperRect,j=g.placement,D=g.variation,m=g.offsets,C=g.position,p=g.gpuAcceleration,B=g.adaptive,r=g.roundOffsets,A=g.isFixed,v=m.x,a=v===void 0?0:v,u=m.y,b=u===void 0?0:u,w=typeof r=="function"?r({x:a,y:b}):{x:a,y:b},y,z,s,q,i,k,F,G,l,I,J;return a=w.x,b=w.y,y=m.hasOwnProperty("x"),z=m.hasOwnProperty("y"),s=c,q=d,i=window,B&&(k=ab(o),F="clientHeight",G="clientWidth",k===h(o)&&t(k=x(o)).position!=="static"&&C==="absolute"&&(F="scrollHeight",G="scrollWidth"),(j===d||(j===c||j===f)&&D===E)&&(q=e,b-=(A&&k===i&&i.visualViewport?i.visualViewport.height:k[F])-H.height,b*=p?1:-1),j!==c&&(j!==d&&j!==e||D!==E)||(s=f,a-=(A&&k===i&&i.visualViewport?i.visualViewport.width:k[G])-H.width,a*=p?1:-1)),I=Object.assign({position:C},B&&bR),J=r===!0?function(b,c){var d=b.x,e=b.y,a=c.devicePixelRatio||1;return{x:L(d*a)/a||0,y:L(e*a)/a||0}}({x:a,y:b},h(o)):{x:a,y:b},a=J.x,b=J.y,p?Object.assign({},I,((l={})[q]=z?"0":"",l[s]=y?"0":"",l.transform=(i.devicePixelRatio||1)<=1?"translate("+a+"px, "+b+"px)":"translate3d("+a+"px, "+b+"px, 0)",l)):Object.assign({},I,((n={})[q]=z?b+"px":"",n[s]=y?a+"px":"",n.transform="",n))}const aU={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(c){var a=c.state,b=c.options,d=b.gpuAcceleration,i=d===void 0||d,e=b.adaptive,j=e===void 0||e,f=b.roundOffsets,g=f===void 0||f,h={placement:n(a.placement),variation:Y(a.placement),popper:a.elements.popper,popperRect:a.rects.popper,gpuAcceleration:i,isFixed:a.options.strategy==="fixed"};a.modifiersData.popperOffsets!=null&&(a.styles.popper=Object.assign({},a.styles.popper,bS(Object.assign({},h,{offsets:a.modifiersData.popperOffsets,position:a.options.strategy,adaptive:j,roundOffsets:g})))),a.modifiersData.arrow!=null&&(a.styles.arrow=Object.assign({},a.styles.arrow,bS(Object.assign({},h,{offsets:a.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:g})))),a.attributes.popper=Object.assign({},a.attributes.popper,{"data-popper-placement":a.placement})},data:{}};aa={passive:!0};const a$={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(b){var c=b.state,a=b.instance,d=b.options,e=d.scroll,f=e===void 0||e,g=d.resize,i=g===void 0||g,j=h(c.elements.popper),k=[].concat(c.scrollParents.reference,c.scrollParents.popper);return f&&k.forEach(function(b){b.addEventListener("scroll",a.update,aa)}),i&&j.addEventListener("resize",a.update,aa),function(){f&&k.forEach(function(b){b.removeEventListener("scroll",a.update,aa)}),i&&j.removeEventListener("resize",a.update,aa)}},data:{}};bW={left:"right",right:"left",bottom:"top",top:"bottom"};function au(a){return a.replace(/left|right|bottom|top/g,function(a){return bW[a]})}bY={start:"end",end:"start"};function bZ(a){return a.replace(/start|end/g,function(a){return bY[a]})}function aH(b){var a=h(b);return{scrollLeft:a.pageXOffset,scrollTop:a.pageYOffset}}function bz(a){return T(x(a)).left+aH(a).scrollLeft}function bw(b){var a=t(b),c=a.overflow,d=a.overflowX,e=a.overflowY;return/auto|scroll|overlay|hidden/.test(c+e+d)}function cb(a){return["html","body","#document"].indexOf(o(a))>=0?a.ownerDocument.body:k(a)&&bw(a)?a:cb(aB(a))}function ac(c,b){var d,a,e,f,g,i;return b===void 0&&(b=[]),a=cb(c),e=a===((d=c.ownerDocument)==null?void 0:d.body),f=h(a),g=e?[f].concat(f.visualViewport||[],bw(a)?a:[]):a,i=b.concat(g),e?i:i.concat(ac(aB(g)))}function aW(a){return Object.assign({},a,{left:a.x,top:a.y,right:a.x+a.width,bottom:a.y+a.height})}function ce(b,a,c){return a===aw?aW(function(b,j){var k=h(b),e=x(b),a=k.visualViewport,f=e.clientWidth,g=e.clientHeight,c=0,d=0,i;return a&&(f=a.width,g=a.height,i=bH(),(i||!i&&j==="fixed")&&(c=a.offsetLeft,d=a.offsetTop)),{width:f,height:g,x:c+bz(b),y:d}}(b,c)):J(a)?function(b,c){var a=T(b,!1,c==="fixed");return a.top=a.top+b.clientTop,a.left=a.left+b.clientLeft,a.bottom=a.top+b.clientHeight,a.right=a.left+b.clientWidth,a.width=b.clientWidth,a.height=b.clientHeight,a.x=a.left,a.y=a.top,a}(a,c):aW(function(c){var d,b=x(c),e=aH(c),a=(d=c.ownerDocument)==null?void 0:d.body,f=z(b.scrollWidth,b.clientWidth,a?a.scrollWidth:0,a?a.clientWidth:0),h=z(b.scrollHeight,b.clientHeight,a?a.scrollHeight:0,a?a.clientHeight:0),g=-e.scrollLeft+bz(c),i=-e.scrollTop;return t(a||b).direction==="rtl"&&(g+=z(b.clientWidth,a?a.clientWidth:0)-f),{width:f,height:h,x:g,y:i}}(x(b)))}function cf(k){var b,a=k.reference,g=k.element,i=k.placement,l=i?n(i):null,p=i?Y(i):null,m=a.x+a.width/2-g.width/2,o=a.y+a.height/2-g.height/2,h,j;switch(l){case d:b={x:m,y:a.y-g.height};break;case e:b={x:m,y:a.y+a.height};break;case f:b={x:a.x+a.width,y:o};break;case c:b={x:a.x-g.width,y:o};break;default:b={x:a.x,y:a.y}}if(h=l?aL(l):null,h!=null)switch(j=h==="y"?"height":"width",p){case u:b[h]=b[h]-(a[j]/2-g[j]/2);break;case E:b[h]=b[h]+(a[j]/2-g[j]/2)}return b}function W(b,y){var a,u,r,p,M,w,L,s,K,q,h,n,D,v,l,g,E,B,j,i,A,F,I,c,m,C,N;return y===void 0&&(y={}),a=y,u=a.placement,r=u===void 0?b.placement:u,p=a.strategy,M=p===void 0?b.strategy:p,w=a.boundary,L=w===void 0?ba:w,s=a.rootBoundary,K=s===void 0?aw:s,q=a.elementContext,h=q===void 0?H:q,n=a.altBoundary,D=n!==void 0&&n,v=a.padding,l=v===void 0?0:v,g=bN(typeof l!="number"?l:bO(l,G)),E=h===H?bd:H,B=b.rects.popper,j=b.elements[D?E:h],i=function(b,e,f,c){var g=e==="clippingParents"?function(a){var c=ac(aB(a)),b=["absolute","fixed"].indexOf(t(a).position)>=0&&k(a)?ab(a):a;return J(b)?c.filter(function(a){return J(a)&&bF(a,b)&&o(a)!=="body"}):[]}(b):[].concat(e),d=[].concat(g,[f]),h=d[0],a=d.reduce(function(a,e){var d=ce(b,e,c);return a.top=z(d.top,a.top),a.right=ah(d.right,a.right),a.bottom=ah(d.bottom,a.bottom),a.left=z(d.left,a.left),a},ce(b,h,c));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(J(j)?j:j.contextElement||x(b.elements.popper),L,K,M),A=T(b.elements.reference),F=cf({reference:A,element:B,placement:r}),I=aW(Object.assign({},B,F)),c=h===H?I:A,m={top:i.top-c.top+g.top,bottom:c.bottom-i.bottom+g.bottom,left:i.left-c.left+g.left,right:c.right-i.right+g.right},C=b.modifiersData.offset,h===H&&C&&(N=C[r],Object.keys(m).forEach(function(a){var b=[f,e].indexOf(a)>=0?1:-1,c=[d,e].indexOf(a)>=0?"y":"x";m[a]+=N[c]*b})),m}function dK(o,d){var a,m,l,k,i,h,g,j,f,e,c,b;return d===void 0&&(d={}),a=d,m=a.placement,l=a.boundary,k=a.rootBoundary,i=a.padding,h=a.flipVariations,g=a.allowedAutoPlacements,j=g===void 0?at:g,f=Y(m),e=f?h?av:av.filter(function(a){return Y(a)===f}):G,c=e.filter(function(a){return j.indexOf(a)>=0}),c.length===0&&(c=e),b=c.reduce(function(b,a){return b[a]=W(o,{placement:a,boundary:l,rootBoundary:k,padding:i})[n(a)],b},{}),Object.keys(b).sort(function(a,c){return b[a]-b[c]})}const da={name:"flip",enabled:!0,phase:"main",fn:function(p){var a=p.state,b=p.options,t=p.name,v,L,s,G,H,z,y,w,O,F,m,M,h,K,Q,l,J,I,C,D,k,o,g,E,B,A,x,q,j,N,i,P,r;if(!a.modifiersData[t]._skip){for(v=b.mainAxis,L=v===void 0||v,s=b.altAxis,G=s===void 0||s,H=b.fallbackPlacements,z=b.padding,y=b.boundary,w=b.rootBoundary,O=b.altBoundary,F=b.flipVariations,m=F===void 0||F,M=b.allowedAutoPlacements,h=a.options.placement,K=n(h),Q=H||(K!==h&&m?function(a){if(n(a)===af)return[];var b=au(a);return[bZ(a),b,bZ(b)]}(h):[au(h)]),l=[h].concat(Q).reduce(function(c,b){return c.concat(n(b)===af?dK(a,{placement:b,boundary:y,rootBoundary:w,padding:z,flipVariations:m,allowedAutoPlacements:M}):b)},[]),J=a.rects.reference,I=a.rects.popper,C=new Map,D=!0,k=l[0],o=0;o=0,x=A?"width":"height",q=W(a,{placement:g,boundary:y,rootBoundary:w,altBoundary:O,padding:z}),j=A?B?f:c:B?e:d,J[x]>I[x]&&(j=au(j)),N=au(j),i=[],L&&i.push(q[E]<=0),G&&i.push(q[j]<=0,q[N]<=0),i.every(function(a){return a})){k=g,D=!1;break}C.set(g,i)}if(D)for(P=function(b){var a=l.find(function(c){var a=C.get(c);if(a)return a.slice(0,b).every(function(a){return a})});if(a)return k=a,"break"},r=m?3:1;r>0&&P(r)!=="break";r--);a.placement!==k&&(a.modifiersData[t]._skip=!0,a.placement=k,a.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function cj(b,c,a){return a===void 0&&(a={x:0,y:0}),{top:b.top-c.height-a.y,right:b.right-c.width+a.x,bottom:b.bottom-c.height+a.y,left:b.left-c.width-a.x}}function ck(a){return[d,f,e,c].some(function(b){return a[b]>=0})}const cl={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(b){var a=b.state,i=b.name,j=a.rects.reference,k=a.rects.popper,l=a.modifiersData.preventOverflow,g=W(a,{elementContext:"reference"}),h=W(a,{altBoundary:!0}),c=cj(g,j),d=cj(h,k,l),e=ck(c),f=ck(d);a.modifiersData[i]={referenceClippingOffsets:c,popperEscapeOffsets:d,isReferenceHidden:e,hasPopperEscaped:f},a.attributes.popper=Object.assign({},a.attributes.popper,{"data-popper-reference-hidden":e,"data-popper-escaped":f})}},cm={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(b){var a=b.state,i=b.options,j=b.name,e=i.offset,k=e===void 0?[0,0]:e,g=at.reduce(function(b,e){return b[e]=function(i,k,e){var g=n(i),j=[c,d].indexOf(g)>=0?-1:1,h=typeof e=="function"?e(Object.assign({},k,{placement:i})):e,a=h[0],b=h[1];return a=a||0,b=(b||0)*j,[c,f].indexOf(g)>=0?{x:b,y:a}:{x:a,y:b}}(e,a.rects,k),b},{}),h=g[a.placement],l=h.x,m=h.y;a.modifiersData.popperOffsets!=null&&(a.modifiersData.popperOffsets.x+=l,a.modifiersData.popperOffsets.y+=m),a.modifiersData[j]=g}},aN={name:"popperOffsets",enabled:!0,phase:"read",fn:function(b){var a=b.state,c=b.name;a.modifiersData[c]=cf({reference:a.rects.reference,element:a.rects.popper,placement:a.placement})},data:{}},co={name:"preventOverflow",enabled:!0,phase:"main",fn:function(C){var a=C.state,h=C.options,ar=C.name,V=h.mainAxis,an=V===void 0||V,aa=h.altAxis,aq=aa!==void 0&&aa,av=h.boundary,at=h.rootBoundary,au=h.altBoundary,aw=h.padding,H=h.tether,j=H===void 0||H,G=h.tetherOffset,x=G===void 0?0:G,s=W(a,{boundary:av,rootBoundary:at,padding:aw,altBoundary:au}),O=n(a.placement),y=Y(a.placement),I=!y,b=aL(O),q=b==="x"?"y":"x",o=a.modifiersData.popperOffsets,k=a.rects.reference,p=a.rects.popper,t=typeof x=="function"?x(Object.assign({},a.rects,{placement:a.placement})):x,l=typeof t=="number"?{mainAxis:t,altAxis:t}:Object.assign({mainAxis:0,altAxis:0},t),r=a.modifiersData.offset?a.modifiersData.offset[a.placement]:null,B={x:0,y:0},K,L,M,g,m,P,Q,R,ap,af,U,ao,X,Z,T,v,ak,aj,D,ag,E,ai,ad,ac,al,am,i,w,S,_,A,N,J,F,ae;o&&(an&&(L=b==="y"?d:c,M=b==="y"?e:f,g=b==="y"?"height":"width",m=o[b],P=m+s[L],Q=m-s[M],R=j?-p[g]/2:0,ap=y===u?k[g]:p[g],af=y===u?-p[g]:-k[g],U=a.elements.arrow,ao=j&&U?aX(U):{width:0,height:0},X=a.modifiersData["arrow#persistent"]?a.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},Z=X[L],T=X[M],v=$(0,k[g],ao[g]),ak=I?k[g]/2-R-v-Z-l.mainAxis:ap-v-Z-l.mainAxis,aj=I?-k[g]/2+R+v+T+l.mainAxis:af+v+T+l.mainAxis,D=a.elements.arrow&&ab(a.elements.arrow),ag=D?b==="y"?D.clientTop||0:D.clientLeft||0:0,E=(K=r==null?void 0:r[b])!=null?K:0,ai=m+aj-E,ad=$(j?ah(P,m+ak-E-ag):P,m,j?z(Q,ai):Q),o[b]=ad,B[b]=ad-m),aq&&(al=b==="x"?d:c,am=b==="x"?e:f,i=o[q],w=q==="y"?"height":"width",S=i+s[al],_=i-s[am],A=[d,c].indexOf(O)!==-1,N=(ac=r==null?void 0:r[q])!=null?ac:0,J=A?S:i-k[w]-p[w]-N+l.altAxis,F=A?i+k[w]+p[w]-N-l.altAxis:_,ae=j&&A?function(c,d,a){var b=$(c,d,a);return b>a?a:b}(J,i,F):$(j?J:S,i,j?F:_),o[q]=ae,B[q]=ae-i),a.modifiersData[ar]=B)},requiresIfExists:["offset"]};function dJ(l,a,d){d===void 0&&(d=!1);var b,j,i=k(a),m=k(a)&&function(a){var b=a.getBoundingClientRect(),c=L(b.width)/a.offsetWidth||1,d=L(b.height)/a.offsetHeight||1;return c!==1||d!==1}(a),f=x(a),e=T(l,m,d),g={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(i||!i&&!d)&&((o(a)!=="body"||bw(f))&&(g=(b=a)!==h(b)&&k(b)?{scrollLeft:(j=b).scrollLeft,scrollTop:j.scrollTop}:aH(b)),k(a)?((c=T(a,!0)).x+=a.clientLeft,c.y+=a.clientTop):f&&(c.x=bz(f))),{x:e.left+g.scrollLeft-c.x,y:e.top+g.scrollTop-c.y,width:e.width,height:e.height}}function dI(b){var c=new Map,a=new Set,d=[];function e(b){a.add(b.name),[].concat(b.requires||[],b.requiresIfExists||[]).forEach(function(b){if(!a.has(b)){var d=c.get(b);d&&e(d)}}),d.push(b)}return b.forEach(function(a){c.set(a.name,a)}),b.forEach(function(b){a.has(b.name)||e(b)}),d}aP={placement:"bottom",modifiers:[],strategy:"absolute"};function cs(){for(var b=arguments.length,c=new Array(b),a=0;aNumber.parseInt(a,10)):typeof a=="function"?b=>a(b,this._element):a}_getPopperConfig(){const a={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(q.setDataAttribute(this._menu,"popper","static"),a.modifiers=[{name:"applyStyles",enabled:!1}]),{...a,...g(this._config.popperConfig,[void 0,a])}}_selectMenuItem({key:d,target:c}){const a=b.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(a=>R(a));a.length&&br(a,c,d===cC,!a.includes(c)).focus()}static jQueryInterface(a){return this.each(function(){const b=p.getOrCreateInstance(this,a);if(typeof a=="string"){if(b[a]===void 0)throw new TypeError(`No method named "${a}"`);b[a]()}})}static clearMenus(a){if(a.button===2||a.type==="keyup"&&a.key!=="Tab")return;const c=b.find(ds);for(const g of c){const b=p.getInstance(g);if(!b||b._config.autoClose===!1)continue;const d=a.composedPath(),e=d.includes(b._menu);if(d.includes(b._element)||b._config.autoClose==="inside"&&!e||b._config.autoClose==="outside"&&e)continue;if(b._menu.contains(a.target)&&(a.type==="keyup"&&a.key==="Tab"||/input|select|option|textarea|form/i.test(a.target.tagName)))continue;const f={relatedTarget:b._element};a.type==="click"&&(f.clickEvent=a),b._completeHide(f)}}static dataApiKeydownHandler(a){const g=/input|textarea/i.test(a.target.tagName),d=a.key==="Escape",e=[dG,cC].includes(a.key);if(!e&&!d)return;if(g&&!d)return;a.preventDefault();const f=this.matches(K)?this:b.prev(this,K)[0]||b.next(this,K)[0]||b.findOne(K,a.delegateTarget.parentNode),c=p.getOrCreateInstance(f);if(e)return a.stopPropagation(),c.show(),void c._selectMenuItem(a);c._isShown()&&(a.stopPropagation(),c.hide(),f.focus())}}a.on(document,cI,K,p.dataApiKeydownHandler),a.on(document,cI,ap,p.dataApiKeydownHandler),a.on(document,cH,p.clearMenus),a.on(document,dz,p.clearMenus),a.on(document,cH,K,function(a){a.preventDefault(),p.getOrCreateInstance(this).toggle()}),j(p);const cX="backdrop",cY="show",cZ=`mousedown.bs.${cX}`,de={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},dc={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class bE extends ad{constructor(a){super(),this._config=this._getConfig(a),this._isAppended=!1,this._element=null}static get Default(){return de}static get DefaultType(){return dc}static get NAME(){return cX}show(a){if(!this._config.isVisible)return void g(a);this._append();const b=this._getElement();this._config.isAnimated&&ag(b),b.classList.add(cY),this._emulateAnimation(()=>{g(a)})}hide(a){this._config.isVisible?(this._getElement().classList.remove(cY),this._emulateAnimation(()=>{this.dispose(),g(a)})):g(a)}dispose(){this._isAppended&&(a.off(this._element,cZ),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const a=document.createElement("div");a.className=this._config.className,this._config.isAnimated&&a.classList.add("fade"),this._element=a}return this._element}_configAfterMerge(a){return a.rootElement=B(a.rootElement),a}_append(){if(this._isAppended)return;const b=this._getElement();this._config.rootElement.append(b),a.on(b,cZ,()=>{g(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(a){cN(a,this._getElement(),this._config.isAnimated)}}const ax=".bs.focustrap",fa=`focusin${ax}`,dd=`keydown.tab${ax}`,c_="backward",df={autofocus:!0,trapElement:null},dg={autofocus:"boolean",trapElement:"element"};class cV extends ad{constructor(a){super(),this._config=this._getConfig(a),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return df}static get DefaultType(){return dg}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),a.off(document,ax),a.on(document,fa,a=>this._handleFocusin(a)),a.on(document,dd,a=>this._handleKeydown(a)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,a.off(document,ax))}_handleFocusin(d){const{trapElement:a}=this._config;if(d.target===document||d.target===a||a.contains(d.target))return;const c=b.focusableChildren(a);c.length===0?a.focus():this._lastTabNavDirection===c_?c[c.length-1].focus():c[0].focus()}_handleKeydown(a){a.key==="Tab"&&(this._lastTabNavDirection=a.shiftKey?c_:"forward")}}const cU=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cT=".sticky-top",am="padding-right",cR="margin-right";class bx{constructor(){this._element=document.body}getWidth(){const a=document.documentElement.clientWidth;return Math.abs(window.innerWidth-a)}hide(){const a=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,am,b=>b+a),this._setElementAttributes(cU,am,b=>b+a),this._setElementAttributes(cT,cR,b=>b-a)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,am),this._resetElementAttributes(cU,am),this._resetElementAttributes(cT,cR)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(b,a,c){const d=this.getWidth();this._applyManipulationCallback(b,b=>{if(b!==this._element&&window.innerWidth>b.clientWidth+d)return;this._saveInitialAttribute(b,a);const e=window.getComputedStyle(b).getPropertyValue(a);b.style.setProperty(a,`${c(Number.parseFloat(e))}px`)})}_saveInitialAttribute(a,b){const c=a.style.getPropertyValue(b);c&&q.setDataAttribute(a,b,c)}_resetElementAttributes(b,a){this._applyManipulationCallback(b,b=>{const c=q.getDataAttribute(b,a);c!==null?(q.removeDataAttribute(b,a),b.style.setProperty(a,c)):b.style.removeProperty(a)})}_applyManipulationCallback(a,c){if(r(a))c(a);else for(const d of b.find(a,this._element))c(d)}}const l=".bs.modal",dp=`hide${l}`,dq=`hidePrevented${l}`,cO=`hidden${l}`,cM=`show${l}`,dt=`shown${l}`,du=`resize${l}`,dv=`click.dismiss${l}`,dw=`mousedown.dismiss${l}`,dx=`keydown.dismiss${l}`,dy=`click${l}.data-api`,cJ="modal-open",cG="show",bc="modal-static",dC={backdrop:!0,focus:!0,keyboard:!0},dD={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class P extends m{constructor(a,c){super(a,c),this._dialog=b.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new bx,this._addEventListeners()}static get Default(){return dC}static get DefaultType(){return dD}static get NAME(){return"modal"}toggle(a){return this._isShown?this.hide():this.show(a)}show(b){this._isShown||this._isTransitioning||a.trigger(this._element,cM,{relatedTarget:b}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(cJ),this._adjustDialog(),this._backdrop.show(()=>this._showElement(b)))}hide(){this._isShown&&!this._isTransitioning&&(a.trigger(this._element,dp).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(cG),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())))}dispose(){a.off(window,l),a.off(this._dialog,l),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bE({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new cV({trapElement:this._element})}_showElement(d){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const c=b.findOne(".modal-body",this._dialog);c&&(c.scrollTop=0),ag(this._element),this._element.classList.add(cG),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,a.trigger(this._element,dt,{relatedTarget:d})},this._dialog,this._isAnimated())}_addEventListeners(){a.on(this._element,dx,a=>{a.key==="Escape"&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())}),a.on(window,du,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),a.on(this._element,dw,b=>{a.one(this._element,dv,a=>{this._element===b.target&&this._element===a.target&&(this._config.backdrop!=="static"?this._config.backdrop&&this.hide():this._triggerBackdropTransition())})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(cJ),this._resetAdjustments(),this._scrollBar.reset(),a.trigger(this._element,cO)})}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(a.trigger(this._element,dq).defaultPrevented)return;const c=this._element.scrollHeight>document.documentElement.clientHeight,b=this._element.style.overflowY;b==="hidden"||this._element.classList.contains(bc)||(c||(this._element.style.overflowY="hidden"),this._element.classList.add(bc),this._queueCallback(()=>{this._element.classList.remove(bc),this._queueCallback(()=>{this._element.style.overflowY=b},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const b=this._element.scrollHeight>document.documentElement.clientHeight,a=this._scrollBar.getWidth(),c=a>0;if(c&&!b){const b=i()?"paddingLeft":"paddingRight";this._element.style[b]=`${a}px`}if(!c&&b){const b=i()?"paddingRight":"paddingLeft";this._element.style[b]=`${a}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(a,b){return this.each(function(){const c=P.getOrCreateInstance(this,a);if(typeof a=="string"){if(c[a]===void 0)throw new TypeError(`No method named "${a}"`);c[a](b)}})}}a.on(document,dy,'[data-bs-toggle="modal"]',function(e){const c=b.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),a.one(c,cM,b=>{b.defaultPrevented||a.one(c,cO,()=>{R(this)&&this.focus()})});const d=b.findOne(".modal.show");d&&P.getInstance(d).hide(),P.getOrCreateInstance(c).toggle(this)}),aC(P),j(P);const s=".bs.offcanvas",c$=".data-api",dH=`load${s}${c$}`,cq="show",cp="showing",ch="hiding",bG=".offcanvas.show",dM=`show${s}`,dN=`shown${s}`,dO=`hide${s}`,bI=`hidePrevented${s}`,bK=`hidden${s}`,dR=`resize${s}`,dS=`click${s}${c$}`,dT=`keydown.dismiss${s}`,dU={backdrop:!0,keyboard:!0,scroll:!1},dV={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class v extends m{constructor(a,b){super(a,b),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return dU}static get DefaultType(){return dV}static get NAME(){return"offcanvas"}toggle(a){return this._isShown?this.hide():this.show(a)}show(b){this._isShown||a.trigger(this._element,dM,{relatedTarget:b}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new bx).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(cp),this._queueCallback(()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(cq),this._element.classList.remove(cp),a.trigger(this._element,dN,{relatedTarget:b})},this._element,!0))}hide(){this._isShown&&(a.trigger(this._element,dO).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ch),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(cq,ch),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new bx).reset(),a.trigger(this._element,bK)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const b=Boolean(this._config.backdrop);return new bE({className:"offcanvas-backdrop",isVisible:b,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:b?()=>{this._config.backdrop!=="static"?this.hide():a.trigger(this._element,bI)}:null})}_initializeFocusTrap(){return new cV({trapElement:this._element})}_addEventListeners(){a.on(this._element,dT,b=>{b.key==="Escape"&&(this._config.keyboard?this.hide():a.trigger(this._element,bI))})}static jQueryInterface(a){return this.each(function(){const b=v.getOrCreateInstance(this,a);if(typeof a=="string"){if(b[a]===void 0||a.startsWith("_")||a==="constructor")throw new TypeError(`No method named "${a}"`);b[a](this)}})}}a.on(document,dS,'[data-bs-toggle="offcanvas"]',function(e){const c=b.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),y(this))return;a.one(c,bK,()=>{R(this)&&this.focus()});const d=b.findOne(bG);d&&d!==c&&v.getInstance(d).hide(),v.getOrCreateInstance(c).toggle(this)}),a.on(window,dH,()=>{for(const a of b.find(bG))v.getOrCreateInstance(a).show()}),a.on(window,dR,()=>{for(const a of b.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(a).position!=="fixed"&&v.getOrCreateInstance(a).hide()}),aC(v),j(v);const bL={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},dY=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),dZ=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,d_=(b,c)=>{const a=b.nodeName.toLowerCase();return c.includes(a)?!dY.has(a)||Boolean(dZ.test(b.nodeValue)):c.filter(a=>a instanceof RegExp).some(b=>b.test(a))},d$={allowList:bL,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
                    "},ea={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},eb={entry:"(string|element|function|null)",selector:"(string|element)"};class ec extends ad{constructor(a){super(),this._config=this._getConfig(a)}static get Default(){return d$}static get DefaultType(){return ea}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map(a=>this._resolvePossibleFunction(a)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(a){return this._checkContent(a),this._config.content={...this._config.content,...a},this}toHtml(){const a=document.createElement("div");a.innerHTML=this._maybeSanitize(this._config.template);for(const[b,c]of Object.entries(this._config.content))this._setContent(a,c,b);const b=a.children[0],c=this._resolvePossibleFunction(this._config.extraClass);return c&&b.classList.add(...c.split(" ")),b}_typeCheckConfig(a){super._typeCheckConfig(a),this._checkContent(a.content)}_checkContent(a){for(const[b,c]of Object.entries(a))super._typeCheckConfig({selector:b,entry:c},eb)}_setContent(d,a,e){const c=b.findOne(e,d);c&&((a=this._resolvePossibleFunction(a))?r(a)?this._putElementInTemplate(B(a),c):this._config.html?c.innerHTML=this._maybeSanitize(a):c.textContent=a:c.remove())}_maybeSanitize(a){return this._config.sanitize?function(a,b,c){if(!a.length)return a;if(c&&typeof c=="function")return c(a);const d=(new window.DOMParser).parseFromString(a,"text/html"),e=[].concat(...d.body.querySelectorAll("*"));for(const a of e){const c=a.nodeName.toLowerCase();if(!Object.keys(b).includes(c)){a.remove();continue}const d=[].concat(...a.attributes),f=[].concat(b["*"]||[],b[c]||[]);for(const b of d)d_(b,f)||a.removeAttribute(b.nodeName)}return d.body.innerHTML}(a,this._config.allowList,this._config.sanitizeFn):a}_resolvePossibleFunction(a){return g(a,[void 0,this])}_putElementInTemplate(b,a){if(this._config.html)return a.innerHTML="",void a.append(b);a.textContent=b.textContent}}const ed=new Set(["sanitize","allowList","sanitizeFn"]),aK="fade",aF="show",eg=".tooltip-inner",bM=".modal",bQ="hide.bs.modal",ai="hover",aO="focus",aR="click",em={AUTO:"auto",TOP:"top",RIGHT:i()?"left":"right",BOTTOM:"bottom",LEFT:i()?"right":"left"},en={allowList:bL,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},eo={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class V extends m{constructor(a,b){if(cx===void 0)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)");super(a,b),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return en}static get DefaultType(){return eo}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),a.off(this._element.closest(bM),bQ,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const c=a.trigger(this._element,this.constructor.eventName("show")),d=(cQ(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(c.defaultPrevented||!d)return;this._disposePopper();const b=this._getTipElement();this._element.setAttribute("aria-describedby",b.getAttribute("id"));const{container:e}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(e.append(b),a.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(b),b.classList.add(aF),"ontouchstart"in document.documentElement)for(const b of[].concat(...document.body.children))a.on(b,"mouseover",ao);this._queueCallback(()=>{a.trigger(this._element,this.constructor.eventName("shown")),this._isHovered===!1&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(this._isShown()&&!a.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(aF),"ontouchstart"in document.documentElement)for(const b of[].concat(...document.body.children))a.off(b,"mouseover",ao);this._activeTrigger[aR]=!1,this._activeTrigger[aO]=!1,this._activeTrigger[ai]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),a.trigger(this._element,this.constructor.eventName("hidden")))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(b){const a=this._getTemplateFactory(b).toHtml();if(!a)return null;a.classList.remove(aK,aF),a.classList.add(`bs-${this.constructor.NAME}-auto`);const c=(a=>{do a+=Math.floor(1e6*Math.random());while(document.getElementById(a))return a})(this.constructor.NAME).toString();return a.setAttribute("id",c),this._isAnimated()&&a.classList.add(aK),a}setContent(a){this._newContent=a,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(a){return this._templateFactory?this._templateFactory.changeContent(a):this._templateFactory=new ec({...this._config,content:a,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[eg]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(a){return this.constructor.getOrCreateInstance(a.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(aK)}_isShown(){return this.tip&&this.tip.classList.contains(aF)}_createPopper(a){const b=g(this._config.placement,[this,a,this._element]),c=em[b.toUpperCase()];return az(this._element,a,this._getPopperConfig(c))}_getOffset(){const{offset:a}=this._config;return typeof a=="string"?a.split(",").map(a=>Number.parseInt(a,10)):typeof a=="function"?b=>a(b,this._element):a}_resolvePossibleFunction(a){return g(a,[this._element,this._element])}_getPopperConfig(b){const a={placement:b,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:a=>{this._getTipElement().setAttribute("data-popper-placement",a.state.placement)}}]};return{...a,...g(this._config.popperConfig,[void 0,a])}}_setListeners(){const b=this._config.trigger.split(" ");for(const c of b)if(c==="click")a.on(this._element,this.constructor.eventName("click"),this._config.selector,b=>{const a=this._initializeOnDelegatedTarget(b);a._activeTrigger[aR]=!(a._isShown()&&a._activeTrigger[aR]),a.toggle()});else if(c!=="manual"){const b=c===ai?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),d=c===ai?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");a.on(this._element,b,this._config.selector,a=>{const b=this._initializeOnDelegatedTarget(a);b._activeTrigger[a.type==="focusin"?aO:ai]=!0,b._enter()}),a.on(this._element,d,this._config.selector,a=>{const b=this._initializeOnDelegatedTarget(a);b._activeTrigger[a.type==="focusout"?aO:ai]=b._element.contains(a.relatedTarget),b._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},a.on(this._element.closest(bM),bQ,this._hideModalHandler)}_fixTitle(){const a=this._element.getAttribute("title");a&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",a),this._element.setAttribute("data-bs-original-title",a),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(a,b){clearTimeout(this._timeout),this._timeout=setTimeout(a,b)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(a){const b=q.getDataAttributes(this._element);for(const a of Object.keys(b))ed.has(a)&&delete b[a];return a={...b,...typeof a=="object"&&a?a:{}},a=this._mergeConfigObj(a),a=this._configAfterMerge(a),this._typeCheckConfig(a),a}_configAfterMerge(a){return a.container=a.container===!1?document.body:B(a.container),typeof a.delay=="number"&&(a.delay={show:a.delay,hide:a.delay}),typeof a.title=="number"&&(a.title=a.title.toString()),typeof a.content=="number"&&(a.content=a.content.toString()),a}_getDelegateConfig(){const a={};for(const[b,c]of Object.entries(this._config))this.constructor.Default[b]!==c&&(a[b]=c);return a.selector=!1,a.trigger="manual",a}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(a){return this.each(function(){const b=V.getOrCreateInstance(this,a);if(typeof a=="string"){if(b[a]===void 0)throw new TypeError(`No method named "${a}"`);b[a]()}})}}j(V);const eq=".popover-header",er=".popover-body",es={...V.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},et={...V.DefaultType,content:"(null|string|element|function)"};class bb extends V{static get Default(){return es}static get DefaultType(){return et}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[eq]:this._getTitle(),[er]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(a){return this.each(function(){const b=bb.getOrCreateInstance(this,a);if(typeof a=="string"){if(b[a]===void 0)throw new TypeError(`No method named "${a}"`);b[a]()}})}}j(bb);const be=".bs.scrollspy",ew=`activate${be}`,bX=`click${be}`,ey=`load${be}.data-api`,O="active",bq="[href]",db=".nav-link",eC=`${db}, .nav-item > ${db}, .list-group-item`,eD={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},eE={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class aG extends m{constructor(a,b){super(a,b),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return eD}static get DefaultType(){return eE}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const a of this._observableSections.values())this._observer.observe(a)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(a){return a.target=B(a.target)||document.body,a.rootMargin=a.offset?`${a.offset}px 0px -30%`:a.rootMargin,typeof a.threshold=="string"&&(a.threshold=a.threshold.split(",").map(a=>Number.parseFloat(a))),a}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(a.off(this._config.target,bX),a.on(this._config.target,bX,bq,a=>{const b=this._observableSections.get(a.target.hash);if(b){a.preventDefault();const c=this._rootElement||window,d=b.offsetTop-this._element.offsetTop;if(c.scrollTo)return void c.scrollTo({top:d,behavior:"smooth"});c.scrollTop=d}}))}_getNewObserver(){const a={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(a=>this._observerCallback(a),a)}_observerCallback(e){const b=a=>this._targetLinks.get(`#${a.target.id}`),c=a=>{this._previousScrollData.visibleEntryTop=a.target.offsetTop,this._process(b(a))},a=(this._rootElement||document.documentElement).scrollTop,d=a>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=a;for(const f of e){if(!f.isIntersecting){this._activeTarget=null,this._clearActiveClass(b(f));continue}const g=f.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(d&&g){if(c(f),!a)return}else d||g||c(f)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const a=b.find(bq,this._config.target);for(const c of a){if(!c.hash||y(c))continue;const d=b.findOne(decodeURI(c.hash),this._element);R(d)&&(this._targetLinks.set(decodeURI(c.hash),c),this._observableSections.set(c.hash,d))}}_process(b){this._activeTarget!==b&&(this._clearActiveClass(this._config.target),this._activeTarget=b,b.classList.add(O),this._activateParents(b),a.trigger(this._element,ew,{relatedTarget:b}))}_activateParents(a){if(a.classList.contains("dropdown-item"))b.findOne(".dropdown-toggle",a.closest(".dropdown")).classList.add(O);else for(const c of b.parents(a,".nav, .list-group"))for(const a of b.prev(c,eC))a.classList.add(O)}_clearActiveClass(a){a.classList.remove(O);const c=b.find(`${bq}.${O}`,a);for(const a of c)a.classList.remove(O)}static jQueryInterface(a){return this.each(function(){const b=aG.getOrCreateInstance(this,a);if(typeof a=="string"){if(b[a]===void 0||a.startsWith("_")||a==="constructor")throw new TypeError(`No method named "${a}"`);b[a]()}})}}a.on(window,ey,()=>{for(const a of b.find('[data-bs-spy="scroll"]'))aG.getOrCreateInstance(a)}),j(aG);const F=".bs.tab",eH=`hide${F}`,eI=`hidden${F}`,eJ=`show${F}`,eK=`shown${F}`,eL=`click${F}`,eM=`keydown${F}`,eN=`load${F}`,eO="ArrowLeft",b_="ArrowRight",eQ="ArrowUp",ca="ArrowDown",bf="Home",cc="End",D="active",cd="fade",aS="show",cg=".dropdown-toggle",aI=`:not(${cg})`,cn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',aY=`.nav-link${aI}, .list-group-item${aI}, [role="tab"]${aI}, ${cn}`,e$=`.${D}[data-bs-toggle="tab"], .${D}[data-bs-toggle="pill"], .${D}[data-bs-toggle="list"]`;class Q extends m{constructor(b){super(b),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),a.on(this._element,eM,a=>this._keydown(a)))}static get NAME(){return"tab"}show(){const b=this._element;if(this._elemIsActive(b))return;const c=this._getActiveElem(),d=c?a.trigger(c,eH,{relatedTarget:b}):null;a.trigger(b,eJ,{relatedTarget:c}).defaultPrevented||d&&d.defaultPrevented||(this._deactivate(c,b),this._activate(b,c))}_activate(c,d){c&&(c.classList.add(D),this._activate(b.getElementFromSelector(c)),this._queueCallback(()=>{c.getAttribute("role")==="tab"?(c.removeAttribute("tabindex"),c.setAttribute("aria-selected",!0),this._toggleDropDown(c,!0),a.trigger(c,eK,{relatedTarget:d})):c.classList.add(aS)},c,c.classList.contains(cd)))}_deactivate(c,d){c&&(c.classList.remove(D),c.blur(),this._deactivate(b.getElementFromSelector(c)),this._queueCallback(()=>{c.getAttribute("role")==="tab"?(c.setAttribute("aria-selected",!1),c.setAttribute("tabindex","-1"),this._toggleDropDown(c,!1),a.trigger(c,eI,{relatedTarget:d})):c.classList.remove(aS)},c,c.classList.contains(cd)))}_keydown(a){if(![eO,b_,eQ,ca,bf,cc].includes(a.key))return;a.stopPropagation(),a.preventDefault();const c=this._getChildren().filter(a=>!y(a));let b;if([bf,cc].includes(a.key))b=c[a.key===bf?0:c.length-1];else{const d=[b_,ca].includes(a.key);b=br(c,a.target,d,!0)}b&&(b.focus({preventScroll:!0}),Q.getOrCreateInstance(b).show())}_getChildren(){return b.find(aY,this._parent)}_getActiveElem(){return this._getChildren().find(a=>this._elemIsActive(a))||null}_setInitialAttributes(a,b){this._setAttributeIfNotExists(a,"role","tablist");for(const a of b)this._setInitialAttributesOnChild(a)}_setInitialAttributesOnChild(a){a=this._getInnerElement(a);const b=this._elemIsActive(a),c=this._getOuterElement(a);a.setAttribute("aria-selected",b),c!==a&&this._setAttributeIfNotExists(c,"role","presentation"),b||a.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(a,"role","tab"),this._setInitialAttributesOnTargetPanel(a)}_setInitialAttributesOnTargetPanel(a){const c=b.getElementFromSelector(a);c&&(this._setAttributeIfNotExists(c,"role","tabpanel"),a.id&&this._setAttributeIfNotExists(c,"aria-labelledby",`${a.id}`))}_toggleDropDown(e,c){const a=this._getOuterElement(e);if(!a.classList.contains("dropdown"))return;const d=(e,f)=>{const d=b.findOne(e,a);d&&d.classList.toggle(f,c)};d(cg,D),d(".dropdown-menu",aS),a.setAttribute("aria-expanded",c)}_setAttributeIfNotExists(a,b,c){a.hasAttribute(b)||a.setAttribute(b,c)}_elemIsActive(a){return a.classList.contains(D)}_getInnerElement(a){return a.matches(aY)?a:b.findOne(aY,a)}_getOuterElement(a){return a.closest(".nav-item, .list-group-item")||a}static jQueryInterface(a){return this.each(function(){const b=Q.getOrCreateInstance(this);if(typeof a=="string"){if(b[a]===void 0||a.startsWith("_")||a==="constructor")throw new TypeError(`No method named "${a}"`);b[a]()}})}}a.on(document,eL,cn,function(a){["A","AREA"].includes(this.tagName)&&a.preventDefault(),y(this)||Q.getOrCreateInstance(this).show()}),a.on(window,eN,()=>{for(const a of b.find(e$))Q.getOrCreateInstance(a)}),j(Q);const w=".bs.toast",fc=`mouseover${w}`,fd=`mouseout${w}`,fe=`focusin${w}`,ff=`focusout${w}`,fg=`hide${w}`,fh=`hidden${w}`,fi=`show${w}`,fj=`shown${w}`,cL="hide",ar="show",al="showing",fn={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class aq extends m{constructor(a,b){super(a,b),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return fn}static get NAME(){return"toast"}show(){a.trigger(this._element,fi).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(cL),ag(this._element),this._element.classList.add(ar,al),this._queueCallback(()=>{this._element.classList.remove(al),a.trigger(this._element,fj),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this.isShown()&&(a.trigger(this._element,fg).defaultPrevented||(this._element.classList.add(al),this._queueCallback(()=>{this._element.classList.add(cL),this._element.classList.remove(al,ar),a.trigger(this._element,fh)},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(ar),super.dispose()}isShown(){return this._element.classList.contains(ar)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(b,a){switch(b.type){case"mouseover":case"mouseout":this._hasMouseInteraction=a;break;case"focusin":case"focusout":this._hasKeyboardInteraction=a}if(a)return void this._clearTimeout();const c=b.relatedTarget;this._element===c||this._element.contains(c)||this._maybeScheduleHide()}_setListeners(){a.on(this._element,fc,a=>this._onInteraction(a,!0)),a.on(this._element,fd,a=>this._onInteraction(a,!1)),a.on(this._element,fe,a=>this._onInteraction(a,!0)),a.on(this._element,ff,a=>this._onInteraction(a,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(a){return this.each(function(){const b=aq.getOrCreateInstance(this,a);if(typeof a=="string"){if(b[a]===void 0)throw new TypeError(`No method named "${a}"`);b[a](this)}})}}return aC(aq),j(aq),{Alert:ak,Button:aE,Carousel:Z,Collapse:ae,Dropdown:p,Modal:P,Offcanvas:v,Popover:bb,ScrollSpy:aG,Tab:Q,Toast:aq,Tooltip:V}})}}),l=j(k())})() \ No newline at end of file diff --git a/js/highlight.min.a4326e9fb7fe7186d35cef8cf9efadc53041724dc47c3d9786f4e8794d0e12eb623ecb3ca27f8912915a9a7195f9ababe5bc1ff3b23e3aabebeb52ff7a3fac0f.js b/js/highlight.min.a4326e9fb7fe7186d35cef8cf9efadc53041724dc47c3d9786f4e8794d0e12eb623ecb3ca27f8912915a9a7195f9ababe5bc1ff3b23e3aabebeb52ff7a3fac0f.js new file mode 100644 index 00000000..dad5e7ab --- /dev/null +++ b/js/highlight.min.a4326e9fb7fe7186d35cef8cf9efadc53041724dc47c3d9786f4e8794d0e12eb623ecb3ca27f8912915a9a7195f9ababe5bc1ff3b23e3aabebeb52ff7a3fac0f.js @@ -0,0 +1 @@ +(()=>{var h=Object.create,b=Object.defineProperty,z=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,r=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty,n=a=>b(a,"__esModule",{value:!0}),m=(b,a)=>function(){return a||(0,b[Object.keys(b)[0]])((a={exports:{}}).exports,a),a.exports},i=(c,a,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of s(a))!q.call(c,e)&&e!=="default"&&b(c,e,{get:()=>a[e],enumerable:!(d=z(a,e))||d.enumerable});return c},j=a=>i(n(b(a!=null?h(r(a)):{},"default",a&&a.__esModule&&"default"in a?{get:()=>a.default,enumerable:!0}:{value:a,enumerable:!0})),a),k=m({"node_modules/highlight.js/lib/core.js"(aC,ax){var r,_,v,Z,W,o,n,P,D,C,z,l,A,y,w,B,F,f,H,I,J,j,L,M,N,O,ag,Q,R,S,T,U,V,i,ab,ac,ad,m,a,p,c,g,X,E,k,s,q,G,u,e;function aa(a){return a instanceof Map?a.clear=a.delete=a.set=function(){throw new Error("map is read-only")}:a instanceof Set&&(a.add=a.clear=a.delete=function(){throw new Error("set is read-only")}),Object.freeze(a),Object.getOwnPropertyNames(a).forEach(d=>{const b=a[d],c=typeof b;(c==="object"||c==="function")&&!Object.isFrozen(b)&&aa(b)}),a}r=class{constructor(a){a.data===void 0&&(a.data={}),this.data=a.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}};function $(a){return a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function b(b,...c){const a=Object.create(null);for(const c in b)a[c]=b[c];return c.forEach(function(b){for(const c in b)a[c]=b[c]}),a}_="",v=a=>!!a.scope,Z=(a,{prefix:b})=>{if(a.startsWith("language:"))return a.replace("language:","language-");if(a.includes(".")){const c=a.split(".");return[`${b}${c.shift()}`,...c.map((a,b)=>`${a}${"_".repeat(b+1)}`)].join(" ")}return`${b}${a}`},W=class{constructor(a,b){this.buffer="",this.classPrefix=b.classPrefix,a.walk(this)}addText(a){this.buffer+=$(a)}openNode(a){if(!v(a))return;const b=Z(a.scope,{prefix:this.classPrefix});this.span(b)}closeNode(a){if(!v(a))return;this.buffer+=_}value(){return this.buffer}span(a){this.buffer+=``}},o=(b={})=>{const a={children:[]};return Object.assign(a,b),a},n=class{constructor(){this.rootNode=o(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(a){this.top.children.push(a)}openNode(b){const a=o({scope:b});this.add(a),this.stack.push(a)}closeNode(){return this.stack.length>1?this.stack.pop():void 0}closeAllNodes(){while(this.closeNode());}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(a){return this.constructor._walk(a,this.rootNode)}static _walk(b,a){return typeof a=="string"?b.addText(a):a.children&&(b.openNode(a),a.children.forEach(a=>this._walk(b,a)),b.closeNode(a)),b}static _collapse(a){if(typeof a=="string")return;if(!a.children)return;a.children.every(a=>typeof a=="string")?a.children=[a.children.join("")]:a.children.forEach(a=>{n._collapse(a)})}},P=class extends n{constructor(a){super(),this.options=a}addText(a){if(a==="")return;this.add(a)}startScope(a){this.openNode(a)}endScope(){this.closeNode()}__addSublanguage(c,a){const b=c.root;a&&(b.scope=`language:${a}`),this.add(b)}toHTML(){const a=new W(this,this.options);return a.value()}finalize(){return this.closeAllNodes(),!0}};function h(a){return a?typeof a=="string"?a:a.source:null}function K(a){return d("(?=",a,")")}function aA(a){return d("(?:",a,")*")}function az(a){return d("(?:",a,")?")}function d(...a){const b=a.map(a=>h(a)).join("");return b}function ay(a){const b=a[a.length-1];return typeof b=="object"&&b.constructor===Object?(a.splice(a.length-1,1),b):{}}function t(...a){const b=ay(a),c="("+(b.capture?"":"?:")+a.map(a=>h(a)).join("|")+")";return c}function ah(a){return new RegExp(a.toString()+"|").exec("").length-1}function aw(a,c){const b=a&&a.exec(c);return b&&b.index===0}D=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function x(b,{joinWith:c}){let a=0;return b.map(d=>{a+=1;const e=a;let b=h(d),c="";while(b.length>0){const d=D.exec(b);if(!d){c+=b;break}c+=b.substring(0,d.index),b=b.substring(d.index+d[0].length),d[0][0]==="\\"&&d[1]?c+="\\"+String(Number(d[1])+e):(c+=d[0],d[0]==="("&&a++)}return c}).map(a=>`(${a})`).join(c)}C=/\b\B/,z="[a-zA-Z]\\w*",l="[a-zA-Z_]\\w*",A="\\b\\d+(\\.\\d+)?",y="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",B="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",F=(a={})=>{const c=/^#![ ]*\//;return a.binary&&(a.begin=d(c,/.*\b/,a.binary,/\b.*/)),b({scope:"meta",begin:c,end:/$/,relevance:0,"on:begin":(a,b)=>{a.index!==0&&b.ignoreMatch()}},a)},f={begin:"\\\\[\\s\\S]",relevance:0},H={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[f]},I={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[f]},J={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},j=function(c,e,f={}){const a=b({scope:"comment",begin:c,end:e,contains:[]},f);a.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const g=t("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return a.contains.push({begin:d(/[ ]+/,"(",g,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),a},L=j("//","$"),M=j("/\\*","\\*/"),N=j("#","$"),O={scope:"number",begin:A,relevance:0},ag={scope:"number",begin:y,relevance:0},Q={scope:"number",begin:w,relevance:0},R={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[f,{begin:/\[/,end:/\]/,relevance:0,contains:[f]}]},S={scope:"title",begin:z,relevance:0},T={scope:"title",begin:l,relevance:0},U={begin:"\\.\\s*"+l,relevance:0},V=function(a){return Object.assign(a,{"on:begin":(a,b)=>{b.data._beginMatch=a[1]},"on:end":(b,a)=>{a.data._beginMatch!==b[1]&&a.ignoreMatch()}})},i=Object.freeze({__proto__:null,APOS_STRING_MODE:H,BACKSLASH_ESCAPE:f,BINARY_NUMBER_MODE:Q,BINARY_NUMBER_RE:w,COMMENT:j,C_BLOCK_COMMENT_MODE:M,C_LINE_COMMENT_MODE:L,C_NUMBER_MODE:ag,C_NUMBER_RE:y,END_SAME_AS_BEGIN:V,HASH_COMMENT_MODE:N,IDENT_RE:z,MATCH_NOTHING_RE:C,METHOD_GUARD:U,NUMBER_MODE:O,NUMBER_RE:A,PHRASAL_WORDS_MODE:J,QUOTE_STRING_MODE:I,REGEXP_MODE:R,RE_STARTERS_RE:B,SHEBANG:F,TITLE_MODE:S,UNDERSCORE_IDENT_RE:l,UNDERSCORE_TITLE_MODE:T});function av(a,b){const c=a.input[a.index-1];c==="."&&b.ignoreMatch()}function at(a,b){a.className!==void 0&&(a.scope=a.className,delete a.className)}function ai(a,b){if(!b)return;if(!a.beginKeywords)return;a.begin="\\b("+a.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",a.__beforeBegin=av,a.keywords=a.keywords||a.beginKeywords,delete a.beginKeywords,a.relevance===void 0&&(a.relevance=0)}function am(a,b){if(!Array.isArray(a.illegal))return;a.illegal=t(...a.illegal)}function al(a,b){if(!a.match)return;if(a.begin||a.end)throw new Error("begin & end are not supported with match");a.begin=a.match,delete a.match}function ak(a,b){a.relevance===void 0&&(a.relevance=1)}ab=(a,c)=>{if(!a.beforeMatch)return;if(a.starts)throw new Error("beforeMatch cannot be used with starts");const b=Object.assign({},a);Object.keys(a).forEach(b=>{delete a[b]}),a.keywords=b.keywords,a.begin=d(b.beforeMatch,K(b.begin)),a.starts={relevance:0,contains:[Object.assign(b,{endsParent:!0})]},a.relevance=0,delete b.beforeMatch},ac=["of","and","for","in","not","or","if","then","parent","list","value"],ad="keyword";function ae(a,c,d=ad){const b=Object.create(null);return typeof a=="string"?e(d,a.split(" ")):Array.isArray(a)?e(d,a):Object.keys(a).forEach(function(d){Object.assign(b,ae(a[d],c,d))}),b;function e(d,a){c&&(a=a.map(a=>a.toLowerCase())),a.forEach(function(c){const a=c.split("|");b[a[0]]=[d,aj(a[0],a[1])]})}}function aj(b,a){return a?Number(a):ar(b)?0:1}function ar(a){return ac.includes(a.toLowerCase())}m={},a=a=>{console.error(a)},p=(a,...b)=>{console.log(`WARN: ${a}`,...b)},c=(a,b)=>{if(m[`${a}/${b}`])return;console.log(`Deprecated as of ${a}. ${b}`),m[`${a}/${b}`]=!0},g=new Error;function af(a,d,{key:b}){let c=0;const g=a[b],e={},f={};for(let a=1;a<=d.length;a++)f[a+c]=g[a],e[a+c]=!0,c+=ah(d[a-1]);a[b]=f,a[b]._emit=e,a[b]._multi=!0}function an(b){if(!Array.isArray(b.begin))return;if(b.skip||b.excludeBegin||b.returnBegin)throw a("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),g;if(typeof b.beginScope!="object"||b.beginScope===null)throw a("beginScope must be object"),g;af(b,b.begin,{key:"beginScope"}),b.begin=x(b.begin,{joinWith:""})}function ao(b){if(!Array.isArray(b.end))return;if(b.skip||b.excludeEnd||b.returnEnd)throw a("skip, excludeEnd, returnEnd not compatible with endScope: {}"),g;if(typeof b.endScope!="object"||b.endScope===null)throw a("endScope must be object"),g;af(b,b.end,{key:"endScope"}),b.end=x(b.end,{joinWith:""})}function ap(a){a.scope&&typeof a.scope=="object"&&a.scope!==null&&(a.beginScope=a.scope,delete a.scope)}function aq(a){ap(a),typeof a.beginScope=="string"&&(a.beginScope={_wrap:a.beginScope}),typeof a.endScope=="string"&&(a.endScope={_wrap:a.endScope}),an(a),ao(a)}function aB(a){function c(b,c){return new RegExp(h(b),"m"+(a.case_insensitive?"i":"")+(a.unicodeRegex?"u":"")+(c?"g":""))}class e{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(b,a){a.position=this.position++,this.matchIndexes[this.matchAt]=a,this.regexes.push([a,b]),this.matchAt+=ah(b)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const a=this.regexes.map(a=>a[1]);this.matcherRe=c(x(a,{joinWith:"|"}),!0),this.lastIndex=0}exec(c){this.matcherRe.lastIndex=this.lastIndex;const a=this.matcherRe.exec(c);if(!a)return null;const b=a.findIndex((a,b)=>b>0&&a!==void 0),d=this.matchIndexes[b];return a.splice(0,b),Object.assign(a,d)}}class f{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(a){if(this.multiRegexes[a])return this.multiRegexes[a];const b=new e;return this.rules.slice(a).forEach(([a,c])=>b.addRule(a,c)),b.compile(),this.multiRegexes[a]=b,b}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(b,a){this.rules.push([b,a]),a.type==="begin"&&this.count++}exec(b){const c=this.getMatcher(this.regexIndex);c.lastIndex=this.lastIndex;let a=c.exec(b);if(this.resumingScanAtSamePosition())if(a&&a.index===this.lastIndex);else{const c=this.getMatcher(0);c.lastIndex=this.lastIndex+1,a=c.exec(b)}return a&&(this.regexIndex+=a.position+1,this.regexIndex===this.count&&this.considerAll()),a}}function g(a){const b=new f;return a.contains.forEach(a=>b.addRule(a.begin,{rule:a,type:"begin"})),a.terminatorEnd&&b.addRule(a.terminatorEnd,{type:"end"}),a.illegal&&b.addRule(a.illegal,{type:"illegal"}),b}function d(b,f){const e=b;if(b.isCompiled)return e;[at,al,aq,ab].forEach(a=>a(b,f)),a.compilerExtensions.forEach(a=>a(b,f)),b.__beforeBegin=null,[ai,am,ak].forEach(a=>a(b,f)),b.isCompiled=!0;let i=null;return typeof b.keywords=="object"&&b.keywords.$pattern&&(b.keywords=Object.assign({},b.keywords),i=b.keywords.$pattern,delete b.keywords.$pattern),i=i||/\w+/,b.keywords&&(b.keywords=ae(b.keywords,a.case_insensitive)),e.keywordPatternRe=c(i,!0),f&&(b.begin||(b.begin=/\B|\b/),e.beginRe=c(e.begin),!b.end&&!b.endsWithParent&&(b.end=/\B|\b/),b.end&&(e.endRe=c(e.end)),e.terminatorEnd=h(e.end)||"",b.endsWithParent&&f.terminatorEnd&&(e.terminatorEnd+=(b.end?"|":"")+f.terminatorEnd)),b.illegal&&(e.illegalRe=c(b.illegal)),b.contains||(b.contains=[]),b.contains=[].concat(...b.contains.map(function(a){return au(a==="self"?b:a)})),b.contains.forEach(function(a){d(a,e)}),b.starts&&d(b.starts,f),e.matcher=g(e),e}if(a.compilerExtensions||(a.compilerExtensions=[]),a.contains&&a.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return a.classNameAliases=b(a.classNameAliases||{}),d(a)}function Y(a){return!!a&&(a.endsWithParent||Y(a.starts))}function au(a){return a.variants&&!a.cachedVariants&&(a.cachedVariants=a.variants.map(function(c){return b(a,{variants:null},c)})),a.cachedVariants?a.cachedVariants:Y(a)?b(a,{starts:a.starts?b(a.starts):null}):Object.isFrozen(a)?b(a):a}X="11.11.1",E=class extends Error{constructor(a,b){super(a),this.name="HTMLInjectionError",this.html=b}},k=$,s=b,q=Symbol("nomatch"),G=7,u=function(e){const g=Object.create(null),h=Object.create(null),l=[];let j=!0;const B="Could not find the language '{}', did you forget to load/include a language module?",A={disableAutodetect:!0,name:"Plain text",contains:[]};let b={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:P};function z(a){return b.noHighlightRe.test(a)}function S(a){let d=a.className+" ";d+=a.parentNode?a.parentNode.className:"";const c=b.languageDetectRe.exec(d);if(c){const b=f(c[1]);return b||(p(B.replace("{}",c[1])),p("Falling back to no-highlight mode for this block.",a)),b?c[1]:"no-highlight"}return d.split(/\s+/).find(a=>z(a)||f(a))}function w(h,b,d){let f="",g="";typeof b=="object"?(f=h,d=b.ignoreIllegals,g=b.language):(c("10.7.0","highlight(lang, code, ...args) has been deprecated."),c("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),g=h,f=b),d===void 0&&(d=!0);const a={code:f,language:g};m("before:highlight",a);const e=a.result?a.result:u(a.language,a.code,d);return e.code=a.code,m("after:highlight",e),e}function u(l,i,O,N){const x=Object.create(null);function M(a,b){return a.keywords[b]}function A(){if(!c.keywords){e.addText(d);return}let f=0;c.keywordPatternRe.lastIndex=0;let a=c.keywordPatternRe.exec(d),b="";while(a){b+=d.substring(f,a.index);const g=h.case_insensitive?a[0].toLowerCase():a[0],i=M(c,g);if(i){const[c,d]=i;if(e.addText(b),b="",x[g]=(x[g]||0)+1,x[g]<=G&&(o+=d),c.startsWith("_"))b+=a[0];else{const b=h.classNameAliases[c]||c;s(a[0],b)}}else b+=a[0];f=c.keywordPatternRe.lastIndex,a=c.keywordPatternRe.exec(d)}b+=d.substring(f),e.addText(b)}function K(){if(d==="")return;let a=null;if(typeof c.subLanguage=="string"){if(!g[c.subLanguage]){e.addText(d);return}a=u(c.subLanguage,d,!0,C[c.subLanguage]),C[c.subLanguage]=a._top}else a=v(d,c.subLanguage.length?c.subLanguage:null);c.relevance>0&&(o+=a.relevance),e.__addSublanguage(a._emitter,a.language)}function n(){c.subLanguage!=null?K():A(),d=""}function s(a,b){if(a==="")return;e.startScope(b),e.addText(a),e.endScope()}function F(b,c){let a=1;const e=c.length-1;while(a<=e){if(!b._emit[a]){a++;continue}const e=h.classNameAliases[b[a]]||b[a],f=c[a];e?s(f,e):(d=f,A(),d=""),a++}}function z(a,b){return a.scope&&typeof a.scope=="string"&&e.openNode(h.classNameAliases[a.scope]||a.scope),a.beginScope&&(a.beginScope._wrap?(s(d,h.classNameAliases[a.beginScope._wrap]||a.beginScope._wrap),d=""):a.beginScope._multi&&(F(a.beginScope,b),d="")),c=Object.create(a,{parent:{value:c}}),c}function E(a,c,d){let b=aw(a.endRe,d);if(b){if(a["on:end"]){const d=new r(a);a["on:end"](c,d),d.isMatchIgnored&&(b=!1)}if(b){while(a.endsParent&&a.parent)a=a.parent;return a}}if(a.endsWithParent)return E(a.parent,c,d)}function J(a){return c.matcher.regexIndex===0?(d+=a[0],1):(y=!0,0)}function H(c){const b=c[0],a=c.rule,e=new r(a),f=[a.__beforeBegin,a["on:begin"]];for(const a of f){if(!a)continue;if(a(c,e),e.isMatchIgnored)return J(b)}return a.skip?d+=b:(a.excludeBegin&&(d+=b),n(),!a.returnBegin&&!a.excludeBegin&&(d=b)),z(a,c),a.returnBegin?0:b.length}function P(a){const b=a[0],h=i.substring(a.index),g=E(c,a,h);if(!g)return q;const f=c;c.endScope&&c.endScope._wrap?(n(),s(b,c.endScope._wrap)):c.endScope&&c.endScope._multi?(n(),F(c.endScope,a)):f.skip?d+=b:(f.returnEnd||f.excludeEnd||(d+=b),n(),f.excludeEnd&&(d=b));do c.scope&&e.closeNode(),!c.skip&&!c.subLanguage&&(o+=c.relevance),c=c.parent;while(c!==g.parent)return g.starts&&z(g.starts,a),f.returnEnd?0:b.length}function L(){const a=[];for(let b=c;b!==h;b=b.parent)b.scope&&a.unshift(b.scope);a.forEach(a=>e.openNode(a))}let p={};function D(e,a){const b=a&&a[0];if(d+=e,b==null)return n(),0;if(p.type==="begin"&&a.type==="end"&&p.index===a.index&&b===""){if(d+=i.slice(a.index,a.index+1),!j){const a=new Error(`0 width match regex (${l})`);throw a.languageName=l,a.badRule=p.rule,a}return 1}if(p=a,a.type==="begin")return H(a);if(a.type==="illegal"&&!O){const a=new Error('Illegal lexeme "'+b+'" for mode "'+(c.scope||"")+'"');throw a.mode=c,a}if(a.type==="end"){const b=P(a);if(b!==q)return b}if(a.type==="illegal"&&b==="")return d+="\n",1;if(w>1e5&&w>a.index*3){const a=new Error("potential infinite loop, way more iterations than matches");throw a}return d+=b,b.length}const h=f(l);if(!h)throw a(B.replace("{}",l)),new Error('Unknown language: "'+l+'"');const I=aB(h);let t="",c=N||I;const C={},e=new b.__emitter(b);L();let d="",o=0,m=0,w=0,y=!1;try{if(h.__emitTokens)h.__emitTokens(i,e);else{for(c.matcher.considerAll();;){w++,y?y=!1:c.matcher.considerAll(),c.matcher.lastIndex=m;const a=c.matcher.exec(i);if(!a)break;const b=i.substring(m,a.index),d=D(b,a);m=a.index+d}D(i.substring(m))}return e.finalize(),t=e.toHTML(),{language:l,value:t,relevance:o,illegal:!1,_emitter:e,_top:c}}catch(a){if(a.message&&a.message.includes("Illegal"))return{language:l,value:k(i),illegal:!0,relevance:0,_illegalBy:{message:a.message,index:m,context:i.slice(m-100,m+100),mode:a.mode,resultSoFar:t},_emitter:e};if(j)return{language:l,value:k(i),illegal:!1,relevance:0,errorRaised:a,_emitter:e,_top:c};throw a}}function N(a){const c={value:k(a),illegal:!1,relevance:0,_top:A,_emitter:new b.__emitter(b)};return c._emitter.addText(a),c}function v(c,a){a=a||b.languages||Object.keys(g);const h=N(c),d=a.filter(f).filter(x).map(a=>u(a,c,!1));d.unshift(h);const i=d.sort((a,b)=>{if(a.relevance!==b.relevance)return b.relevance-a.relevance;if(a.language&&b.language){if(f(a.language).supersetOf===b.language)return 1;if(f(b.language).supersetOf===a.language)return-1}return 0}),[j,k]=i,e=j;return e.secondBest=k,e}function M(a,b,c){const d=b&&h[b]||c;a.classList.add("hljs"),a.classList.add(`language-${d}`)}function o(a){let f=null;const d=S(a);if(z(d))return;if(m("before:highlightElement",{el:a,language:d}),a.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",a);return}if(a.children.length>0)if(b.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(a)),b.throwUnescapedHTML){const b=new E("One of your code blocks includes unescaped HTML.",a.innerHTML);throw b}f=a;const e=f.textContent,c=d?w(e,{language:d,ignoreIllegals:!0}):v(e);a.innerHTML=c.value,a.dataset.highlighted="yes",M(a,d,c.language),a.result={language:c.language,re:c.relevance,relevance:c.relevance},c.secondBest&&(a.secondBest={language:c.secondBest.language,relevance:c.secondBest.relevance}),m("after:highlightElement",{el:a,result:c,text:e})}function D(a){b=s(b,a)}const L=()=>{n(),c("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function F(){n(),c("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let C=!1;function n(){function a(){n()}if(document.readyState==="loading"){C||window.addEventListener("DOMContentLoaded",a,!1),C=!0;return}const c=document.querySelectorAll(b.cssSelector);c.forEach(o)}function H(c,d){let b=null;try{b=d(e)}catch(d){if(a("Language definition for '{}' could not be registered.".replace("{}",c)),!j)throw d;a(d),b=A}b.name||(b.name=c),g[c]=b,b.rawDefinition=d.bind(null,e),b.aliases&&y(b.aliases,{languageName:c})}function I(a){delete g[a];for(const b of Object.keys(h))h[b]===a&&delete h[b]}function J(){return Object.keys(g)}function f(a){return a=(a||"").toLowerCase(),g[a]||g[h[a]]}function y(a,{languageName:b}){typeof a=="string"&&(a=[a]),a.forEach(a=>{h[a.toLowerCase()]=b})}function x(b){const a=f(b);return a&&!a.disableAutodetect}function O(a){a["before:highlightBlock"]&&!a["before:highlightElement"]&&(a["before:highlightElement"]=b=>{a["before:highlightBlock"](Object.assign({block:b.el},b))}),a["after:highlightBlock"]&&!a["after:highlightElement"]&&(a["after:highlightElement"]=b=>{a["after:highlightBlock"](Object.assign({block:b.el},b))})}function Q(a){O(a),l.push(a)}function R(b){const a=l.indexOf(b);a!==-1&&l.splice(a,1)}function m(b,c){const a=b;l.forEach(function(b){b[a]&&b[a](c)})}function T(a){return c("10.7.0","highlightBlock will be removed entirely in v12.0"),c("10.7.0","Please use highlightElement now."),o(a)}Object.assign(e,{highlight:w,highlightAuto:v,highlightAll:n,highlightElement:o,highlightBlock:T,configure:D,initHighlighting:L,initHighlightingOnLoad:F,registerLanguage:H,unregisterLanguage:I,listLanguages:J,getLanguage:f,registerAliases:y,autoDetection:x,inherit:s,addPlugin:Q,removePlugin:R}),e.debugMode=function(){j=!1},e.safeMode=function(){j=!0},e.versionString=X,e.regex={concat:d,lookahead:K,either:t,optional:az,anyNumberOfTimes:aA};for(const a in i)typeof i[a]=="object"&&aa(i[a]);return Object.assign(e,i),e},e=u({}),e.newInstance=()=>u({}),ax.exports=e,e.HighlightJS=e,e.default=e}}),l=j(k()),a=l.default,g="[A-Za-z$_][0-9A-Za-z$_]*",o=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],p=["true","false","null","undefined","NaN","Infinity"],f=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],e=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],d=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],t=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],u=[].concat(d,f,e);function v(a){const c=a.regex,O=(a,{after:b})=>{const c="",end:""},G=/<[A-Za-z0-9\\._:-]+\s*\/>/,j={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(a,b)=>{const c=a[0].length+a.index,d=a.input[c];if(d==="<"||d===","){b.ignoreMatch();return}d===">"&&(O(a,{after:c})||b.ignoreMatch());let e;const f=a.input.substring(c);if(e=f.match(/^\s*=/)){b.ignoreMatch();return}if(e=f.match(/^\s+extends\s+/))if(e.index===0){b.ignoreMatch();return}}},i={$pattern:g,keyword:o,literal:p,built_in:u,"variable.language":t},r="[0-9](_?[0-9])*",l=`\\.(${r})`,q=`0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`,D={className:"number",variants:[{begin:`(\\b(${q})((${l})|\\.)?|(${l}))[eE][+-]?(${r})\\b`},{begin:`\\b(${q})\\b((${l})\\b|\\.)?|(${l})\\b`},{begin:`\\b(0|[1-9](_?[0-9])*)n\\b`},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},h={className:"subst",begin:"\\$\\{",end:"\\}",keywords:i,contains:[]},v={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[a.BACKSLASH_ESCAPE,h],subLanguage:"xml"}},w={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[a.BACKSLASH_ESCAPE,h],subLanguage:"css"}},x={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[a.BACKSLASH_ESCAPE,h],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,h]},E=a.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:b+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),m={className:"comment",variants:[E,a.C_BLOCK_COMMENT_MODE,a.C_LINE_COMMENT_MODE]},B=[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,v,w,x,y,{match:/\$\d+/},D];h.contains=B.concat({begin:/\{/,end:/\}/,keywords:i,contains:["self"].concat(B)});const C=[].concat(m,h.contains),n=C.concat([{begin:/(\s*)\(/,end:/\)/,keywords:i,contains:["self"].concat(C)}]),k={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i,contains:n},F={variants:[{match:[/class/,/\s+/,b,/\s+/,/extends/,/\s+/,c.concat(b,"(",c.concat(/\./,b),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,b],scope:{1:"keyword",3:"title.class"}}]},s={relevance:0,match:c.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...f,...e]}},H={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},I={variants:[{match:[/function/,/\s+/,b,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[k],illegal:/%/},J={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function K(a){return c.concat("(?!",a.join("|"),")")}const L={match:c.concat(/\b/,K([...d,"super","import"].map(a=>`${a}\\s*\\(`)),b,c.lookahead(/\s*\(/)),className:"title.function",relevance:0},M={begin:c.concat(/\./,c.lookahead(c.concat(b,/(?![0-9A-Za-z$_(])/))),end:b,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},N={match:[/get|set/,/\s+/,b,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},k]},A="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+a.UNDERSCORE_IDENT_RE+")\\s*=>",P={match:[/const|var|let/,/\s+/,b,/\s*/,/=\s*/,/(async\s*)?/,c.lookahead(A)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[k]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{PARAMS_CONTAINS:n,CLASS_REFERENCE:s},illegal:/#(?![$_A-z])/,contains:[a.SHEBANG({label:"shebang",binary:"node",relevance:5}),H,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,v,w,x,y,m,{match:/\$\d+/},D,s,{scope:"attr",match:b+c.lookahead(":"),relevance:0},P,{begin:"("+a.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[m,a.REGEXP_MODE,{className:"function",begin:A,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:a.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i,contains:n}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:z.begin,end:z.end},{match:G},{begin:j.begin,"on:begin":j.isTrulyOpeningTag,end:j.end}],subLanguage:"xml",contains:[{begin:j.begin,end:j.end,skip:!0,contains:["self"]}]}]},I,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+a.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[k,a.inherit(a.TITLE_MODE,{begin:b,className:"title.function"})]},{match:/\.\.\./,relevance:0},M,{match:"\\$"+b,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[k]},L,J,F,N,{match:/\$[(.]/}]}}function w(a){const c={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},d={match:/[{}[\],:]/,className:"punctuation",relevance:0},b=["true","false","null"],e={scope:"literal",beginKeywords:b.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:b},contains:[c,d,a.QUOTE_STRING_MODE,e,a.C_NUMBER_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}function x(a){const l=a.regex,b={},h={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[b]}]};Object.assign(b,{className:"variable",variants:[{begin:l.concat(/\$[\w\d#@][\w\d_]*/,`(?![\\w\\d])(?![$])`)},h]});const c={className:"subst",begin:/\$\(/,end:/\)/,contains:[a.BACKSLASH_ESCAPE]},f=a.inherit(a.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),g={begin:/<<-?\s*(?=\w+)/,starts:{contains:[a.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},d={className:"string",begin:/"/,end:/"/,contains:[a.BACKSLASH_ESCAPE,b,c]};c.contains.push(d);const i={match:/\\"/},j={className:"string",begin:/'/,end:/'/},k={match:/\\'/},e={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},a.NUMBER_MODE,b]},m=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],n=a.SHEBANG({binary:`(${m.join("|")})`,relevance:10}),o={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[a.inherit(a.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},p=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],q=["true","false"],r={match:/(\/[a-z._-]+)+/},s=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],t=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],u=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],v=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:p,literal:q,built_in:[...s,...t,"set","shopt",...u,...v]},contains:[n,a.SHEBANG(),o,e,f,g,r,d,i,j,k,b]}}function y(b){const a=b.regex,c=a.concat(/[\p{L}_]/u,a.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),j=/[\p{L}0-9._:-]+/u,e={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},f={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},h=b.inherit(f,{begin:/\(/,end:/\)/}),i=b.inherit(b.APOS_STRING_MODE,{className:"string"}),g=b.inherit(b.QUOTE_STRING_MODE,{className:"string"}),d={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[f,g,i,h,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[f,h,g,i]}]}]},b.COMMENT(//,{relevance:10}),{begin://,relevance:10},e,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[g]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[d],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[d],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:a.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:c,relevance:0,starts:d}]},{className:"tag",begin:a.concat(/<\//,a.lookahead(a.concat(c,/>/))),contains:[{className:"name",begin:c,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function c(a){const c=a.regex,d={className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},b=a.COMMENT();b.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const e={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/}]},f={className:"literal",begin:/\bon|off|true|false|yes|no\b/},h={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},l={begin:/\[/,end:/\]/,contains:[b,f,e,h,d,"self"],relevance:0},i=/[A-Za-z0-9_-]+/,j=/"(\\"|[^"])*"/,k=/'[^']*'/,g=c.either(i,j,k),m=c.concat(g,"(\\s*\\.\\s*",g,")*",c.lookahead(/\s*=\s*[^#\s]/));return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[b,{className:"section",begin:/\[+/,end:/\]+/},{begin:m,className:"attr",starts:{end:/$/,contains:[b,l,f,e,h,d]}}]}}function A(a){const c="true false yes no null",b="[\\w#;/?:@&=+$,.~*'()[\\]]+",n={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},j={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},h={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},g={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[a.BACKSLASH_ESCAPE,j]},q=a.inherit(g,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),i="[0-9]{4}(-[0-9][0-9]){0,2}",r="([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?",k="(\\.[0-9]*)?",l="([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?",m={className:"number",begin:"\\b"+i+r+k+l+"\\b"},d={end:",",endsWithParent:!0,excludeEnd:!0,keywords:c,relevance:0},o={begin:/\{/,end:/\}/,contains:[d],illegal:"\\n",relevance:0},p={begin:"\\[",end:"\\]",contains:[d],illegal:"\\n",relevance:0},f=[n,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+b},{className:"type",begin:"!<"+b+">"},{className:"type",begin:"!"+b},{className:"type",begin:"!!"+b},{className:"meta",begin:"&"+a.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+a.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},a.HASH_COMMENT_MODE,{beginKeywords:c,keywords:{literal:c}},m,{className:"number",begin:a.C_NUMBER_RE+"\\b",relevance:0},o,p,h,g],e=[...f];return e.pop(),e.push(q),d.contains=e,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:f}}function B(d){const n=d.regex,e={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},m={begin:"^[-\\*]{3,}",end:"$"},l={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},k={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},j={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},i=/[A-Za-z][A-Za-z0-9+.-]*/,h={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:n.concat(/\[.+?\]\(/,i,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},b={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},c={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},g=d.inherit(b,{contains:[]}),f=d.inherit(c,{contains:[]});b.contains.push(f),c.contains.push(g);let a=[e,h];[b,c,g,f].forEach(b=>{b.contains=b.contains.concat(a)}),a=a.concat(b,c);const o={className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:a},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:a}]}]},p={className:"quote",begin:"^>\\s+",contains:a,end:"$"},q={scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/};return{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[o,e,k,b,c,p,l,m,h,j,q]}}a.registerLanguage("javascript",v),a.registerLanguage("json",w),a.registerLanguage("bash",x),a.registerLanguage("html",y),a.registerLanguage("ini",c),a.registerLanguage("toml",c),a.registerLanguage("yaml",A),a.registerLanguage("md",B),document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("pre code:not(.language-mermaid)").forEach(b=>{a.highlightElement(b)})})})() \ No newline at end of file diff --git a/static/css/vendor/.gitkeep b/js/vendor/.gitkeep similarity index 100% rename from static/css/vendor/.gitkeep rename to js/vendor/.gitkeep diff --git a/layouts/404.html b/layouts/404.html deleted file mode 100644 index f1fe6bff..00000000 --- a/layouts/404.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ define "main" }} -
                    -
                    -
                    -

                    Page not found :(

                    -

                    The page you are looking for doesn't exist or has been moved.

                    -
                    -
                    -
                    -{{ end }} \ No newline at end of file diff --git a/layouts/_default/_markup/render-heading.html b/layouts/_default/_markup/render-heading.html deleted file mode 100644 index 8abeac6c..00000000 --- a/layouts/_default/_markup/render-heading.html +++ /dev/null @@ -1 +0,0 @@ -{{ .Text | safeHTML }} diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html deleted file mode 100644 index 18e7a3c8..00000000 --- a/layouts/_default/_markup/render-image.html +++ /dev/null @@ -1,27 +0,0 @@ -{{ $image := .Page.Resources.GetMatch .Destination -}} -{{ $lqip := $image.Resize site.Params.lqipWidth -}} - -{{ $imgSrc := "" -}} -{{ $imgSrcSet := slice -}} - -{{ $widths := site.Params.landscapePhotoWidths -}} -{{ if gt $image.Height $image.Width -}} - {{ $widths = site.Params.portraitPhotoWidths -}} -{{ end -}} - -{{ range $widths -}} - {{ $srcUrl := (printf "%dx" . | $image.Resize).Permalink -}} - {{ if eq $imgSrc "" -}}{{ $imgSrc = $srcUrl -}}{{ end -}} - {{ $imgSrcSet = $imgSrcSet | append (printf "%s %dw" $srcUrl .) -}} -{{ end -}} -{{ $imgSrcSet = (delimit $imgSrcSet ",") -}} - -{{ if gt $image.Width site.Params.smallLimit -}} -
                    - {{ $.Text }} - - {{ with $.Title }}
                    {{ . | safeHTML }}
                    {{ end -}} -
                    -{{ else -}} - {{ $.Text }} -{{ end -}} diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html deleted file mode 100644 index 887373d6..00000000 --- a/layouts/_default/baseof.html +++ /dev/null @@ -1,27 +0,0 @@ - - - {{ partial "head/head.html" . }} - {{ if eq .Kind "home" -}} - {{ .Scratch.Set "class" "home" -}} - {{ else if eq .Kind "404" -}} - {{ .Scratch.Set "class" "error404" -}} - {{ else if eq .Kind "page" -}} - {{ .Scratch.Set "class" .Type -}} - {{ .Scratch.Add "class" " single" -}} - {{ else -}} - {{ .Scratch.Set "class" .Type -}} - {{ .Scratch.Add "class" " list" -}} - {{ end -}} - - {{ partial "header/header.html" . }} -
                    -
                    - {{ block "main" . }}{{ end }} -
                    -
                    - {{ block "sidebar-prefooter" . }}{{ end }} - {{ block "sidebar-footer" . }}{{ end }} - {{ partial "footer/footer.html" . }} - {{ partial "footer/script-footer.html" . }} - - \ No newline at end of file diff --git a/layouts/_default/index.js b/layouts/_default/index.js deleted file mode 100644 index 9f764f91..00000000 --- a/layouts/_default/index.js +++ /dev/null @@ -1,10 +0,0 @@ -var docs = [ -{{ range $index, $page := (where .Site.Pages "Section" "docs") -}} - { - id: {{ $index }}, - title: "{{ .Title }}", - description: "{{ .Params.description }}", - href: "{{ .URL | relURL }}" - }, -{{ end -}} -]; \ No newline at end of file diff --git a/layouts/_default/index.json b/layouts/_default/index.json deleted file mode 100644 index 68428715..00000000 --- a/layouts/_default/index.json +++ /dev/null @@ -1,5 +0,0 @@ -{{- $.Scratch.Add "index" slice -}} -{{- range .Site.RegularPages -}} - {{- $.Scratch.Add "index" (dict "title" .Title "description" .Params.description "contents" .Plain "RelPermalink" .RelPermalink) -}} -{{- end -}} -{{- $.Scratch.Get "index" | jsonify -}} \ No newline at end of file diff --git a/layouts/_default/list.html b/layouts/_default/list.html deleted file mode 100644 index 1401ccdf..00000000 --- a/layouts/_default/list.html +++ /dev/null @@ -1,13 +0,0 @@ -{{ define "main" }} -
                    -
                    - {{ range .Paginator.Pages }} - - {{ end }} - {{ template "_internal/pagination.html" . }} -
                    -
                    -{{ end }} \ No newline at end of file diff --git a/layouts/_default/section.sitemap.xml b/layouts/_default/section.sitemap.xml deleted file mode 100644 index 701951d6..00000000 --- a/layouts/_default/section.sitemap.xml +++ /dev/null @@ -1,46 +0,0 @@ -{{ printf "" | safeHTML -}} - - {{ range $i, $e := .Data.Pages -}} - {{ if ne .Params.sitemap_exclude true }} - - {{ .Permalink }}{{ if not .Lastmod.IsZero }} - {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} - {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} - {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} - {{ end }} - {{ end }} - - {{ end -}} - {{ end -}} - {{ range .Sections -}} - {{ range $i, $e := .Data.Pages -}} - {{ if ne .Params.sitemap_exclude true -}} - - {{ .Permalink }}{{ if not .Lastmod.IsZero }} - {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} - {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} - {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} - {{ end }} - {{ end }} - - {{ end -}} - {{ end -}} - {{ end -}} - \ No newline at end of file diff --git a/layouts/_default/single.html b/layouts/_default/single.html deleted file mode 100644 index 2f8fc999..00000000 --- a/layouts/_default/single.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ define "main" }} -
                    -
                    -
                    -

                    {{ .Title }}

                    - {{ .Content }} -
                    -
                    -
                    -{{ end }} diff --git a/layouts/_default/versions.html b/layouts/_default/versions.html deleted file mode 100644 index 3101b825..00000000 --- a/layouts/_default/versions.html +++ /dev/null @@ -1,27 +0,0 @@ -{{ define "main" }} -
                    -

                    {{ .Title }}

                    -

                    {{ .Params.lead | safeHTML }}

                    - {{ .Content }} -
                    - {{ range $release := sort (index $.Site.Data "docs-versions") "group" "desc" -}} -
                    -

                    {{ $release.group }}

                    -

                    {{ $release.description }}

                    - {{ $versions := sort $release.versions "v" "desc" -}} - {{ range $i, $version := $versions -}} - {{ $len := len $versions -}} - {{ if (eq $i 0) }}{{ end }} - {{ end -}} -
                    - {{ end -}} -
                    -
                    -{{ end }} diff --git a/layouts/blog/list.html b/layouts/blog/list.html deleted file mode 100644 index 9695387c..00000000 --- a/layouts/blog/list.html +++ /dev/null @@ -1,24 +0,0 @@ -{{ define "main" }} -
                    -
                    -
                    -

                    {{ .Title }}

                    -
                    {{ .Content }}
                    -
                    - {{ $paginator := .Paginate (.Data.Pages) -}} - {{ range $paginator.Pages -}} -
                    -
                    -

                    {{ .Params.title }}

                    -

                    {{ .Params.lead | safeHTML }}

                    - {{ partial "main/blog-meta.html" . -}} -
                    -
                    - {{ end -}} - {{ $.Scratch.Set "paginator" true }} - {{ template "_internal/pagination.html" . }} -
                    -
                    -
                    -
                    -{{ end }} \ No newline at end of file diff --git a/layouts/blog/single.html b/layouts/blog/single.html deleted file mode 100644 index 48fdb82a..00000000 --- a/layouts/blog/single.html +++ /dev/null @@ -1,14 +0,0 @@ -{{ define "main" }} -
                    -
                    -
                    -
                    -

                    {{ .Title }}

                    - {{ partial "main/blog-meta.html" . }} -
                    -

                    {{ .Params.lead | safeHTML }}

                    - {{ .Content }} -
                    -
                    -
                    -{{ end }} \ No newline at end of file diff --git a/layouts/contributors/list.html b/layouts/contributors/list.html deleted file mode 100644 index adc53aad..00000000 --- a/layouts/contributors/list.html +++ /dev/null @@ -1,23 +0,0 @@ -{{ define "main" }} -
                    -
                    -
                    -

                    {{ .Title }}

                    -
                    {{ .Content }}
                    -
                    - {{ range .Data.Pages -}} -
                    -
                    -

                    {{ .Params.title }}

                    - {{ if eq .Section "blog" -}} -

                    {{ .Params.lead | safeHTML }}

                    - {{ partial "main/blog-meta.html" . -}} - {{ end -}} -
                    -
                    - {{ end -}} -
                    -
                    -
                    -
                    -{{ end }} \ No newline at end of file diff --git a/layouts/docs/list.html b/layouts/docs/list.html deleted file mode 100644 index c860531b..00000000 --- a/layouts/docs/list.html +++ /dev/null @@ -1,22 +0,0 @@ -{{ define "main" }} -
                    -
                    -
                    -

                    {{ .Title }}

                    -
                    {{ .Content }}
                    -
                    - {{ $currentSection := .CurrentSection }} - {{ range where .Site.RegularPages.ByTitle "Section" .Section }} - {{ if in (.RelPermalink | string) $currentSection.RelPermalink }} - - {{ end }} - {{ end }} -
                    -
                    -
                    -
                    -{{ end }} \ No newline at end of file diff --git a/layouts/docs/single.html b/layouts/docs/single.html deleted file mode 100644 index 28bb90b2..00000000 --- a/layouts/docs/single.html +++ /dev/null @@ -1,48 +0,0 @@ -{{ define "main" }} -
                    -
                    - -
                    - {{ if ne .Params.toc false -}} - - {{ end -}} - {{ if .Params.toc -}} -
                    - {{ else -}} -
                    - {{ end -}} - {{ if .Site.Params.options.breadCrumb -}} - - - {{ end }} -

                    {{ .Title }}

                    -

                    {{ .Params.lead | safeHTML }}

                    - {{ if ne .Params.toc false -}} - - {{ end -}} - {{ .Content }} - {{ if .Site.Params.editPage -}} - {{ partial "main/edit-page.html" . }} - {{ end -}} - {{ partial "main/docs-navigation.html" . }} - -
                    -
                    -{{ end }} diff --git a/layouts/index.html b/layouts/index.html deleted file mode 100644 index 92a1db99..00000000 --- a/layouts/index.html +++ /dev/null @@ -1,138 +0,0 @@ -{{ define "main" }} -
                    -
                    -
                    -

                    {{ .Title }}

                    -
                    -
                    -

                    {{ .Params.lead | safeHTML }}

                    - Get Started -

                    Get the source on GitHub

                    -
                    -
                    -
                    -{{ end }} - -{{ define "sidebar-prefooter" }} -{{ if eq $.Site.Language.LanguageName "English" }} -
                    -
                    -
                    -
                    -

                    Secure 🔒

                    -

                    Minimal emulated devices and implemented in Rust to avoid many common security issues

                    -
                    -
                    -

                    Fast ⚡️

                    -

                    Boot to userspace in less than 100ms with direct kernel boot

                    -
                    -
                    -

                    🪟 & 🐧

                    -

                    Supports running modern Linux and Windows guests

                    -
                    -
                    -
                    -
                    -

                    Kata Containers

                    -

                    Supported by Kata Containers for running secure containerised workloads

                    -
                    -
                    -

                    Powerful REST API

                    -

                    Programmatically control the lifecyle of the VM using an HTTP API

                    -
                    -
                    -

                    Slim

                    -

                    Minimal memory overhead for dense deployments

                    -
                    -
                    -
                    -
                    -

                    Cross platform

                    -

                    Runs on both x86-64 and aarch64

                    -
                    -
                    -

                    Broad device support

                    -

                    Support for wide range of paravirtualised devices and physical device passthrough

                    -
                    -
                    -

                    Live migration

                    -

                    Migrate VMs from one host to another without interruption

                    -
                    -
                    -
                    -
                    -
                    -
                    -
                    -
                    -

                    Get Involved:

                    - -

                    Cloud Hypervisor is governed openly as part of the Linux Foundation and supported by multiple organisations: -

                    -
                      -
                    • Alibaba
                    • -
                    • AMD
                    • -
                    • Ampere
                    • -
                    • ARM
                    • -
                    • ByteDance
                    • -
                    • Cyberus Technology
                    • -
                    • Intel
                    • -
                    • Microsoft
                    • -
                    • SAP
                    • -
                    • Tencent Cloud
                    • -
                    - -

                    Join our Slack community: Invite -

                    -

                    Participate in our community activities: Slack channel -

                    -

                    Check out and participate in our roadmap on - GitHub -

                    -

                    For full details of our governance model please see our community repository on GitHub and our - founding - charter. -

                    -

                    For bug reports please use GitHub - isssues; for broader community discussions please use our mailing list -

                    -
                    -
                    -

                    Latest news from Cloud Hypervisor project:

                    -
                    - {{ range first 1 (where .Site.RegularPages.ByDate.Reverse "Section" "blog") -}} -
                    -
                    -
                    -
                    -

                    {{ .Params.title }}

                    - {{ partial "main/blog-meta.html" . }} -
                    -

                    {{ .Params.lead | safeHTML }}

                    - {{ .Content }} -
                    -
                    - {{ end -}} -
                    -
                    -
                    -
                    -
                    -{{ end }} -{{ end }} - -{{ define "sidebar-footer" }} -
                    -
                    -
                    - {{- .Content -}} -
                    -
                    -
                    -{{ end }} diff --git a/layouts/partials/footer/footer.html b/layouts/partials/footer/footer.html deleted file mode 100644 index bd260306..00000000 --- a/layouts/partials/footer/footer.html +++ /dev/null @@ -1,18 +0,0 @@ -
                    -
                    -
                    -
                    -
                      -
                    • {{ .Site.Params.footer | safeHTML }}
                    • -
                    -
                    -
                    -
                      - {{ range .Site.Menus.footer -}} -
                    • {{ .Name }}
                    • - {{ end -}} -
                    -
                    -
                    -
                    -
                    \ No newline at end of file diff --git a/layouts/partials/footer/script-footer.html b/layouts/partials/footer/script-footer.html deleted file mode 100644 index 159ad3ff..00000000 --- a/layouts/partials/footer/script-footer.html +++ /dev/null @@ -1,105 +0,0 @@ -{{ $indexTemplate := resources.Get "js/index.js" -}} -{{ $index := $indexTemplate | resources.ExecuteAsTemplate "index.js" . -}} - -{{ $bs := resources.Get "js/bootstrap.js" -}} -{{ $bs := $bs | js.Build -}} - -{{ $highlight := resources.Get "js/highlight.js" -}} -{{ $highlight := $highlight | js.Build -}} - -{{ $katex := resources.Get "js/vendor/katex/dist/katex.js" -}} -{{ $katexAutoRender := resources.Get "js/vendor/katex/dist/contrib/auto-render.js" -}} - -{{ $mermaid := resources.Get "js/mermaid.js" | js.Build -}} - -{{ $app := resources.Get "js/app.js" -}} - -{{ $slice := slice $app -}} - -{{ if .Site.Params.options.lazySizes -}} - {{ $lazySizes := resources.Get "js/lazysizes.js" -}} - {{ $lazySizes := $lazySizes | js.Build -}} - {{ $slice = $slice | append $lazySizes -}} -{{ end -}} - -{{ if .Site.Params.options.clipBoard -}} - {{ $clipBoard := resources.Get "js/clipboard.js" -}} - {{ $clipBoard := $clipBoard | js.Build -}} - {{ $slice = $slice | append $clipBoard -}} -{{ end -}} - -{{ if .Site.Params.options.instantPage -}} - {{ $instantPage := resources.Get "js/instant.page.js" -}} - {{ $instantPage := $instantPage | js.Build -}} - {{ $slice = $slice | append $instantPage -}} -{{ end -}} - -{{ if .Site.Params.options.flexSearch -}} - {{ $flexSearch := resources.Get "js/vendor/flexsearch/dist/flexsearch.bundle.js" -}} - {{ $slice = $slice | append $flexSearch -}} -{{ end -}} - -{{ if .Site.Params.options.darkMode -}} - {{ $darkMode := resources.Get "js/darkmode.js" -}} - {{ $darkMode := $darkMode | js.Build -}} - {{ $slice = $slice | append $darkMode -}} -{{ end -}} - -{{ if .Site.Params.alertDismissable -}} - {{ $alert := resources.Get "js/alert.js" -}} - {{ $alert := $alert | js.Build -}} - {{ $slice = $slice | append $alert -}} -{{ end -}} - -{{ if .Site.Params.options.kaTex -}} - {{ $katexConfig := resources.Get "js/katex.js" -}} - {{ $katexConfig := $katexConfig | js.Build -}} - {{ $slice = $slice | append $katexConfig -}} -{{ end -}} - -{{ $js := $slice | resources.Concat "main.js" -}} - -{{ if eq (hugo.Environment) "development" -}} - {{ if .Site.Params.options.bootStrapJs -}} - - {{ end -}} - {{ if .Site.Params.options.highLight -}} - - {{ end -}} - {{ if .Site.Params.options.kaTex -}} - - - {{ end -}} - - {{ with .Params.mermaid -}} - - {{ end -}} - {{ if and (.Site.Params.options.flexSearch) (eq .Section "docs") -}} - - {{ end -}} -{{ else -}} - {{ $js := $js | minify | fingerprint "sha512" -}} - {{ $index := $index | minify | fingerprint "sha512" -}} - {{ $bs := $bs | minify | fingerprint "sha512" -}} - {{ $highlight := $highlight | minify | fingerprint "sha512" -}} - {{ $katex := $katex | minify | fingerprint "sha512" -}} - {{ $katexAutoRender := $katexAutoRender | minify | fingerprint "sha512" -}} - {{ $mermaid := $mermaid | minify | fingerprint "sha512" -}} - {{ if .Site.Params.options.bootStrapJs -}} - - {{ end -}} - {{ if .Site.Params.options.highLight -}} - - {{ end -}} - {{ if .Site.Params.options.kaTex -}} - - - {{ end -}} - - {{ with .Params.mermaid -}} - - {{ end -}} - {{ if and (.Site.Params.options.flexSearch) (eq .Section "docs") -}} - - {{ end -}} -{{ end -}} \ No newline at end of file diff --git a/layouts/partials/head/favicons.html b/layouts/partials/head/favicons.html deleted file mode 100644 index c034df1f..00000000 --- a/layouts/partials/head/favicons.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/layouts/partials/head/head.html b/layouts/partials/head/head.html deleted file mode 100644 index 9c1ecb35..00000000 --- a/layouts/partials/head/head.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - {{ block "head/resource-hints" . }}{{ partial "head/resource-hints.html" . }}{{ end }} - {{ block "head/script-header" . }}{{ partial "head/script-header.html" . }}{{ end }} - {{ block "head/stylesheet" . }}{{ partial "head/stylesheet.html" . }}{{ end }} - {{ block "head/seo" . }}{{ partial "head/seo.html" . }}{{ end }} - {{ block "head/favicons" . }}{{ partial "head/favicons.html" . }}{{ end }} - \ No newline at end of file diff --git a/layouts/partials/head/opengraph.html b/layouts/partials/head/opengraph.html deleted file mode 100644 index 6127e826..00000000 --- a/layouts/partials/head/opengraph.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - -{{ if $.Scratch.Get "paginator" -}} - {{ $paginator := .Paginate (where .Site.RegularPages.ByDate.Reverse "Section" "blog" ) -}} - -{{ else -}} - -{{ end -}} -{{ with .Site.Params.title -}} - -{{ end -}} - -{{ $iso8601 := "2006-01-02T15:04:05-07:00" -}} -{{ if .IsPage -}} - {{ if not .PublishDate.IsZero -}} - - {{ else if not .Date.IsZero -}} - - {{ end -}} - {{ if not .Lastmod.IsZero -}} - - {{ end -}} -{{ else -}} - {{ if not .Date.IsZero -}} - - {{ end -}} -{{ end -}} - -{{ if eq .Kind "home" -}} - {{ .Scratch.Set "title" .Site.Params.titleHome -}} -{{ else -}} - {{ .Scratch.Set "title" .Title -}} -{{ end -}} - -{{ with $.Params.images -}} - {{ range first 6 . -}} - - {{ end -}} -{{ else -}} - {{ $images := $.Resources.ByType "image" -}} - {{ $featured := $images.GetMatch "*feature*" -}} - {{ if not $featured -}} - {{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }} - {{ end -}} - {{ with $featured -}} - - {{ else -}} - {{ with $.Site.Params.images -}} - - - {{ end -}} - {{ end -}} -{{ end -}} - -{{ with $.Site.Params.images -}} - {{ $.Scratch.Set "primaryImage" (index . 0 | absURL) -}} -{{ end -}} - -{{ with .Params.audio -}} - -{{ end -}} - -{{ with .Params.videos -}} - {{ range . -}} - - {{ end -}} -{{ end -}} diff --git a/layouts/partials/head/resource-hints.html b/layouts/partials/head/resource-hints.html deleted file mode 100644 index 3baa7116..00000000 --- a/layouts/partials/head/resource-hints.html +++ /dev/null @@ -1,6 +0,0 @@ - - -{{ if .Site.Params.options.kaTex -}} - - -{{ end -}} \ No newline at end of file diff --git a/layouts/partials/head/script-header.html b/layouts/partials/head/script-header.html deleted file mode 100644 index 0155989a..00000000 --- a/layouts/partials/head/script-header.html +++ /dev/null @@ -1,4 +0,0 @@ -{{ if .Site.Params.options.darkMode -}} - {{ $darkModeInit := resources.Get "js/darkmode-init.js" | js.Build | minify -}} - -{{ end -}} \ No newline at end of file diff --git a/layouts/partials/head/seo.html b/layouts/partials/head/seo.html deleted file mode 100644 index b736763e..00000000 --- a/layouts/partials/head/seo.html +++ /dev/null @@ -1,47 +0,0 @@ -{{ if eq .Kind "404" -}} - -{{ else -}} - {{ with .Params.robots -}} - - {{ else -}} - - - - {{ end -}} -{{ end -}} - -{{ if .IsHome -}} - {{ .Site.Params.title }} {{ .Site.Params.titleSeparator }} {{ .Site.Params.titleAddition }} -{{ else -}} - {{ .Title }} {{ .Site.Params.titleSeparator }} {{ .Site.Params.title }} -{{ end -}} - -{{ with .Description -}} - -{{ else -}} - {{ with .Summary | plainify -}} - - {{ else -}} - - {{ end -}} -{{ end -}} - -{{ if $.Scratch.Get "paginator" }} - - {{ if .Paginator.HasPrev -}} - - {{ end -}} - {{ if .Paginator.HasNext -}} - - {{ end -}} -{{ else -}} - -{{ end -}} - -{{ partial "head/opengraph.html" . }} - -{{ range .AlternativeOutputFormats -}} - -{{ end -}} - -{{ partial "head/structured-data.html" . }} diff --git a/layouts/partials/head/structured-data.html b/layouts/partials/head/structured-data.html deleted file mode 100644 index 1f153a35..00000000 --- a/layouts/partials/head/structured-data.html +++ /dev/null @@ -1,210 +0,0 @@ -{{ $baseURL := "/" | absURL -}} - -{{ $dot := . -}} -{{ $dot.Scratch.Set "path" "" -}} -{{ $dot.Scratch.Set "breadcrumb" slice -}} - -{{ $url := replace .Permalink ( printf "%s" .Site.BaseURL) "" -}} -{{ $.Scratch.Add "path" .Site.BaseURL -}} - -{{ $.Scratch.Add "breadcrumb" (slice (dict "url" .Site.BaseURL "name" "home" "position" 1 )) -}} - {{ range $index, $element := split $url "/" -}} - {{ $dot.Scratch.Add "path" $element -}} - {{ $.Scratch.Add "path" "/" -}} - {{ if ne $element "" -}} - {{ $.Scratch.Add "breadcrumb" (slice (dict "url" ($.Scratch.Get "path") "name" . "position" (add $index 2))) -}} - {{ end -}} -{{ end -}} - - \ No newline at end of file diff --git a/layouts/partials/head/stylesheet.html b/layouts/partials/head/stylesheet.html deleted file mode 100644 index 4dc25c01..00000000 --- a/layouts/partials/head/stylesheet.html +++ /dev/null @@ -1,11 +0,0 @@ -{{ if eq (hugo.Environment) "development" -}} - {{ $options := (dict "targetPath" "main.css" "enableSourceMap" true "includePaths" (slice "node_modules")) -}} - {{ $css := resources.Get "scss/app.scss" | toCSS $options -}} - -{{ else -}} - {{ $options := (dict "targetPath" "main.css" "outputStyle" "compressed" "includePaths" (slice "node_modules")) -}} - {{ $css := resources.Get "scss/app.scss" | toCSS $options | postCSS (dict "config" "config/postcss.config.js") -}} - {{ $secureCSS := $css | resources.Fingerprint "sha512" -}} - -{{ end -}} - \ No newline at end of file diff --git a/layouts/partials/header/alert.html b/layouts/partials/header/alert.html deleted file mode 100644 index fd5970b1..00000000 --- a/layouts/partials/header/alert.html +++ /dev/null @@ -1,10 +0,0 @@ -{{ if .Site.Params.alertDismissable -}} - -{{ else -}} - -{{ end -}} diff --git a/layouts/partials/header/header.html b/layouts/partials/header/header.html deleted file mode 100644 index 428bec19..00000000 --- a/layouts/partials/header/header.html +++ /dev/null @@ -1,138 +0,0 @@ -{{ if .Site.Params.alert -}} - {{ partial "header/alert.html" . }} -{{ end -}} - -{{ if eq .Site.Params.options.flexSearch false -}} -
                    -{{ end -}} - -
                    - - - -{{ if eq .Site.Params.options.flexSearch false }} -
                    -{{ end -}} - -{{ if eq .Section "docs" -}} - - -
                    - -
                    -{{ end -}} diff --git a/layouts/partials/main/blog-meta.html b/layouts/partials/main/blog-meta.html deleted file mode 100644 index a9eb4387..00000000 --- a/layouts/partials/main/blog-meta.html +++ /dev/null @@ -1 +0,0 @@ -

                    Posted {{ .PublishDate.Format "January 2, 2006" }} by {{ if .Params.contributors -}}{{ range $index, $contributor := .Params.contributors }}{{ if gt $index 0 }} and {{ end }}{{ . }}{{ end -}}{{ end -}} ‐ {{ .ReadingTime -}} min read

                    \ No newline at end of file diff --git a/layouts/partials/main/breadcrumb.html b/layouts/partials/main/breadcrumb.html deleted file mode 100644 index 7c7d8fb7..00000000 --- a/layouts/partials/main/breadcrumb.html +++ /dev/null @@ -1,4 +0,0 @@ -{{ with .Parent -}} - {{ partial "main/breadcrumb.html" . -}} -

                    -{{ end -}} \ No newline at end of file diff --git a/layouts/partials/main/docs-navigation.html b/layouts/partials/main/docs-navigation.html deleted file mode 100644 index e6a5668a..00000000 --- a/layouts/partials/main/docs-navigation.html +++ /dev/null @@ -1,24 +0,0 @@ -{{ if or .Prev .Next -}} -
                    - - {{ $pages := where site.RegularPages "Section" .Section -}} - {{ with $pages.Next . -}} - -
                    -
                    - ← {{ .Title }} -
                    -
                    -
                    - {{ end -}} - {{ with $pages.Prev . -}} - -
                    -
                    - {{ .Title }} → -
                    -
                    -
                    - {{ end -}} -
                    -{{ end -}} \ No newline at end of file diff --git a/layouts/partials/main/edit-page.html b/layouts/partials/main/edit-page.html deleted file mode 100644 index e8c901a4..00000000 --- a/layouts/partials/main/edit-page.html +++ /dev/null @@ -1,27 +0,0 @@ -{{ $filePath := replace .File.Path "\\" "/" }} -{{ $editPath := "null" }} - -{{ if (eq .Site.Params.repoHost "GitHub") }} - {{ $editPath = "/blob/" }} -{{ else if (eq .Site.Params.repoHost "Gitea") }} - {{ $editPath = "/_edit/" }} -{{ else if (eq .Site.Params.repoHost "GitLab") }} - {{ $editPath = "/-/blob/" }} -{{ end }} - -{{ $contentPath := print .Site.Params.docsRepo $editPath .Site.Params.docsRepoBranch "/content/" }} - -{{ $url := print $contentPath $filePath }} - -{{ if .Site.Params.options.multilingualMode }} - {{ $url = print $contentPath .Lang "/" $filePath }} -{{ end }} - -

                    - - - - - Edit this page on {{ .Site.Params.repoHost }} - -

                    diff --git a/layouts/partials/sidebar/docs-menu.html b/layouts/partials/sidebar/docs-menu.html deleted file mode 100644 index cd383bbf..00000000 --- a/layouts/partials/sidebar/docs-menu.html +++ /dev/null @@ -1,39 +0,0 @@ -{{ if .Site.Params.options.collapsibleSidebar -}} -
                      - {{ $currentPage := . -}} - {{ range $index, $element := .Site.Menus.docs -}} - {{- $active := or ($currentPage.IsMenuCurrent "docs" .) ($currentPage.HasMenuCurrent "docs" .) -}} - {{- $active = or $active (eq $currentPage.Section .Identifier) -}} -
                    • - - {{ if .HasChildren -}} -
                      -
                        - {{ range .Children -}} - {{- $active := or ($currentPage.IsMenuCurrent "docs" .) ($currentPage.HasMenuCurrent "docs" .) -}} - {{- $active = or $active (eq $currentPage.Section .Identifier) -}} -
                      • {{ .Name }}
                      • - {{ end -}} -
                      -
                      - {{ end -}} -
                    • - {{ end -}} -
                    -{{ else -}} - {{ $currentPage := . -}} - {{ range .Site.Menus.docs -}} -

                    {{ .Name }}

                    - {{ if .HasChildren -}} -
                      - {{ range .Children -}} - {{- $active := or ($currentPage.IsMenuCurrent "docs" .) ($currentPage.HasMenuCurrent "docs" .) -}} - {{- $active = or $active (eq $currentPage.Section .Identifier) -}} -
                    • {{ .Name }}
                    • - {{ end -}} -
                    - {{ end -}} - {{ end -}} -{{ end -}} \ No newline at end of file diff --git a/layouts/partials/sidebar/docs-toc.html b/layouts/partials/sidebar/docs-toc.html deleted file mode 100644 index a0de898e..00000000 --- a/layouts/partials/sidebar/docs-toc.html +++ /dev/null @@ -1,6 +0,0 @@ -{{ if and (ne .Params.toc false) (ne .TableOfContents "") -}} - -{{ end -}} diff --git a/layouts/robots.txt b/layouts/robots.txt deleted file mode 100644 index 3107a650..00000000 --- a/layouts/robots.txt +++ /dev/null @@ -1,7 +0,0 @@ -User-agent: * -{{ if eq (hugo.Environment) "production" -}} -Allow: / -{{ else -}} -Disallow: / -{{ end }} -Sitemap: {{ "sitemap.xml" | absURL -}} diff --git a/layouts/rss.xml b/layouts/rss.xml deleted file mode 100644 index b8f563e9..00000000 --- a/layouts/rss.xml +++ /dev/null @@ -1,27 +0,0 @@ -{{ printf "" | safeHTML }} - - - {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }} - {{ .Permalink }} - Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} - Hugo -- gohugo.io{{ with .Site.LanguageCode }} - {{.}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Params.copyRight }} - {{ . | safeHTML }}{{end}}{{ if not .Date.IsZero }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} - {{ with .OutputFormats.Get "RSS" }} - {{ printf "" .Permalink .MediaType | safeHTML }} - {{ end }} - {{ range .Pages }}{{ if ne .Params.feed_exclude true }} - - {{ .Title }} - {{ .Permalink }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} - {{ with .Site.Author.email }}{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}} - {{ .Permalink }} - {{ .Summary | html }} - - {{ end }}{{ end }} - - diff --git a/layouts/shortcodes/alert.html b/layouts/shortcodes/alert.html deleted file mode 100644 index 7cc7eb08..00000000 --- a/layouts/shortcodes/alert.html +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/layouts/shortcodes/email.html b/layouts/shortcodes/email.html deleted file mode 100644 index 88674fcc..00000000 --- a/layouts/shortcodes/email.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/layouts/shortcodes/img-simple.html b/layouts/shortcodes/img-simple.html deleted file mode 100644 index 117bc816..00000000 --- a/layouts/shortcodes/img-simple.html +++ /dev/null @@ -1,7 +0,0 @@ -{{ $image := .Page.Resources.GetMatch (printf "*%s*" (.Get "src")) -}} -{{ $lqip := $image.Resize $.Site.Params.lqipWidth -}} -{{ if eq .Site.Params.options.lazySizes true -}} - -{{ else -}} - -{{ end -}} \ No newline at end of file diff --git a/layouts/shortcodes/img.html b/layouts/shortcodes/img.html deleted file mode 100644 index 51a6a9d0..00000000 --- a/layouts/shortcodes/img.html +++ /dev/null @@ -1,27 +0,0 @@ -{{ $image := .Page.Resources.GetMatch (printf "*%s*" (.Get "src")) -}} -{{ $lqip := $image.Resize $.Site.Params.lqipWidth -}} - -{{ $imgSrc := "" -}} -{{ $imgSrcSet := slice -}} - -{{ $widths := $.Site.Params.landscapePhotoWidths -}} -{{ if gt $image.Height $image.Width -}} - {{ $widths = $.Site.Params.portraitPhotoWidths -}} -{{ end -}} - -{{ range $widths -}} - {{ $srcUrl := (printf "%dx" . | $image.Resize).Permalink -}} - {{ if eq $imgSrc "" -}}{{ $imgSrc = $srcUrl -}}{{ end -}} - {{ $imgSrcSet = $imgSrcSet | append (printf "%s %dw" $srcUrl .) -}} -{{ end -}} -{{ $imgSrcSet = (delimit $imgSrcSet ",") -}} - - - {{ if eq .Site.Params.options.lazySizes true -}} - - {{ else -}} - - {{ end -}} - - {{ with .Get "caption" }}
                    {{ . | safeHTML }}
                    {{ end }} - diff --git a/layouts/shortcodes/mermaid.html b/layouts/shortcodes/mermaid.html deleted file mode 100644 index aeecad53..00000000 --- a/layouts/shortcodes/mermaid.html +++ /dev/null @@ -1,8 +0,0 @@ -{{ if .Page.Params.mermaid -}} -
                    - {{ $data := replaceRE "(^\\s+```)" "" .Inner -}} - {{ replaceRE "(```\\s+$)" "" $data -}} -
                    -{{ else -}} - {{ errorf "Failed to process mermaid shortcode: %s. Set mermaid to true in page front matter." .Position }} -{{ end -}} diff --git a/layouts/shortcodes/video.html b/layouts/shortcodes/video.html deleted file mode 100644 index 784c3a72..00000000 --- a/layouts/shortcodes/video.html +++ /dev/null @@ -1,11 +0,0 @@ -
                    - - {{ with .Get "webm-src" -}} - - {{ end -}} - {{ with .Get "mp4-src" -}} - - {{ end -}} - Sorry, your browser doesn't support embedded videos. - -
                    diff --git a/layouts/sitemap.xml b/layouts/sitemap.xml deleted file mode 100644 index a3fcf7ac..00000000 --- a/layouts/sitemap.xml +++ /dev/null @@ -1,22 +0,0 @@ -{{ printf "" | safeHTML }} - - {{ range .Data.Pages }}{{ if ne .Params.sitemap_exclude true }} - - {{ .Permalink }}{{ if not .Lastmod.IsZero }} - {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} - {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} - {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} - {{ end }} - {{ end }} - - {{ end }}{{ end }} - diff --git a/static/logo-doks.png b/logo-doks.png similarity index 100% rename from static/logo-doks.png rename to logo-doks.png diff --git a/static/logo-doks.svg b/logo-doks.svg similarity index 100% rename from static/logo-doks.svg rename to logo-doks.svg diff --git a/main.ad6dfe6d9ecd46a7924ef08b6981b6e7c88835c2adb41e8a44583b71203d29b6d60fcca0ad1c0e6e8450ad1cc900e7c31c55b61065d9d6c60f396f0f77252849.css b/main.ad6dfe6d9ecd46a7924ef08b6981b6e7c88835c2adb41e8a44583b71203d29b6d60fcca0ad1c0e6e8450ad1cc900e7c31c55b61065d9d6c60f396f0f77252849.css new file mode 100644 index 00000000..9020f407 --- /dev/null +++ b/main.ad6dfe6d9ecd46a7924ef08b6981b6e7c88835c2adb41e8a44583b71203d29b6d60fcca0ad1c0e6e8450ad1cc900e7c31c55b61065d9d6c60f396f0f77252849.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.8 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #5d2f86;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffe000;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #1d2d35;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-primary: #5d2f86;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffe000;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-primary-rgb: 93,47,134;--bs-secondary-rgb: 108,117,125;--bs-success-rgb: 25,135,84;--bs-info-rgb: 13,202,240;--bs-warning-rgb: 255,224,0;--bs-danger-rgb: 220,53,69;--bs-light-rgb: 248,249,250;--bs-dark-rgb: 33,37,41;--bs-primary-text-emphasis: #251336;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #665a00;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #dfd5e7;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff9cc;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #beaccf;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #fff399;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255,255,255;--bs-black-rgb: 29,45,53;--bs-font-sans-serif: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255,255,255,0.15), rgba(255,255,255,0));--bs-body-font-family: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #1d2d35;--bs-body-color-rgb: 29,45,53;--bs-body-bg: #fff;--bs-body-bg-rgb: 255,255,255;--bs-emphasis-color: #1d2d35;--bs-emphasis-color-rgb: 29,45,53;--bs-secondary-color: rgba(29,45,53,0.75);--bs-secondary-color-rgb: 29,45,53;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233,236,239;--bs-tertiary-color: rgba(29,45,53,0.5);--bs-tertiary-color-rgb: 29,45,53;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248,249,250;--bs-heading-color: inherit;--bs-link-color: #5d2f86;--bs-link-color-rgb: 93,47,134;--bs-link-decoration: none;--bs-link-hover-color: #4a266b;--bs-link-hover-color-rgb: 74,38,107;--bs-code-color: #d63384;--bs-highlight-color: #1d2d35;--bs-highlight-bg: #fff9cc;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #e9ecef;--bs-border-color-translucent: rgba(29,45,53,0.175);--bs-border-radius: .375rem;--bs-border-radius-sm: .25rem;--bs-border-radius-lg: .5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(29,45,53,0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(29,45,53,0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(29,45,53,0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(29,45,53,0.075);--bs-focus-ring-width: .25rem;--bs-focus-ring-opacity: .25;--bs-focus-ring-color: rgba(93,47,134,0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}*,*::before,*::after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(29,45,53,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:700;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}blockquote{margin:0 0 1rem}strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:none}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tr,td,th{border-color:inherit;border-style:solid;border-width:0}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button{text-transform:none}[role="button"]{cursor:pointer}[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not([type="week"]):not([type="time"])::-webkit-calendar-picker-indicator{display:none !important}button,[type="button"],[type="reset"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale(1)}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}.lead{font-size:1.25rem;font-weight:400}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.img-fluid{max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-xxl{--bs-gutter-x: 48px;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1240px}}@media (min-width: 1400px){.container-xxl,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.row{--bs-gutter-x: 48px;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}@media (min-width: 768px){.col-md-8{flex:0 0 auto;width:50%}.col-md-12{flex:0 0 auto;width:75%}}@media (min-width: 992px){.col-lg-4{flex:0 0 auto;width:25%}.col-lg-5{flex:0 0 auto;width:31.25%}.col-lg-8{flex:0 0 auto;width:50%}.col-lg-9{flex:0 0 auto;width:56.25%}.col-lg-10{flex:0 0 auto;width:62.5%}.col-lg-11{flex:0 0 auto;width:68.75%}.col-lg-12{flex:0 0 auto;width:75%}}@media (min-width: 1200px){.col-xl{flex:1 0 0}.col-xl-3{flex:0 0 auto;width:18.75%}.col-xl-4{flex:0 0 auto;width:25%}.col-xl-8{flex:0 0 auto;width:50%}.col-xl-9{flex:0 0 auto;width:56.25%}}.table,table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: var(--bs-emphasis-color);--bs-table-bg: var(--bs-body-bg);--bs-table-border-color: var(--bs-border-color);--bs-table-accent-bg: rgba(0,0,0,0);--bs-table-striped-color: var(--bs-emphasis-color);--bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color: var(--bs-emphasis-color);--bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color: var(--bs-emphasis-color);--bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*,table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody,table>tbody{vertical-align:inherit}.table>thead,table>thead{vertical-align:bottom}[data-dark-mode] body table{--bs-table-color: #fff;--bs-table-bg: #212529;--bs-table-border-color: #4d5154;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #fff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #fff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type="file"]{overflow:hidden}.form-control[type="file"]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#ae97c3;outline:0;box-shadow:0 0 0 .25rem rgba(93,47,134,0.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.btn{--bs-btn-padding-x: .75rem;--bs-btn-padding-y: .375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: var(--bs-body-color);--bs-btn-bg: transparent;--bs-btn-border-width: var(--bs-border-width);--bs-btn-border-color: transparent;--bs-btn-border-radius: var(--bs-border-radius);--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(29,45,53,0.075);--bs-btn-disabled-opacity: .65;--bs-btn-focus-box-shadow: 0 0 0 0 rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #5d2f86;--bs-btn-border-color: #5d2f86;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #4f2872;--bs-btn-hover-border-color: #4a266b;--bs-btn-focus-shadow-rgb: 117,78,152;--bs-btn-active-color: #fff;--bs-btn-active-bg: #4a266b;--bs-btn-active-border-color: #462365;--bs-btn-active-shadow: inset 0 3px 5px rgba(29,45,53,0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #5d2f86;--bs-btn-disabled-border-color: #5d2f86}.btn-outline-primary{--bs-btn-color: #5d2f86;--bs-btn-border-color: #5d2f86;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #5d2f86;--bs-btn-hover-border-color: #5d2f86;--bs-btn-focus-shadow-rgb: 93,47,134;--bs-btn-active-color: #fff;--bs-btn-active-bg: #5d2f86;--bs-btn-active-border-color: #5d2f86;--bs-btn-active-shadow: inset 0 3px 5px rgba(29,45,53,0.125);--bs-btn-disabled-color: #5d2f86;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #5d2f86;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: var(--bs-link-color);--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: var(--bs-link-hover-color);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: var(--bs-link-hover-color);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 117,78,152;text-decoration:none}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg{--bs-btn-padding-y: .5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: var(--bs-border-radius-lg)}.fade{transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: .5rem;--bs-dropdown-spacer: .125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: var(--bs-body-color);--bs-dropdown-bg: var(--bs-body-bg);--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-border-radius: var(--bs-border-radius);--bs-dropdown-border-width: var(--bs-border-width);--bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y: .5rem;--bs-dropdown-box-shadow: var(--bs-box-shadow);--bs-dropdown-link-color: var(--bs-body-color);--bs-dropdown-link-hover-color: var(--bs-body-color);--bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #5d2f86;--bs-dropdown-link-disabled-color: var(--bs-tertiary-color);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: .25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: .5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg: rgba(255,255,255,0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #5d2f86;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-link-color);--bs-nav-link-hover-color: var(--bs-link-hover-color);--bs-nav-link-disabled-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);background:none;border:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(93,47,134,0.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: .5rem;--bs-navbar-color: #1d2d35;--bs-navbar-hover-color: #5d2f86;--bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color: #5d2f86;--bs-navbar-brand-padding-y: .3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #5d2f86;--bs-navbar-brand-hover-color: #5d2f86;--bs-navbar-nav-link-padding-x: .5rem;--bs-navbar-toggler-padding-y: .25rem;--bs-navbar-toggler-padding-x: .75rem;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: none;--bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius: var(--bs-border-radius);--bs-navbar-toggler-focus-width: 0;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: .5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:transparent !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: .5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: var(--bs-border-width);--bs-card-border-color: #e9ecef;--bs-card-border-radius: var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y: .5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: var(--bs-body-bg);--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 24px;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: var(--bs-secondary-color);--bs-breadcrumb-item-padding-x: .5rem;--bs-breadcrumb-item-active-color: var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: .75rem;--bs-pagination-padding-y: .375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: var(--bs-link-color);--bs-pagination-bg: var(--bs-body-bg);--bs-pagination-border-width: var(--bs-border-width);--bs-pagination-border-color: var(--bs-border-color);--bs-pagination-border-radius: var(--bs-border-radius);--bs-pagination-hover-color: var(--bs-link-hover-color);--bs-pagination-hover-bg: var(--bs-tertiary-bg);--bs-pagination-hover-border-color: var(--bs-border-color);--bs-pagination-focus-color: var(--bs-link-hover-color);--bs-pagination-focus-bg: var(--bs-secondary-bg);--bs-pagination-focus-box-shadow: 0 0 0 .25rem rgba(93,47,134,0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: #5d2f86;--bs-pagination-active-border-color: #5d2f86;--bs-pagination-disabled-color: var(--bs-secondary-color);--bs-pagination-disabled-bg: var(--bs-secondary-bg);--bs-pagination-disabled-border-color: var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.badge{--bs-badge-padding-x: .65em;--bs-badge-padding-y: .35em;--bs-badge-font-size:.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1.5rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 0;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 0 solid var(--bs-alert-border-color);--bs-alert-border-radius: 0;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:4.5rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1.5rem}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.progress{--bs-progress-height: 1rem;--bs-progress-font-size:.75rem;--bs-progress-bg: var(--bs-secondary-bg);--bs-progress-border-radius: var(--bs-border-radius);--bs-progress-box-shadow: var(--bs-box-shadow-inset);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #5d2f86;--bs-progress-bar-transition: width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.list-group{--bs-list-group-color: var(--bs-body-color);--bs-list-group-bg: var(--bs-body-bg);--bs-list-group-border-color: var(--bs-border-color);--bs-list-group-border-width: var(--bs-border-width);--bs-list-group-border-radius: var(--bs-border-radius);--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: .5rem;--bs-list-group-action-color: var(--bs-secondary-color);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-tertiary-bg);--bs-list-group-action-active-color: var(--bs-body-color);--bs-list-group-action-active-bg: var(--bs-secondary-bg);--bs-list-group-disabled-color: var(--bs-secondary-color);--bs-list-group-disabled-bg: var(--bs-body-bg);--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #5d2f86;--bs-list-group-active-border-color: #5d2f86;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):hover,.list-group-item-action:not(.active):focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:not(.active):active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.btn-close{--bs-btn-close-color: #1d2d35;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231d2d35'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e");--bs-btn-close-opacity: .5;--bs-btn-close-hover-opacity: .75;--bs-btn-close-focus-shadow: 0 0 0 .25rem rgba(93,47,134,0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: .25;box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;filter:var(--bs-btn-close-filter);border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}:root{--bs-btn-close-filter: }:root{--bs-carousel-indicator-active-bg: #fff;--bs-carousel-caption-color: #fff;--bs-carousel-control-icon-filter: }@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.offcanvas{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: var(--bs-body-color);--bs-offcanvas-bg: var(--bs-body-bg);--bs-offcanvas-border-width: var(--bs-border-width);--bs-offcanvas-border-color: var(--bs-border-color-translucent);--bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);--bs-offcanvas-transition: transform .3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.show:not(.hiding){transform:none}.offcanvas.show{visibility:visible}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}@keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.d-block{display:block !important}.d-flex{display:flex !important}.d-none{display:none !important}.shadow{box-shadow:var(--bs-box-shadow) !important}.position-relative{position:relative !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.w-100{width:100% !important}.flex-column{flex-direction:column !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.align-items-center{align-items:center !important}.order-first{order:-1 !important}.order-3{order:3 !important}.order-5{order:5 !important}.order-last{order:6 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.mt-0{margin-top:0 !important}.mt-3{margin-top:1rem !important}.me-2{margin-right:.5rem !important}.me-auto{margin-right:auto !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-auto{margin-left:auto !important}.my-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.mt-n3{margin-top:-1rem !important}.p-0{padding:0 !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.pt-3{padding-top:1rem !important}.pb-1{padding-bottom:.25rem !important}.pb-3{padding-bottom:1rem !important}.ps-0{padding-left:0 !important}.ps-2{padding-left:.5rem !important}.fw-normal{font-weight:400 !important}.text-center{text-align:center !important}.text-uppercase{text-transform:uppercase !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(29,45,53,0.5) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.rounded{border-radius:var(--bs-border-radius) !important}.visible{visibility:visible !important}@media (min-width: 768px){.d-md-none{display:none !important}.flex-md-row{flex-direction:row !important}.flex-md-nowrap{flex-wrap:nowrap !important}.align-items-md-center{align-items:center !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.ms-md-auto{margin-left:auto !important}.me-md-n5{margin-right:-3rem !important}.ms-md-n3{margin-left:-1rem !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.pe-md-2{padding-right:.5rem !important}}@media (min-width: 992px){.d-lg-inline{display:inline !important}.d-lg-block{display:block !important}.d-lg-none{display:none !important}.order-lg-first{order:-1 !important}.order-lg-last{order:6 !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.d-xl-block{display:block !important}.d-xl-none{display:none !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}}@font-face{font-family:"KaTeX_AMS";src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Caligraphic";src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:bold;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Caligraphic";src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Fraktur";src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:bold;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Fraktur";src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Main";src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-weight:bold;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Main";src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:bold;font-style:italic;font-display:block}@font-face{font-family:"KaTeX_Main";src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-weight:normal;font-style:italic;font-display:block}@font-face{font-family:"KaTeX_Main";src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Math";src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype");font-weight:bold;font-style:italic;font-display:block}@font-face{font-family:"KaTeX_Math";src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-weight:normal;font-style:italic;font-display:block}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:bold;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:normal;font-style:italic;font-display:block}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Script";src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Size1";src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Size2";src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Size3";src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Size4";src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}@font-face{font-family:"KaTeX_Typewriter";src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:normal;font-style:normal;font-display:block}.katex{font:normal 1.21em KaTeX_Main, Times New Roman, serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none !important}.katex *{border-color:currentColor}.katex .katex-version::after{content:"0.16.28"}.katex .katex-mathml{position:absolute;clip:rect(1px, 1px, 1px, 1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;display:inline-block;white-space:nowrap;width:-moz-min-content;width:min-content}.katex .strut{display:inline-block}.katex .textbf{font-weight:bold}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:bold}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:bold;font-style:italic}.katex .amsrm{font-family:KaTeX_AMS}.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:bold}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:bold}.katex .mathsfit,.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed;border-collapse:collapse}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .vbox{display:inline-flex;flex-direction:column;align-items:baseline}.katex .hbox{display:inline-flex;flex-direction:row;width:100%}.katex .thinbox{display:inline-flex;flex-direction:row;width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .underline .underline-line,.katex .hline,.katex .hdashline,.katex .rule{min-height:1px}.katex .mspace{display:inline-block}.katex .llap,.katex .rlap,.katex .clap{width:0;position:relative}.katex .llap>.inner,.katex .rlap>.inner,.katex .clap>.inner{position:absolute}.katex .llap>.fix,.katex .rlap>.fix,.katex .clap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .rlap>.inner,.katex .clap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:solid 0;position:relative}.katex .overline .overline-line,.katex .underline .underline-line,.katex .hline{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:0.2777777778em;margin-right:-0.5555555556em}.katex .sizing.reset-size1.size1,.katex .fontsize-ensurer.reset-size1.size1{font-size:1em}.katex .sizing.reset-size1.size2,.katex .fontsize-ensurer.reset-size1.size2{font-size:1.2em}.katex .sizing.reset-size1.size3,.katex .fontsize-ensurer.reset-size1.size3{font-size:1.4em}.katex .sizing.reset-size1.size4,.katex .fontsize-ensurer.reset-size1.size4{font-size:1.6em}.katex .sizing.reset-size1.size5,.katex .fontsize-ensurer.reset-size1.size5{font-size:1.8em}.katex .sizing.reset-size1.size6,.katex .fontsize-ensurer.reset-size1.size6{font-size:2em}.katex .sizing.reset-size1.size7,.katex .fontsize-ensurer.reset-size1.size7{font-size:2.4em}.katex .sizing.reset-size1.size8,.katex .fontsize-ensurer.reset-size1.size8{font-size:2.88em}.katex .sizing.reset-size1.size9,.katex .fontsize-ensurer.reset-size1.size9{font-size:3.456em}.katex .sizing.reset-size1.size10,.katex .fontsize-ensurer.reset-size1.size10{font-size:4.148em}.katex .sizing.reset-size1.size11,.katex .fontsize-ensurer.reset-size1.size11{font-size:4.976em}.katex .sizing.reset-size2.size1,.katex .fontsize-ensurer.reset-size2.size1{font-size:0.8333333333em}.katex .sizing.reset-size2.size2,.katex .fontsize-ensurer.reset-size2.size2{font-size:1em}.katex .sizing.reset-size2.size3,.katex .fontsize-ensurer.reset-size2.size3{font-size:1.1666666667em}.katex .sizing.reset-size2.size4,.katex .fontsize-ensurer.reset-size2.size4{font-size:1.3333333333em}.katex .sizing.reset-size2.size5,.katex .fontsize-ensurer.reset-size2.size5{font-size:1.5em}.katex .sizing.reset-size2.size6,.katex .fontsize-ensurer.reset-size2.size6{font-size:1.6666666667em}.katex .sizing.reset-size2.size7,.katex .fontsize-ensurer.reset-size2.size7{font-size:2em}.katex .sizing.reset-size2.size8,.katex .fontsize-ensurer.reset-size2.size8{font-size:2.4em}.katex .sizing.reset-size2.size9,.katex .fontsize-ensurer.reset-size2.size9{font-size:2.88em}.katex .sizing.reset-size2.size10,.katex .fontsize-ensurer.reset-size2.size10{font-size:3.4566666667em}.katex .sizing.reset-size2.size11,.katex .fontsize-ensurer.reset-size2.size11{font-size:4.1466666667em}.katex .sizing.reset-size3.size1,.katex .fontsize-ensurer.reset-size3.size1{font-size:0.7142857143em}.katex .sizing.reset-size3.size2,.katex .fontsize-ensurer.reset-size3.size2{font-size:0.8571428571em}.katex .sizing.reset-size3.size3,.katex .fontsize-ensurer.reset-size3.size3{font-size:1em}.katex .sizing.reset-size3.size4,.katex .fontsize-ensurer.reset-size3.size4{font-size:1.1428571429em}.katex .sizing.reset-size3.size5,.katex .fontsize-ensurer.reset-size3.size5{font-size:1.2857142857em}.katex .sizing.reset-size3.size6,.katex .fontsize-ensurer.reset-size3.size6{font-size:1.4285714286em}.katex .sizing.reset-size3.size7,.katex .fontsize-ensurer.reset-size3.size7{font-size:1.7142857143em}.katex .sizing.reset-size3.size8,.katex .fontsize-ensurer.reset-size3.size8{font-size:2.0571428571em}.katex .sizing.reset-size3.size9,.katex .fontsize-ensurer.reset-size3.size9{font-size:2.4685714286em}.katex .sizing.reset-size3.size10,.katex .fontsize-ensurer.reset-size3.size10{font-size:2.9628571429em}.katex .sizing.reset-size3.size11,.katex .fontsize-ensurer.reset-size3.size11{font-size:3.5542857143em}.katex .sizing.reset-size4.size1,.katex .fontsize-ensurer.reset-size4.size1{font-size:0.625em}.katex .sizing.reset-size4.size2,.katex .fontsize-ensurer.reset-size4.size2{font-size:0.75em}.katex .sizing.reset-size4.size3,.katex .fontsize-ensurer.reset-size4.size3{font-size:0.875em}.katex .sizing.reset-size4.size4,.katex .fontsize-ensurer.reset-size4.size4{font-size:1em}.katex .sizing.reset-size4.size5,.katex .fontsize-ensurer.reset-size4.size5{font-size:1.125em}.katex .sizing.reset-size4.size6,.katex .fontsize-ensurer.reset-size4.size6{font-size:1.25em}.katex .sizing.reset-size4.size7,.katex .fontsize-ensurer.reset-size4.size7{font-size:1.5em}.katex .sizing.reset-size4.size8,.katex .fontsize-ensurer.reset-size4.size8{font-size:1.8em}.katex .sizing.reset-size4.size9,.katex .fontsize-ensurer.reset-size4.size9{font-size:2.16em}.katex .sizing.reset-size4.size10,.katex .fontsize-ensurer.reset-size4.size10{font-size:2.5925em}.katex .sizing.reset-size4.size11,.katex .fontsize-ensurer.reset-size4.size11{font-size:3.11em}.katex .sizing.reset-size5.size1,.katex .fontsize-ensurer.reset-size5.size1{font-size:0.5555555556em}.katex .sizing.reset-size5.size2,.katex .fontsize-ensurer.reset-size5.size2{font-size:0.6666666667em}.katex .sizing.reset-size5.size3,.katex .fontsize-ensurer.reset-size5.size3{font-size:0.7777777778em}.katex .sizing.reset-size5.size4,.katex .fontsize-ensurer.reset-size5.size4{font-size:0.8888888889em}.katex .sizing.reset-size5.size5,.katex .fontsize-ensurer.reset-size5.size5{font-size:1em}.katex .sizing.reset-size5.size6,.katex .fontsize-ensurer.reset-size5.size6{font-size:1.1111111111em}.katex .sizing.reset-size5.size7,.katex .fontsize-ensurer.reset-size5.size7{font-size:1.3333333333em}.katex .sizing.reset-size5.size8,.katex .fontsize-ensurer.reset-size5.size8{font-size:1.6em}.katex .sizing.reset-size5.size9,.katex .fontsize-ensurer.reset-size5.size9{font-size:1.92em}.katex .sizing.reset-size5.size10,.katex .fontsize-ensurer.reset-size5.size10{font-size:2.3044444444em}.katex .sizing.reset-size5.size11,.katex .fontsize-ensurer.reset-size5.size11{font-size:2.7644444444em}.katex .sizing.reset-size6.size1,.katex .fontsize-ensurer.reset-size6.size1{font-size:0.5em}.katex .sizing.reset-size6.size2,.katex .fontsize-ensurer.reset-size6.size2{font-size:0.6em}.katex .sizing.reset-size6.size3,.katex .fontsize-ensurer.reset-size6.size3{font-size:0.7em}.katex .sizing.reset-size6.size4,.katex .fontsize-ensurer.reset-size6.size4{font-size:0.8em}.katex .sizing.reset-size6.size5,.katex .fontsize-ensurer.reset-size6.size5{font-size:0.9em}.katex .sizing.reset-size6.size6,.katex .fontsize-ensurer.reset-size6.size6{font-size:1em}.katex .sizing.reset-size6.size7,.katex .fontsize-ensurer.reset-size6.size7{font-size:1.2em}.katex .sizing.reset-size6.size8,.katex .fontsize-ensurer.reset-size6.size8{font-size:1.44em}.katex .sizing.reset-size6.size9,.katex .fontsize-ensurer.reset-size6.size9{font-size:1.728em}.katex .sizing.reset-size6.size10,.katex .fontsize-ensurer.reset-size6.size10{font-size:2.074em}.katex .sizing.reset-size6.size11,.katex .fontsize-ensurer.reset-size6.size11{font-size:2.488em}.katex .sizing.reset-size7.size1,.katex .fontsize-ensurer.reset-size7.size1{font-size:0.4166666667em}.katex .sizing.reset-size7.size2,.katex .fontsize-ensurer.reset-size7.size2{font-size:0.5em}.katex .sizing.reset-size7.size3,.katex .fontsize-ensurer.reset-size7.size3{font-size:0.5833333333em}.katex .sizing.reset-size7.size4,.katex .fontsize-ensurer.reset-size7.size4{font-size:0.6666666667em}.katex .sizing.reset-size7.size5,.katex .fontsize-ensurer.reset-size7.size5{font-size:0.75em}.katex .sizing.reset-size7.size6,.katex .fontsize-ensurer.reset-size7.size6{font-size:0.8333333333em}.katex .sizing.reset-size7.size7,.katex .fontsize-ensurer.reset-size7.size7{font-size:1em}.katex .sizing.reset-size7.size8,.katex .fontsize-ensurer.reset-size7.size8{font-size:1.2em}.katex .sizing.reset-size7.size9,.katex .fontsize-ensurer.reset-size7.size9{font-size:1.44em}.katex .sizing.reset-size7.size10,.katex .fontsize-ensurer.reset-size7.size10{font-size:1.7283333333em}.katex .sizing.reset-size7.size11,.katex .fontsize-ensurer.reset-size7.size11{font-size:2.0733333333em}.katex .sizing.reset-size8.size1,.katex .fontsize-ensurer.reset-size8.size1{font-size:0.3472222222em}.katex .sizing.reset-size8.size2,.katex .fontsize-ensurer.reset-size8.size2{font-size:0.4166666667em}.katex .sizing.reset-size8.size3,.katex .fontsize-ensurer.reset-size8.size3{font-size:0.4861111111em}.katex .sizing.reset-size8.size4,.katex .fontsize-ensurer.reset-size8.size4{font-size:0.5555555556em}.katex .sizing.reset-size8.size5,.katex .fontsize-ensurer.reset-size8.size5{font-size:0.625em}.katex .sizing.reset-size8.size6,.katex .fontsize-ensurer.reset-size8.size6{font-size:0.6944444444em}.katex .sizing.reset-size8.size7,.katex .fontsize-ensurer.reset-size8.size7{font-size:0.8333333333em}.katex .sizing.reset-size8.size8,.katex .fontsize-ensurer.reset-size8.size8{font-size:1em}.katex .sizing.reset-size8.size9,.katex .fontsize-ensurer.reset-size8.size9{font-size:1.2em}.katex .sizing.reset-size8.size10,.katex .fontsize-ensurer.reset-size8.size10{font-size:1.4402777778em}.katex .sizing.reset-size8.size11,.katex .fontsize-ensurer.reset-size8.size11{font-size:1.7277777778em}.katex .sizing.reset-size9.size1,.katex .fontsize-ensurer.reset-size9.size1{font-size:0.2893518519em}.katex .sizing.reset-size9.size2,.katex .fontsize-ensurer.reset-size9.size2{font-size:0.3472222222em}.katex .sizing.reset-size9.size3,.katex .fontsize-ensurer.reset-size9.size3{font-size:0.4050925926em}.katex .sizing.reset-size9.size4,.katex .fontsize-ensurer.reset-size9.size4{font-size:0.462962963em}.katex .sizing.reset-size9.size5,.katex .fontsize-ensurer.reset-size9.size5{font-size:0.5208333333em}.katex .sizing.reset-size9.size6,.katex .fontsize-ensurer.reset-size9.size6{font-size:0.5787037037em}.katex .sizing.reset-size9.size7,.katex .fontsize-ensurer.reset-size9.size7{font-size:0.6944444444em}.katex .sizing.reset-size9.size8,.katex .fontsize-ensurer.reset-size9.size8{font-size:0.8333333333em}.katex .sizing.reset-size9.size9,.katex .fontsize-ensurer.reset-size9.size9{font-size:1em}.katex .sizing.reset-size9.size10,.katex .fontsize-ensurer.reset-size9.size10{font-size:1.2002314815em}.katex .sizing.reset-size9.size11,.katex .fontsize-ensurer.reset-size9.size11{font-size:1.4398148148em}.katex .sizing.reset-size10.size1,.katex .fontsize-ensurer.reset-size10.size1{font-size:0.2410800386em}.katex .sizing.reset-size10.size2,.katex .fontsize-ensurer.reset-size10.size2{font-size:0.2892960463em}.katex .sizing.reset-size10.size3,.katex .fontsize-ensurer.reset-size10.size3{font-size:0.337512054em}.katex .sizing.reset-size10.size4,.katex .fontsize-ensurer.reset-size10.size4{font-size:0.3857280617em}.katex .sizing.reset-size10.size5,.katex .fontsize-ensurer.reset-size10.size5{font-size:0.4339440694em}.katex .sizing.reset-size10.size6,.katex .fontsize-ensurer.reset-size10.size6{font-size:0.4821600771em}.katex .sizing.reset-size10.size7,.katex .fontsize-ensurer.reset-size10.size7{font-size:0.5785920926em}.katex .sizing.reset-size10.size8,.katex .fontsize-ensurer.reset-size10.size8{font-size:0.6943105111em}.katex .sizing.reset-size10.size9,.katex .fontsize-ensurer.reset-size10.size9{font-size:0.8331726133em}.katex .sizing.reset-size10.size10,.katex .fontsize-ensurer.reset-size10.size10{font-size:1em}.katex .sizing.reset-size10.size11,.katex .fontsize-ensurer.reset-size10.size11{font-size:1.1996142719em}.katex .sizing.reset-size11.size1,.katex .fontsize-ensurer.reset-size11.size1{font-size:0.2009646302em}.katex .sizing.reset-size11.size2,.katex .fontsize-ensurer.reset-size11.size2{font-size:0.2411575563em}.katex .sizing.reset-size11.size3,.katex .fontsize-ensurer.reset-size11.size3{font-size:0.2813504823em}.katex .sizing.reset-size11.size4,.katex .fontsize-ensurer.reset-size11.size4{font-size:0.3215434084em}.katex .sizing.reset-size11.size5,.katex .fontsize-ensurer.reset-size11.size5{font-size:0.3617363344em}.katex .sizing.reset-size11.size6,.katex .fontsize-ensurer.reset-size11.size6{font-size:0.4019292605em}.katex .sizing.reset-size11.size7,.katex .fontsize-ensurer.reset-size11.size7{font-size:0.4823151125em}.katex .sizing.reset-size11.size8,.katex .fontsize-ensurer.reset-size11.size8{font-size:0.578778135em}.katex .sizing.reset-size11.size9,.katex .fontsize-ensurer.reset-size11.size9{font-size:0.6945337621em}.katex .sizing.reset-size11.size10,.katex .fontsize-ensurer.reset-size11.size10{font-size:0.8336012862em}.katex .sizing.reset-size11.size11,.katex .fontsize-ensurer.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:0.12em}.katex .delimcenter{position:relative}.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy::before,.katex .stretchy::after{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 0.5em}.katex .cd-arrow-pad{padding:0 0.55556em 0 0.27778em}.katex .x-arrow,.katex .mover,.katex .munder{text-align:center}.katex .boxpad{padding:0 0.3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:0.04em solid}.katex .cancel-pad{padding:0 0.2em}.katex .cancel-lap{margin-left:-0.2em;margin-right:-0.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:0.08em}.katex .angl{box-sizing:border-box;border-top:0.049em solid;border-right:0.049em solid;margin-right:0.03889em}.katex .anglpad{padding:0 0.03889em}.katex .eqn-num::before{counter-increment:katexEqnNo;content:"(" counter(katexEqnNo) ")"}.katex .mml-eqn-num::before{counter-increment:mmlEqnNo;content:"(" counter(mmlEqnNo) ")"}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + 0.3em);text-align:left}.katex .cd-label-right{display:inline-block;position:absolute;left:calc(50% + 0.3em);text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left;padding-left:2em}body{counter-reset:katexEqnNo mmlEqnNo}@font-face{font-family:"Jost";font-style:normal;font-weight:400;font-display:swap;src:local("Jost"),url("fonts/vendor/jost/jost-v4-latin-regular.woff2") format("woff2"),url("fonts/vendor/jost/jost-v4-latin-regular.woff") format("woff")}@font-face{font-family:"Jost";font-style:normal;font-weight:500;font-display:swap;src:local("Jost"),url("fonts/vendor/jost/jost-v4-latin-500.woff2") format("woff2"),url("fonts/vendor/jost/jost-v4-latin-500.woff") format("woff")}@font-face{font-family:"Jost";font-style:normal;font-weight:700;font-display:swap;src:local("Jost"),url("fonts/vendor/jost/jost-v4-latin-700.woff2") format("woff2"),url("fonts/vendor/jost/jost-v4-latin-700.woff") format("woff")}@font-face{font-family:"Jost";font-style:italic;font-weight:400;font-display:swap;src:local("Jost"),url("fonts/vendor/jost/jost-v4-latin-italic.woff2") format("woff2"),url("fonts/vendor/jost/jost-v4-latin-italic.woff") format("woff")}@font-face{font-family:"Jost";font-style:italic;font-weight:500;font-display:swap;src:local("Jost"),url("fonts/vendor/jost/jost-v4-latin-500italic.woff2") format("woff2"),url("fonts/vendor/jost/jost-v4-latin-500italic.woff") format("woff")}@font-face{font-family:"Jost";font-style:italic;font-weight:700;font-display:swap;src:local("Jost"),url("fonts/vendor/jost/jost-v4-latin-700italic.woff2") format("woff2"),url("fonts/vendor/jost/jost-v4-latin-700italic.woff") format("woff")}.contributors .content,.blog .content,.page .content,.error404 .content,.docs.list .content,.tutorial.list .content,.showcase.list .content{padding-top:1rem;padding-bottom:3rem}.content img{max-width:100%}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin:2rem 0 1rem}.offcanvas-header{border-bottom:1px solid #dee2e6;padding-top:1.0625rem;padding-bottom:0.8125rem}h5.offcanvas-title,.offcanvas-title.h5{margin:0}body.docs{padding-top:0 !important}@media (min-width: 768px){body{font-size:1.125rem}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:1.125rem}}.home h1,.home .h1{font-size:calc(1.875rem + 1.5vw)}a:hover,a:focus{text-decoration:underline}a.btn:hover,a.btn:focus{text-decoration:none}.section{padding-top:5rem;padding-bottom:5rem}.section-sm{padding-top:1rem;padding-bottom:1rem}.docs-sidebar{order:2}@media (min-width: 992px){.docs-sidebar{order:0;border-right:1px solid #e9ecef}@supports (position: sticky){.docs-sidebar{position:sticky;top:4rem;z-index:1000;height:calc(100vh - 4rem)}}}@media (min-width: 1200px){.docs-sidebar{flex:0 1 320px}}.docs-links{padding-bottom:5rem}@media (min-width: 992px){@supports (position: sticky){.docs-links{max-height:calc(100vh - 4rem);overflow-y:scroll}}}@media (min-width: 992px){.docs-links{display:block;width:auto;margin-right:-1.5rem;padding-bottom:4rem}}.docs-toc{order:2}@supports (position: sticky){.docs-toc{position:sticky;top:4rem;height:calc(100vh - 4rem);overflow-y:auto}}.docs-content{padding-bottom:3rem;order:1}.docs-navigation{border-top:1px solid #e9ecef;margin-top:2rem;margin-bottom:0;padding-top:2rem}.docs-navigation a{font-size:.9rem}@media (min-width: 992px){.docs-navigation{margin-bottom:-1rem}.docs-navigation a{font-size:1rem}}.navbar a:hover,.navbar a:focus{text-decoration:none}#TableOfContents ul{padding-left:0;list-style:none}::-moz-selection{background:rgba(212,53,159,0.2)}::selection{background:rgba(212,53,159,0.2)}.bg-dots{background-image:radial-gradient(#dee2e6 15%, transparent 15%);background-position:0 0;background-size:1rem 1rem;-webkit-mask:linear-gradient(to top, #fff, transparent);mask:linear-gradient(to top, #fff, transparent);width:100%;height:9rem;margin-top:-10rem;z-index:-1}.katex{font-size:1.125rem}[data-dark-mode] body{background:#212529;color:#dee2e6}[data-dark-mode] body a{color:#8ed6fb}[data-dark-mode] body a.text-body{color:#dee2e6 !important}[data-dark-mode] body .btn-primary{--bs-btn-color: #1d2d35;--bs-btn-bg: #8ed6fb;--bs-btn-border-color: #8ed6fb;--bs-btn-hover-color: #1d2d35;--bs-btn-hover-bg: #9fdcfc;--bs-btn-hover-border-color: #99dafb;--bs-btn-focus-shadow-rgb: 125,189,221;--bs-btn-active-color: #1d2d35;--bs-btn-active-bg: #a5defc;--bs-btn-active-border-color: #99dafb;--bs-btn-active-shadow: inset 0 3px 5px rgba(29,45,53,0.125);--bs-btn-disabled-color: #1d2d35;--bs-btn-disabled-bg: #8ed6fb;--bs-btn-disabled-border-color: #8ed6fb;color:#212529 !important}[data-dark-mode] body .btn-outline-primary{--bs-btn-color: #8ed6fb;--bs-btn-border-color: #8ed6fb;--bs-btn-hover-color: #8ed6fb;--bs-btn-hover-bg: #8ed6fb;--bs-btn-hover-border-color: #8ed6fb;--bs-btn-focus-shadow-rgb: 142,214,251;--bs-btn-active-color: #1d2d35;--bs-btn-active-bg: #8ed6fb;--bs-btn-active-border-color: #8ed6fb;--bs-btn-active-shadow: inset 0 3px 5px rgba(29,45,53,0.125);--bs-btn-disabled-color: #8ed6fb;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #8ed6fb;--bs-gradient: none;color:#8ed6fb}[data-dark-mode] body .btn-outline-primary:hover{color:#212529}[data-dark-mode] body .btn-doks-light{color:#dee2e6}[data-dark-mode] body .show>.btn-doks-light,[data-dark-mode] body .btn-doks-light:hover,[data-dark-mode] body .btn-doks-light:active{color:#8ed6fb}[data-dark-mode] body .btn-menu svg{color:#dee2e6}[data-dark-mode] body .doks-sidebar-toggle{color:#dee2e6}[data-dark-mode] body .btn-menu:hover,[data-dark-mode] body .btn-doks-light:hover,[data-dark-mode] body .doks-sidebar-toggle:hover{background:#1b1f22}[data-dark-mode] body .navbar,[data-dark-mode] body .doks-subnavbar{background-color:rgba(33,37,41,0.95);border-bottom:1px solid #343a40}[data-dark-mode] body.home .navbar{border-bottom:0}[data-dark-mode] body .offcanvas-header{border-bottom:1px solid #343a40}[data-dark-mode] body .offcanvas .nav-link{color:#dee2e6}[data-dark-mode] body .offcanvas .nav-link:hover,[data-dark-mode] body .offcanvas .nav-link:focus{color:#8ed6fb}[data-dark-mode] body .offcanvas .nav-link.active{color:#8ed6fb}[data-dark-mode] body .navbar-light .navbar-brand{color:#dee2e6 !important}[data-dark-mode] body .navbar-light .navbar-nav .nav-link{color:#dee2e6}[data-dark-mode] body .navbar-light .navbar-nav .nav-link:hover,[data-dark-mode] body .navbar-light .navbar-nav .nav-link:focus{color:#8ed6fb}[data-dark-mode] body .navbar-light .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}[data-dark-mode] body .navbar-light .navbar-nav .show>.nav-link,[data-dark-mode] body .navbar-light .navbar-nav .active>.nav-link,[data-dark-mode] body .navbar-light .navbar-nav .nav-link.show,[data-dark-mode] body .navbar-light .navbar-nav .nav-link.active{color:#8ed6fb}[data-dark-mode] body .navbar-light .navbar-text{color:#dee2e6}[data-dark-mode] body .alert-primary a{color:#212529}[data-dark-mode] body .alert-warning{background:#1b1f22;color:#dee2e6}[data-dark-mode] body .page-links a{color:#dee2e6}[data-dark-mode] body .btn-toggle-nav a{color:#dee2e6}[data-dark-mode] body .showcase-meta a{color:#dee2e6}[data-dark-mode] body .showcase-meta a:hover,[data-dark-mode] body .showcase-meta a:focus{color:#8ed6fb}[data-dark-mode] body .docs-link:hover,[data-dark-mode] body .docs-link.active,[data-dark-mode] body .page-links a:hover{text-decoration:none;color:#8ed6fb}[data-dark-mode] body .btn-toggle{color:#dee2e6;background-color:transparent;border:0}[data-dark-mode] body .btn-toggle:hover,[data-dark-mode] body .btn-toggle:focus{color:#dee2e6}[data-dark-mode] body .btn-toggle::before{width:1.25em;line-height:0;content:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28222, 226, 230, 0.75%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");transition:transform 0.35s ease;transform-origin:0.5em 50%;margin-bottom:0.125rem}[data-dark-mode] body .btn-toggle[aria-expanded="true"]{color:#dee2e6}[data-dark-mode] body .btn-toggle[aria-expanded="true"]::before{transform:rotate(90deg)}[data-dark-mode] body .btn-toggle-nav a:hover,[data-dark-mode] body .btn-toggle-nav a:focus{color:#8ed6fb}[data-dark-mode] body .btn-toggle-nav a.active{color:#8ed6fb}[data-dark-mode] body .navbar-light .navbar-text a{color:#8ed6fb}[data-dark-mode] body .docs-links h3.sidebar-link a,[data-dark-mode] body .docs-links .sidebar-link.h3 a,[data-dark-mode] body .page-links h3.sidebar-link a,[data-dark-mode] body .page-links .sidebar-link.h3 a{color:#dee2e6}[data-dark-mode] body .navbar-light .navbar-text a:hover,[data-dark-mode] body .navbar-light .navbar-text a:focus{color:#8ed6fb}[data-dark-mode] body .navbar .btn-link{color:#dee2e6}[data-dark-mode] body .content .btn-link{color:#8ed6fb}[data-dark-mode] body .content .btn-link:hover{color:#8ed6fb}[data-dark-mode] body .content img[src^="https://latex.codecogs.com/svg.latex"]{filter:invert(1)}[data-dark-mode] body .navbar .btn-link:hover{color:#8ed6fb}[data-dark-mode] body .navbar .btn-link:active{color:#8ed6fb}[data-dark-mode] body .form-control.is-search{background:#1b1f22;border:1px solid transparent;color:#dee2e6}[data-dark-mode] body .form-control.is-search:focus{border:1px solid #8ed6fb}[data-dark-mode] body .doks-search::after{color:#dee2e6;border:1px solid #495057}[data-dark-mode] body .text-dark{color:#dee2e6 !important}[data-dark-mode] body .form-control{color:#dee2e6}[data-dark-mode] body .form-control::-moz-placeholder{color:#ced4da;opacity:1}[data-dark-mode] body .form-control::placeholder{color:#ced4da;opacity:1}[data-dark-mode] body .border-top{border-top:1px solid #343a40 !important}@media (min-width: 992px){[data-dark-mode] body .docs-sidebar{order:0;border-right:1px solid #343a40}}[data-dark-mode] body .docs-navigation{border-top:1px solid #343a40}[data-dark-mode] body pre code::-webkit-scrollbar-thumb{background:#ced4da}[data-dark-mode] body code:not(.hljs){background:#1b1f22;color:#dee2e6}[data-dark-mode] body pre code:hover{scrollbar-width:thin;scrollbar-color:#343a40 transparent}[data-dark-mode] body pre code::-webkit-scrollbar-thumb:hover{background:#adb5bd}[data-dark-mode] body blockquote{border-left:3px solid #343a40}[data-dark-mode] body .footer{border-top:1px solid #343a40}[data-dark-mode] body .docs-links,[data-dark-mode] body .docs-toc{scrollbar-width:thin;scrollbar-color:#212529 #212529}[data-dark-mode] body .docs-links::-webkit-scrollbar,[data-dark-mode] body .docs-toc::-webkit-scrollbar{width:5px}[data-dark-mode] body .docs-links::-webkit-scrollbar-track,[data-dark-mode] body .docs-toc::-webkit-scrollbar-track{background:#212529}[data-dark-mode] body .docs-links::-webkit-scrollbar-thumb,[data-dark-mode] body .docs-toc::-webkit-scrollbar-thumb{background:#212529}[data-dark-mode] body .docs-links:hover,[data-dark-mode] body .docs-toc:hover{scrollbar-width:thin;scrollbar-color:#343a40 #212529}[data-dark-mode] body .docs-links:hover::-webkit-scrollbar-thumb,[data-dark-mode] body .docs-toc:hover::-webkit-scrollbar-thumb{background:#343a40}[data-dark-mode] body .docs-links::-webkit-scrollbar-thumb:hover,[data-dark-mode] body .docs-toc::-webkit-scrollbar-thumb:hover{background:#343a40}[data-dark-mode] body .docs-links h3:not(:first-child),[data-dark-mode] body .docs-links .h3:not(:first-child){border-top:1px solid #343a40}[data-dark-mode] body a.docs-link{color:#dee2e6}[data-dark-mode] body .page-links li:not(:first-child){border-top:1px dashed #343a40}[data-dark-mode] body .card{background:#1b1f22;border:1px solid #343a40}[data-dark-mode] body .card.bg-light{background:#1b1f22 !important}[data-dark-mode] body .card article{color:#dee2e6}[data-dark-mode] body .navbar .menu-icon .navicon{background:#dee2e6}[data-dark-mode] body .navbar .menu-icon .navicon::before,[data-dark-mode] body .navbar .menu-icon .navicon::after{background:#dee2e6}[data-dark-mode] body .logo-light{display:none !important}[data-dark-mode] body .logo-dark{display:inline-block !important}[data-dark-mode] body .bg-light{background:#1e2125 !important}[data-dark-mode] body .bg-dots{background-image:radial-gradient(#556370 15%, transparent 15%)}[data-dark-mode] body .text-muted{color:#c8cfd6 !important}[data-dark-mode] body .alert-primary{background:#8ed6fb;color:#212529}[data-dark-mode] body .figure-caption{color:#dee2e6}[data-dark-mode] body .copy-status::after{content:"Copy";display:block;color:#dee2e6}[data-dark-mode] body .copy-status:hover::after{content:"Copy";display:block;color:#8ed6fb}[data-dark-mode] body .copy-status:focus::after,[data-dark-mode] body .copy-status:active::after{content:"Copied";display:block;color:#8ed6fb}[data-dark-mode] body .offcanvas{background-color:#212529}[data-dark-mode] body .btn-close{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNkZWUyZTYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXgiPjxsaW5lIHgxPSIxOCIgeTE9IjYiIHgyPSI2IiB5Mj0iMTgiPjwvbGluZT48bGluZSB4MT0iNiIgeTE9IjYiIHgyPSIxOCIgeTI9IjE4Ij48L2xpbmU+PC9zdmc+");background-size:1.5rem}@media (min-width: 768px){[data-dark-mode] body .alert-dismissible .btn-close{background-size:1.25rem}}[data-dark-mode] .dropdown-item{color:#212529}[data-dark-mode] body hr.text-black-50{color:#6c757d !important}[data-dark-mode] body .email-form .form-control{background:#1b1f22;border:1px solid transparent}[data-dark-mode] body .email-form .form-control:focus{border:1px solid #8ed6fb}[data-dark-mode] .page-link{color:#8ed6fb;background-color:transparent;border:var(--bs-border-width) solid #343a40}[data-dark-mode] .page-link:hover{color:#212529;background-color:#dee2e6;border-color:#dee2e6}[data-dark-mode] .page-link:focus{color:#212529;background-color:#dee2e6}[data-dark-mode] .page-item.active .page-link{color:#212529;background-color:#8ed6fb;border-color:#8ed6fb}[data-dark-mode] .page-item.disabled .page-link{color:var(--bs-secondary-color);background-color:#1b1f22;border-color:#343a40}.alert{font-family:sfmono-regular,menlo,monaco,consolas,"Liberation Mono","Courier New",monospace;font-size:.875rem}.alert-icon{margin-right:0.75rem}.docs main .alert{margin:2rem -1.5rem}.alert .alert-link{text-decoration:underline}.alert-warning{background:#fbf7f0;color:#1d2d35}.alert-primary{color:#fff;background-color:#5d2f86}.alert-primary .alert-link{color:#fff}.alert .alert-link:hover,.alert .alert-link:focus{text-decoration:none}.alert-dismissible .btn-close{position:absolute;top:0.75rem;right:1rem;z-index:2;padding:0.625rem;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-x'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");background-size:1.5rem;filter:invert(1) grayscale(100%) brightness(200%)}@media (min-width: 768px){.alert-dismissible .btn-close{background-size:1.25rem}}.alert code{background:#f6ecdc;color:#1d2d35;padding:0.25rem 0.5rem}.navbar .btn-link{color:#1d2d35;padding:0.4375rem 0}#mode{padding-right:0.25rem;padding-left:0.25rem;margin-right:-0.25rem}.btn-link:focus{outline:0;box-shadow:none}#navigation{margin-left:1.25rem}@media (min-width: 768px){#mode{margin-left:1.125rem;margin-right:-0.375rem}.navbar .btn-link{padding:0.5625em 0.25rem 0.5rem 0.125rem}}.navbar .btn-link:hover{color:#5d2f86}.navbar .btn-link:active{color:#5d2f86}body .toggle-dark{display:block}body .toggle-light{display:none}[data-dark-mode] body .toggle-light{display:block}[data-dark-mode] body .toggle-dark{display:none}pre{position:relative}@media (max-width: 767.98px){.btn-copy{display:none}}.btn-copy{transition:opacity 0.3s ease-in-out;opacity:0;position:absolute;right:0.25rem;top:0.25rem;z-index:10;font-family:"Jost",-apple-system,blinkmacsystemfont,"Segoe UI",roboto,"Helvetica Neue",arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:.875rem;padding:0.25rem 0.5rem;color:#fff;background-color:#d32e9d;border-color:#bf288e}.btn-copy:hover{color:#fff;background-color:#d743a7;border-color:#dc58b1}.btn-copy:focus{color:#fff;background-color:#d32e9d;border-color:#dc58b1;box-shadow:none}.btn-copy:active,.btn-copy.active{color:#fff;background-color:#d32e9d;border-color:#dc58b1}.btn-copy:active:focus,.btn-copy.active:focus{box-shadow:none}@media (min-width: 768px){pre:hover .btn-copy{opacity:1}}.btn-copy::after{content:"Copy";display:block;color:#fff}.btn-copy:hover::after{content:"Copy";display:block;color:#fff}.btn-copy:focus::after,.btn-copy:active::after{content:"Copied";display:block;color:#fff}.collapsible-sidebar{margin:2.125rem 0}.btn-toggle{display:inline-flex;align-items:center;padding:0.25rem 0.5rem 0.25rem 0;font-weight:700;font-size:1rem;text-transform:uppercase;color:#1d2d35;background-color:transparent;border:0}.btn-toggle:hover,.btn-toggle:focus{color:#1d2d35;background-color:transparent;outline:0;box-shadow:none}.btn-toggle::before{width:1.25em;line-height:0;content:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%2829, 45, 53, 0.75%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");transition:transform 0.35s ease;transform-origin:0.5em 50%;margin-bottom:0.125rem}.btn-toggle[aria-expanded="true"]{color:#1d2d35}.btn-toggle[aria-expanded="true"]::before{transform:rotate(90deg)}.btn-toggle-nav a{display:inline-flex;padding:0.1875rem 0.5rem;margin-top:0.125rem;margin-left:1.25rem;text-decoration:none}.btn-toggle-nav a:hover,.btn-toggle-nav a:focus{background-color:transparent;color:#5d2f86}.btn-toggle-nav a.active{color:#5d2f86}.doks-navbar .dropdown-menu,.doks-subnavbar .dropdown-menu{font-size:0.875rem}.doks-navbar .dropdown-item.current,.doks-subnavbar .dropdown-item.current{font-weight:600;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23292b2c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1rem top 0.6rem;background-size:0.75rem 0.75rem}.btn-close{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-x'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");background-size:1.5rem}.offcanvas-header .btn-close{margin-right:0 !important}.dropdown-toggle::after{display:none}.dropdown-caret{margin-left:-0.1875rem;margin-right:-0.3125rem}pre,code,kbd,samp{font-family:sfmono-regular,menlo,monaco,consolas,"Liberation Mono","Courier New",monospace;font-size:.875rem;border-radius:.375rem}code{background:#fbf7f0;color:#1d2d35;padding:0.25rem 0.5rem}pre{margin:2rem 0}pre code{display:block;overflow-x:auto;line-height:1.5;padding:1.25rem 1.5rem;-moz-tab-size:4;-o-tab-size:4;tab-size:4;scrollbar-width:thin;scrollbar-color:transparent transparent}.hljs{padding:1.5rem !important}@media (max-width: 575.98px){pre,code,kbd,samp{border-radius:0}pre{margin:2rem -1.5rem}}pre code::-webkit-scrollbar{height:5px}pre code::-webkit-scrollbar-thumb{background:#ced4da}pre code:hover{scrollbar-width:thin;scrollbar-color:#adb5bd transparent}pre code::-webkit-scrollbar-thumb:hover{background:#adb5bd}code.language-mermaid{background:none}.hljs{display:block;overflow-x:auto;padding:1.25rem 1.5rem;background:#fbf7f0;color:#1d2d35}.hljs-string,.hljs-variable,.hljs-template-variable,.hljs-symbol,.hljs-bullet,.hljs-section,.hljs-addition,.hljs-attribute,.hljs-link{color:#d32e9d}.hljs-comment,.hljs-quote,.hljs-meta,.hljs-deletion{color:#888}.hljs-keyword,.hljs-selector-tag,.hljs-section,.hljs-name,.hljs-type,.hljs-strong{font-weight:bold}.hljs-emphasis{font-style:italic}[data-dark-mode] body .hljs{background:#1b1f22;color:#dee2e6}[data-dark-mode] body .hljs-string,[data-dark-mode] body .hljs-variable,[data-dark-mode] body .hljs-template-variable,[data-dark-mode] body .hljs-symbol,[data-dark-mode] body .hljs-bullet,[data-dark-mode] body .hljs-section,[data-dark-mode] body .hljs-addition,[data-dark-mode] body .hljs-attribute,[data-dark-mode] body .hljs-link{color:#8ed6fb}blockquote{margin-bottom:1rem;font-size:1.25rem;border-left:3px solid #dee2e6;padding-left:1rem}figure{margin:2rem 0}.figure-caption{margin:0.25rem 0 0.75rem}figure.wide{margin:2rem -1.5rem}figure.wide .figure-caption{margin:0.25rem 1.5rem 0.75rem}@media (min-width: 768px){figure.wide{margin:2rem -2.5rem}figure.wide .figure-caption{margin:0.25rem 2.5rem 0.75rem}}@media (min-width: 992px){figure.wide{margin:2rem -5rem}figure.wide .figure-caption{margin:0.25rem 5rem 0.75rem}}.blur-up{filter:blur(5px)}.blur-up.lazyloaded{filter:unset}.img-simple{margin-top:0.375rem;margin-bottom:1.25rem}.mermaid{margin:1.5rem 0;padding:1.5rem}.mermaid svg{height:auto}.navbar-form{position:relative}#suggestions{position:absolute;left:0;margin-top:0.5rem;width:calc(100vw - 3rem);z-index:1000}#suggestions a,.suggestion__no-results{padding:0.75rem;margin:0 0.5rem}#suggestions a{display:block;text-decoration:none}#suggestions a:focus{background:#f8f9fa;outline:0}#suggestions div:not(:first-child){border-top:1px dashed #e9ecef}#suggestions div:first-child{margin-top:0.5rem}#suggestions div:last-child{margin-bottom:0.5rem}#suggestions a:hover{background:#f8f9fa}#suggestions span{display:flex;font-size:1rem}.suggestion__title{font-weight:700;color:#1d2d35}.suggestion__description,.suggestion__no-results{color:#495057}@media (min-width: 576px){#suggestions{width:31.125rem}#suggestions a{display:flex}.suggestion__title{width:9rem;padding-right:1rem;border-right:1px solid #e9ecef;display:inline-block;text-align:right}.suggestion__description{width:19rem;padding-left:1rem}}table{margin:3rem 0}.footer{border-top:1px solid #e9ecef;padding-top:1.125rem;padding-bottom:1.125rem}.footer ul{margin-bottom:0}.footer li{font-size:.875rem;margin-bottom:0}@media (min-width: 768px){.footer li{font-size:1rem}}.navbar-text{margin-left:1rem}.navbar-brand{font-weight:700}.navbar{z-index:1000;background-color:rgba(255,255,255,0.95);border-bottom:1px solid #e9ecef}@media (min-width: 992px){.navbar{z-index:1025}}@media (min-width: 768px){.navbar-brand{font-size:1.375rem}.navbar-text{margin-left:1.25rem}}.navbar-nav{flex-direction:row}.nav-item{margin-left:0}@media (min-width: 768px){.nav-item{margin-left:0.5rem}}@media (max-width: 767.98px){.navbar .container{padding-left:1.5rem;padding-right:1.5rem}}button#doks-languages{margin-right:-0.5625rem;margin-left:0.75rem}button#doks-versions{margin-right:-0.5625rem;margin-left:0}.offcanvas .nav-link{color:#1d2d35}.doks-subnavbar{background-color:rgba(255,255,255,0.95);border-bottom:1px solid #e9ecef}.doks-subnavbar .nav-link{padding:0.5rem 1.5rem 0.5rem 0}.doks-subnavbar .nav-link:first-child{padding:0.5rem 1.5rem 0.5rem 0}.offcanvas .nav-link:hover,.offcanvas .nav-link:focus{color:#5d2f86}.offcanvas .nav-link.active{color:#5d2f86}.header-bar{border-top:4px solid;border-image-source:linear-gradient(90deg, #5d2f86, #8ed6fb 50%, #d32e9d);border-image-slice:1}.offcanvas .header-bar{margin-bottom:-4px}.home .navbar{border-bottom:0}@media (min-width: 768px){.navbar-brand{margin-right:0.75rem !important}.doks-search{max-width:20rem;margin-top:0.125rem;margin-bottom:0.125rem}}.form-control.is-search{padding-right:4rem;border:1px solid transparent;background:#f8f9fa}.form-control.is-search:focus{border:1px solid #5d2f86}.doks-search::after{position:absolute;top:0.4625rem;right:0.5375rem;display:flex;align-items:center;justify-content:center;height:1.5rem;padding-right:0.3125rem;padding-left:0.3125rem;font-size:.75rem;color:#495057;content:"Ctrl + /";border:1px solid #dee2e6;border-radius:0.25rem}.algolia-autocomplete{display:flex !important}.algolia-autocomplete .ds-dropdown-menu{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}@media (max-width: 575.98px){.algolia-autocomplete .ds-dropdown-menu{max-width:512px !important;min-width:312px !important;width:auto !important}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{font-weight:normal}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column::after{content:"/";margin-right:0.25rem}}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{color:#1d2d35}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:0}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{padding:0 0.05em}.algolia-autocomplete .algolia-docsearch-footer{margin-top:1rem;margin-right:0.5rem;margin-bottom:0.5rem}.navbar .menu-icon{cursor:pointer;padding:1.125rem 0.625rem;margin:0 0 0 -0.625rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.navbar .menu-icon .navicon{background:#1d2d35;display:block;height:2px;position:relative;transition:background 0.2s ease-out;width:18px}.navbar .menu-icon .navicon::before,.navbar .menu-icon .navicon::after{background:#1d2d35;content:"";display:block;height:100%;position:absolute;transition:all 0.2s ease-out;width:100%}.navbar .menu-icon .navicon::before{top:5px}.navbar .menu-icon .navicon::after{top:-5px}.btn-menu{margin-left:1rem}.btn-menu,.doks-sidebar-toggle{padding-right:0.25rem;padding-left:0.25rem;margin-right:-0.5rem}.btn-menu:hover,.btn-doks-light:hover,.doks-sidebar-toggle:hover{background:#fcfaff}.btn-menu:focus,.doks-sidebar-toggle:focus{outline:0}.doks-sidebar-toggle .doks-collapse{display:none}.doks-sidebar-toggle:not(.collapsed) .doks-expand{display:none}.doks-sidebar-toggle:not(.collapsed) .doks-collapse{display:inline-block}.navbar-light .navbar-brand,.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:active{color:#1d2d35}.navbar-light .navbar-nav .active .nav-link{color:#5d2f86}.dropdown-divider{border-top:1px dashed #e9ecef}.dropdown-item:hover{background:#f8f9fa}.dropdown-item:active{color:inherit}.docs-content>h2[id]::before,.docs-content>[id].h2::before,.docs-content>h3[id]::before,.docs-content>[id].h3::before,.docs-content>h4[id]::before,.docs-content>[id].h4::before{display:block;height:6rem;margin-top:-6rem;content:""}.anchor{visibility:hidden;padding-left:0.5rem}h1:hover a,.h1:hover a,h2:hover a,.h2:hover a,h3:hover a,.h3:hover a,h4:hover a,.h4:hover a{visibility:visible;text-decoration:none}.card-list{margin-top:2.25rem}.edit-page{margin-top:3rem;font-size:1rem}.edit-page svg{margin-right:0.5rem;margin-bottom:0.25rem}p.meta{margin-top:0.5rem;font-size:1rem}.breadcrumb{margin-top:2.25rem;font-size:1rem}.page-link:hover{text-decoration:none}.home .card,.contributors.list .card,.blog.list .card{margin-top:2rem;margin-bottom:2rem;transition:transform 0.3s}.home .card:hover,.contributors.list .card:hover,.blog.list .card:hover{transform:scale(1.025)}.home .card-body,.contributors.list .card-body,.blog.list .card-body{padding:0 2rem 1rem}.blog-header{text-align:center;margin-bottom:2rem}.docs-links,.docs-toc{scrollbar-width:thin;scrollbar-color:#fff #fff}.docs-links::-webkit-scrollbar,.docs-toc::-webkit-scrollbar{width:5px}.docs-links::-webkit-scrollbar-track,.docs-toc::-webkit-scrollbar-track{background:#fff}.docs-links::-webkit-scrollbar-thumb,.docs-toc::-webkit-scrollbar-thumb{background:#fff}.docs-links:hover,.docs-toc:hover{scrollbar-width:thin;scrollbar-color:#e9ecef #fff}.docs-links:hover::-webkit-scrollbar-thumb,.docs-toc:hover::-webkit-scrollbar-thumb{background:#e9ecef}.docs-links::-webkit-scrollbar-thumb:hover,.docs-toc::-webkit-scrollbar-thumb:hover{background:#e9ecef}.docs-links h3,.docs-links .h3,.page-links h3,.page-links .h3{text-transform:uppercase;font-size:1rem;margin:1.25rem 0 0.5rem 0;padding:1.5rem 0 0 0}@media (min-width: 992px){.docs-links h3,.docs-links .h3,.page-links h3,.page-links .h3{margin:1.125rem 1.5rem 0.75rem 0;padding:1.375rem 0 0 0}}.docs-links h3:not(:first-child),.docs-links .h3:not(:first-child){border-top:1px solid #e9ecef}a.docs-link{color:#1d2d35;display:block;padding:0.125rem 0;font-size:1rem}.page-links li{margin-top:0.375rem;padding-top:0.375rem}.page-links li ul li{border-top:none;padding-left:1rem;margin-top:0.125rem;padding-top:0.125rem}.page-links li:not(:first-child){border-top:1px dashed #e9ecef}.page-links a{color:#1d2d35;display:block;padding:0.125rem 0;font-size:.9375rem}.docs-link:hover,.docs-link.active,.page-links a:hover{text-decoration:none;color:#5d2f86}.docs-links h3.sidebar-link,.docs-links .sidebar-link.h3,.page-links h3.sidebar-link,.page-links .sidebar-link.h3{text-transform:none;font-size:1.125rem;font-weight:normal}.docs-links h3.sidebar-link a,.docs-links .sidebar-link.h3 a,.page-links h3.sidebar-link a,.page-links .sidebar-link.h3 a{color:#1d2d35}.docs-links h3.sidebar-link a:hover,.docs-links .sidebar-link.h3 a:hover,.page-links h3.sidebar-link a:hover,.page-links .sidebar-link.h3 a:hover{text-decoration:underline} diff --git a/main.min.cfa136509b4690212e37c116f5afc6938cf1c5d28348366a61feee1302c067a6e6892a265334fa686ec8cb6c64b2b94d8e269c5fabb6bd568c604ac0a1dc1c9b.js b/main.min.cfa136509b4690212e37c116f5afc6938cf1c5d28348366a61feee1302c067a6e6892a265334fa686ec8cb6c64b2b94d8e269c5fabb6bd568c604ac0a1dc1c9b.js new file mode 100644 index 00000000..ceb1d797 --- /dev/null +++ b/main.min.cfa136509b4690212e37c116f5afc6938cf1c5d28348366a61feee1302c067a6e6892a265334fa686ec8cb6c64b2b94d8e269c5fabb6bd568c604ac0a1dc1c9b.js @@ -0,0 +1 @@ +(()=>{var b=Object.create,a=Object.defineProperty,c=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,e=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty,g=b=>a(b,"__esModule",{value:!0}),h=(b,a)=>function(){return a||(0,b[Object.keys(b)[0]])((a={exports:{}}).exports,a),a.exports},i=(e,b,g)=>{if(b&&typeof b=="object"||typeof b=="function")for(let h of d(b))!f.call(e,h)&&h!=="default"&&a(e,h,{get:()=>b[h],enumerable:!(g=c(b,h))||g.enumerable});return e},j=c=>i(g(a(c!=null?b(e(c)):{},"default",c&&c.__esModule&&"default"in c?{get:()=>c.default,enumerable:!0}:{value:c,enumerable:!0})),c),k=h({"node_modules/lazysizes/lazysizes.js"(b,a){(function(b,d){var c=d(b,b.document,Date);b.lazySizes=c,typeof a=="object"&&a.exports&&(a.exports=c)})(typeof window!="undefined"?window:{},function(d,b,j){"use strict";var f,a,h,E,i,c,g,e,A,s,x,F,q,C,k,l,u,v,o,w,n,z,m,p,D,y,B,t,r;return function(){var c={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",fastLoadedClass:"ls-is-cached",iframeLoadMode:0,srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:!0,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:!0,ricTimeout:0,throttleDelay:125},b;a=d.lazySizesConfig||d.lazysizesConfig||{};for(b in c)b in a||(a[b]=c[b])}(),!b||!b.getElementsByClassName?{init:function(){},cfg:a,noSupport:!0}:(h=b.documentElement,E=d.HTMLPictureElement,i="addEventListener",c="getAttribute",g=d[i].bind(d),e=d.setTimeout,A=d.requestAnimationFrame||e,s=d.requestIdleCallback,x=/^picture$/i,F=["load","error","lazyincluded","_lazyloaded"],q={},C=Array.prototype.forEach,k=function(b,a){return q[a]||(q[a]=new RegExp("(\\s|^)"+a+"(\\s|$)")),q[a].test(b[c]("class")||"")&&q[a]},l=function(a,b){k(a,b)||a.setAttribute("class",(a[c]("class")||"").trim()+" "+b)},u=function(a,d){var b;(b=k(a,d))&&a.setAttribute("class",(a[c]("class")||"").replace(b," "))},v=function(a,b,c){var d=c?i:"removeEventListener";c&&v(a,b),F.forEach(function(c){a[d](c,b)})},o=function(d,e,a,g,h){var c=b.createEvent("Event");return a||(a={}),a.instance=f,c.initEvent(e,!g,!h),c.detail=a,d.dispatchEvent(c),c},w=function(e,b){var f;!E&&(f=d.picturefill||a.pf)?(b&&b.src&&!e[c]("srcset")&&e.setAttribute("srcset",b.src),f({reevaluate:!0,elements:[e]})):b&&b.src&&(e.src=b.src)},n=function(a,b){return(getComputedStyle(a,null)||{})[b]},z=function(d,c,b){for(b=b||d.offsetWidth;b49?function(){s(g,{timeout:b}),b!==a.ricTimeout&&(b=a.ricTimeout)}:p(function(){e(g)},!0),c;return function(g){var a;if((g=g===!0)&&(b=33),c)return;c=!0,a=h-(j.now()-f),a<0&&(a=0),g||a<9?d():e(d,a)}},y=function(g){var b=99,d=function(){a=null,g()},f=function(){var a=j.now()-c;a0,d&&n(a,"overflow")!="visible"&&(c=a.getBoundingClientRect(),d=I>c.left&&Hc.top-1&&G500&&h.clientWidth>500?500:370:a.expand,f._defEx=j,p=j*a.expFactor,n=a.hFac,K=null,F2&&E>2&&!b.hidden?(F=p,s=0):E>1&&s>1&&r<6?F=j:F=ab),q!==g&&(R=innerWidth+g*n,Q=innerHeight+g,m=g*-1,q=g),i=e[d].getBoundingClientRect(),(J=i.bottom)>=m&&(G=i.top)<=Q&&(I=i.right)>=m*n&&(H=i.left)<=R&&(J||I||H||G)&&(a.loadHidden||T(e[d]))&&(z&&r<3&&!l&&(E<3||s<4)||X(e[d],g))){if(B(e[d]),o=!0,r>9)break}else!o&&z&&!k&&r<4&&s<4&&E>2&&(L[0]||a.preloadAfterLoad)&&(L[0]||!l&&(J||I||H||G||e[d][c](a.sizesAttr)!="auto"))&&(k=L[0]||e[d])}k&&!o&&B(k)}},q=D(V),U=function(c){var b=c.target;if(b._lazyCache){delete b._lazyCache;return}S(c),l(b,a.loadedClass),u(b,a.loadingClass),v(b,P),o(b,"lazyloaded")},Y=p(U),P=function(a){Y({target:a.target})},_=function(b,c){var d=b.getAttribute("data-load-mode")||a.iframeLoadMode;d==0?b.contentWindow.location.replace(c):d==1&&(b.src=c)},$=function(b){var e=b[c](a.srcsetAttr),d;(d=a.customMedia[b[c]("data-media")||b[c]("media")])&&b.setAttribute("media",d),e&&b.setAttribute("srcset",e)},aa=p(function(b,k,q,n,p){var d,g,h,f,i,j;(i=o(b,"lazybeforeunveil",k)).defaultPrevented||(n&&(q?l(b,a.autosizesClass):b.setAttribute("sizes",n)),g=b[c](a.srcsetAttr),d=b[c](a.srcAttr),p&&(h=b.parentNode,f=h&&x.test(h.nodeName||"")),j=k.firesLoad||"src"in b&&(g||d||f),i={target:b},l(b,a.loadingClass),j&&(clearTimeout(O),O=e(S,2500),v(b,P,!0)),f&&C.call(h.getElementsByTagName("source"),$),g?b.setAttribute("srcset",g):d&&!f&&(ae.test(b.nodeName)?_(b,d):b.src=d),p&&(g||f)&&w(b,{src:d})),b._lazyRace&&delete b._lazyRace,u(b,a.lazyClass),m(function(){var c=b.complete&&b.naturalWidth>1;(!j||c)&&(c&&l(b,a.fastLoadedClass),U(i),b._lazyCache=!0,e(function(){"_lazyCache"in b&&delete b._lazyCache},9)),b.loading=="lazy"&&r--},!0)}),B=function(b){var f,d,g,e;if(b._lazyRace)return;if(d=Z.test(b.nodeName),g=d&&(b[c](a.sizesAttr)||b[c]("sizes")),e=g=="auto",(e||!z)&&d&&(b[c]("src")||b.srcset)&&!b.complete&&!k(b,a.errorClass)&&k(b,a.lazyClass))return;f=o(b,"lazyunveilread").detail,e&&t.updateElem(b,!0,b.offsetWidth),b._lazyRace=!0,r++,aa(b,f,e,g,d)},ac=y(function(){a.loadMode=3,q()}),N=function(){a.loadMode==3&&(a.loadMode=2),ac()},M=function(){if(z)return;if(j.now()-W<999){e(M,999);return}z=!0,a.loadMode=3,q(),g("scroll",N,!0)},J,K,L,z,O,E,W,R,Q,G,H,I;return{_:function(){W=j.now(),f.elements=b.getElementsByClassName(a.lazyClass),L=b.getElementsByClassName(a.lazyClass+" "+a.preloadClass),g("scroll",q,!0),g("resize",q,!0),g("pageshow",function(d){if(d.persisted){var c=b.querySelectorAll("."+a.loadingClass);c.length&&c.forEach&&A(function(){c.forEach(function(a){a.complete&&B(a)})})}}),d.MutationObserver?new MutationObserver(q).observe(h,{childList:!0,subtree:!0,attributes:!0}):(h[i]("DOMNodeInserted",q,!0),h[i]("DOMAttrModified",q,!0),setInterval(q,999)),g("hashchange",q,!0),["focus","mouseover","click","load","transitionend","animationend"].forEach(function(a){b[i](a,q,!0)}),/d$|^c/.test(b.readyState)?M():(g("load",M),b[i]("DOMContentLoaded",q),e(M,2e4)),f.elements.length?(V(),m._lsFlush()):q()},checkElems:q,unveil:B,_aLSL:N}}(),t=function(){var f=p(function(c,e,f,a){var d,b,g;if(c._lazysizesWidth=a,a+="px",c.setAttribute("sizes",a),x.test(e.nodeName||"")){d=e.getElementsByTagName("source");for(b=0,g=d.length;b{var q=Object.create,b=Object.defineProperty,p=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,n=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,i=a=>b(a,"__esModule",{value:!0}),h=(b,a)=>function(){return a||(0,b[Object.keys(b)[0]])((a={exports:{}}).exports,a),a.exports},g=(c,a,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of o(a))!m.call(c,e)&&e!=="default"&&b(c,e,{get:()=>a[e],enumerable:!(d=p(a,e))||d.enumerable});return c},j=a=>g(i(b(a!=null?q(n(a)):{},"default",a&&a.__esModule&&"default"in a?{get:()=>a.default,enumerable:!0}:{value:a,enumerable:!0})),a),k=h({"node_modules/clipboard/dist/clipboard.js"(a,b){(function(d,c){typeof a=="object"&&typeof b=="object"?b.exports=c():typeof define=="function"&&define.amd?define([],c):typeof a=="object"?a.ClipboardJS=c():d.ClipboardJS=c()})(a,function(){return function(){var c={686:function(G,F,a){"use strict";var t,q,p,n,m,f,l,g,h,o,e,r,s,u,w;a.d(F,{default:function(){return w}}),t=a(279),q=a.n(t),p=a(370),n=a.n(p),m=a(817),f=a.n(m);function j(a){try{return document.execCommand(a)}catch(a){return!1}}l=function(a){var b=f()(a);return j("cut"),b},g=l;function E(b){var c=document.documentElement.getAttribute("dir")==="rtl",a=document.createElement("textarea"),d;return a.style.fontSize="12pt",a.style.border="0",a.style.padding="0",a.style.margin="0",a.style.position="absolute",a.style[c?"right":"left"]="-9999px",d=window.pageYOffset||document.documentElement.scrollTop,a.style.top="".concat(d,"px"),a.setAttribute("readonly",""),a.value=b,a}h=function(b,c){var a=E(b),d;return c.container.appendChild(a),d=f()(a),j("copy"),a.remove(),d},o=function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},b="";return typeof a=="string"?b=h(a,c):a instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(a===null||a===void 0?void 0:a.type)?b=h(a.value,c):(b=f()(a),j("copy")),b},e=o;function d(a){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?d=function(a){return typeof a}:d=function(a){return a&&typeof Symbol=="function"&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},d(a)}r=function(){var c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},h=c.action,b=h===void 0?"copy":h,i=c.container,a=c.target,f=c.text;if(b!=="copy"&&b!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(a!==void 0)if(a&&d(a)==="object"&&a.nodeType===1){{if(b==="copy"&&a.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(b==="cut"&&(a.hasAttribute("readonly")||a.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}}else throw new Error('Invalid "target" value, use a valid Element');if(f)return e(f,{container:i});if(a)return b==="cut"?g(a):e(a,{container:i})},s=r;function b(a){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?b=function(a){return typeof a}:b=function(a){return a&&typeof Symbol=="function"&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},b(a)}function D(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function v(d,c){for(var b=0,a;b0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof a.action=="function"?a.action:this.defaultAction,this.target=typeof a.target=="function"?a.target:this.defaultTarget,this.text=typeof a.text=="function"?a.text:this.defaultText,this.container=b(a.container)==="object"?a.container:document.body}},{key:"listenClick",value:function(a){var b=this;this.listener=n()(a,"click",function(a){return b.onClick(a)})}},{key:"onClick",value:function(b){var a=b.delegateTarget||b.currentTarget,c=this.action(a)||"copy",d=s({action:c,container:this.container,target:this.target(a),text:this.text(a)});this.emit(d?"success":"error",{action:c,text:d,trigger:a,clearSelection:function(){a&&a.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(a){return i("action",a)}},{key:"defaultTarget",value:function(b){var a=i("target",b);if(a)return document.querySelector(a)}},{key:"defaultText",value:function(a){return i("text",a)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(a){var b=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return e(a,b)}},{key:"cut",value:function(a){return g(a)}},{key:"isSupported",value:function(){var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],c=typeof a=="string"?[a]:a,b=!!document.queryCommandSupported;return c.forEach(function(a){b=b&&!!document.queryCommandSupported(a)}),b}}]),a}(q()),w=u},828:function(b){var c=9,a;typeof Element!="undefined"&&!Element.prototype.matches&&(a=Element.prototype,a.matches=a.matchesSelector||a.mozMatchesSelector||a.msMatchesSelector||a.oMatchesSelector||a.webkitMatchesSelector);function d(a,b){while(a&&a.nodeType!==c){if(typeof a.matches=="function"&&a.matches(b))return a;a=a.parentNode}}b.exports=d},438:function(b,g,c){var d=c(828);function a(a,e,b,g,c){var d=f.apply(this,arguments);return a.addEventListener(b,d,c),{destroy:function(){a.removeEventListener(b,d,c)}}}function e(b,d,c,e,f){return typeof b.addEventListener=="function"?a.apply(null,arguments):typeof c=="function"?a.bind(null,document).apply(null,arguments):(typeof b=="string"&&(b=document.querySelectorAll(b)),Array.prototype.map.call(b,function(b){return a(b,d,c,e,f)}))}function f(a,b,e,c){return function(e){e.delegateTarget=d(e.target,b),e.delegateTarget&&c.call(a,e)}}b.exports=e},879:function(b,a){a.node=function(a){return a!==void 0&&a instanceof HTMLElement&&a.nodeType===1},a.nodeList=function(b){var c=Object.prototype.toString.call(b);return b!==void 0&&(c==="[object NodeList]"||c==="[object HTMLCollection]")&&"length"in b&&(b.length===0||a.node(b[0]))},a.string=function(a){return typeof a=="string"||a instanceof String},a.fn=function(a){var b=Object.prototype.toString.call(a);return b==="[object Function]"}},370:function(c,i,b){var a=b(879),e=b(438);function f(b,c,e){if(!b&&!c&&!e)throw new Error("Missing required arguments");if(!a.string(c))throw new TypeError("Second argument must be a String");if(!a.fn(e))throw new TypeError("Third argument must be a Function");if(a.node(b))return g(b,c,e);if(a.nodeList(b))return d(b,c,e);if(a.string(b))return h(b,c,e);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function g(a,b,c){return a.addEventListener(b,c),{destroy:function(){a.removeEventListener(b,c)}}}function d(a,b,c){return Array.prototype.forEach.call(a,function(a){a.addEventListener(b,c)}),{destroy:function(){Array.prototype.forEach.call(a,function(a){a.removeEventListener(b,c)})}}}function h(a,b,c){return e(document.body,a,b,c)}c.exports=f},817:function(a){function b(a){var b,d,c,e;return a.nodeName==="SELECT"?(a.focus(),b=a.value):a.nodeName==="INPUT"||a.nodeName==="TEXTAREA"?(d=a.hasAttribute("readonly"),d||a.setAttribute("readonly",""),a.select(),a.setSelectionRange(0,a.value.length),d||a.removeAttribute("readonly"),b=a.value):(a.hasAttribute("contenteditable")&&a.focus(),c=window.getSelection(),e=document.createRange(),e.selectNodeContents(a),c.removeAllRanges(),c.addRange(e),b=c.toString()),b}a.exports=b},279:function(b){function a(){}a.prototype={on:function(a,c,d){var b=this.e||(this.e={});return(b[a]||(b[a]=[])).push({fn:c,ctx:d}),this},once:function(b,c,d){var e=this;function a(){e.off(b,a),c.apply(d,arguments)}return a._=c,this.on(b,a,d)},emit:function(c){var d=[].slice.call(arguments,1),b=((this.e||(this.e={}))[c]||[]).slice(),a=0,e=b.length;for(a;a');d=new l.default(".btn-copy",{target:function(a){return a.nextElementSibling}}),d.on("success",function(a){a.clearSelection()}),d.on("error",function(a){console.error("Action:",a.action),console.error("Trigger:",a.trigger)})})(),(()=>{var c=null,f=65,h=new Set,k=1111,j,e,a,i,g;p();function p(){const r=document.createElement("link").relList.supports("prefetch");if(!r)return;const s="instantVaryAccept"in document.body.dataset||"Shopify"in window,k=navigator.userAgent.indexOf("Chrome/");if(k>-1&&(c=parseInt(navigator.userAgent.substring(k+"Chrome/".length))),s&&c&&c<110)return;const n="instantMousedownShortcut"in document.body.dataset;j="instantAllowQueryString"in document.body.dataset,i="instantAllowExternalLinks"in document.body.dataset,g="instantWhitelist"in document.body.dataset;const a={capture:!0,passive:!0};let p=!1,h=!1,e=!1;if("instantIntensity"in document.body.dataset){const a=document.body.dataset.instantIntensity;if(a.startsWith("mousedown"))p=!0,a=="mousedown-only"&&(h=!0);else if(a.startsWith("viewport")){const b=navigator.connection&&navigator.connection.saveData,c=navigator.connection&&navigator.connection.effectiveType&&navigator.connection.effectiveType.includes("2g");!b&&!c&&(a=="viewport"?document.documentElement.clientWidth*document.documentElement.clientHeight<45e4&&(e=!0):a=="viewport-all"&&(e=!0))}else{const b=parseInt(a);isNaN(b)||(f=b)}}if(h||document.addEventListener("touchstart",q,a),p?n||document.addEventListener("mousedown",m,a):document.addEventListener("mouseover",l,a),n&&document.addEventListener("mousedown",o,a),e){let a=window.requestIdleCallback;a||(a=a=>{a()}),a(function(){const a=new IntersectionObserver(b=>{b.forEach(b=>{if(b.isIntersecting){const c=b.target;a.unobserve(c),d(c.href)}})});document.querySelectorAll("a").forEach(c=>{b(c)&&a.observe(c)})},{timeout:1500})}}function q(c){e=performance.now();const a=c.target.closest("a");if(!b(a))return;d(a.href,"high")}function l(g){if(performance.now()-e{d(c.href,"high"),a=void 0},f)}function m(c){const a=c.target.closest("a");if(!b(a))return;d(a.href,"high")}function n(b){if(b.relatedTarget&&b.target.closest("a")==b.relatedTarget.closest("a"))return;a&&(clearTimeout(a),a=void 0)}function o(a){if(performance.now()-e1||a.metaKey||a.ctrlKey)return;if(!b)return;b.addEventListener("click",function(a){if(a.detail==1337)return;a.preventDefault()},{capture:!0,passive:!1,once:!0});const c=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1,detail:1337});b.dispatchEvent(c)}function b(a){if(!a||!a.href)return;if(g&&!("instant"in a.dataset))return;if(a.origin!=location.origin){let b=i||"instant"in a.dataset;if(!b||!c)return}if(!["http:","https:"].includes(a.protocol))return;if(a.protocol=="http:"&&location.protocol=="https:")return;if(!j&&a.search&&!("instant"in a.dataset))return;if(a.hash&&a.pathname+a.search==location.pathname+location.search)return;if("noInstant"in a.dataset)return;return!0}function d(b,c="auto"){if(h.has(b))return;const a=document.createElement("link");a.rel="prefetch",a.href=b,a.fetchPriority=c,a.as="document",document.head.appendChild(a),h.add(b)}})(),function ad(e){'use strict';var b,N,G,U,A,R;try{module&&(e=module)}catch(a){}e._factory=ad;function r(a){return"undefined"==typeof a||a}function T(b){const c=Array(b);for(let d=0;d=this.B&&(n||!k[p]))switch(c=q(m,f,r),e="",this.G){case"full":if(2c;b--)b-c>=this.B&&(h=q(m,f,r,d,c),e=p.substring(c,b),l(this,k,e,h,g,j));break}case"reverse":if(1=this.B&&l(this,k,e,q(m,f,r,d,b),g,j);e=""}case"forward":if(1=this.B&&l(this,k,e,c,g,j);break}default:if(this.C&&(c=Math.min(c/this.C(i,p,r)|0,m-1)),l(this,k,p,c,g,j),n&&1=this.B&&!d[p]){d[p]=1;const a=this.l&&p>c;l(this,o,a?c:p,q(e+(f/2>e?0:1),f,r,b-1,h-1),g,j,a?p:c)}}}this.m||(this.register[g]=1)}}return this};function q(a,c,b,d,e){return b&&1=this.B&&!b[a])if(this.s||h||this.map[a])j[f++]=a,b[a]=1;else return g;c=j,d=c.length}if(!d)return g;e||(e=100),i=this.depth&&1=i)))break;if(j){if(f)return H(e,i,0);h[h.length]=e;return}}return!j&&e}function H(a,c,b){return a=1===a.length?a[0]:[].concat.apply([],a),b||a.length>c?a.slice(b,b+c):a}function I(a,b,c,d){return c?(d=d&&b>c,a=(a=a[d?b:c])&&a[d?c:b]):a=a[b],a}b.contain=function(a){return!!this.register[a]},b.update=function(a,b){return this.remove(a).add(a,b)},b.remove=function(b,a){const c=this.register[b];if(c){if(this.m)for(let a=0,d;ae||b)&&(a=a.slice(b,b+e)),f&&(a=V.call(this,a)),{tag:d,result:a}}function V(a){const b=Array(a.length);for(let c=0,d;c{var a=document.getElementById("mode");a!==null&&(window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",a=>{a.matches?(localStorage.setItem("theme","dark"),document.documentElement.setAttribute("data-dark-mode","")):(localStorage.setItem("theme","light"),document.documentElement.removeAttribute("data-dark-mode"))}),a.addEventListener("click",()=>{document.documentElement.toggleAttribute("data-dark-mode"),localStorage.setItem("theme",document.documentElement.hasAttribute("data-dark-mode")?"dark":"light")}),localStorage.getItem("theme")==="dark"?document.documentElement.setAttribute("data-dark-mode",""):document.documentElement.removeAttribute("data-dark-mode"))})(),(()=>{var a=document.getElementById("announcement");a!==null&&(localStorage.getItem("announcement")===null&&a.classList.remove("d-none"),a.addEventListener("closed.bs.alert",()=>{localStorage.setItem("announcement","closed")}))})() \ No newline at end of file diff --git a/static/metrics/index.html b/metrics/index.html similarity index 100% rename from static/metrics/index.html rename to metrics/index.html diff --git a/netlify.toml b/netlify.toml deleted file mode 100644 index 45537d00..00000000 --- a/netlify.toml +++ /dev/null @@ -1,30 +0,0 @@ -[build] - publish = "public" - functions = "functions" - -[build.environment] - NODE_VERSION = "16.9.1" - NPM_VERSION = "7.21.1" - -[context.production] - command = "npm run build" - -[context.deploy-preview] - command = "npm run build -- -b $DEPLOY_PRIME_URL" - -[context.branch-deploy] - command = "npm run build -- -b $DEPLOY_PRIME_URL" - -[context.next] - command = "npm run build" - -[context.next.environment] - HUGO_ENV = "next" - -[dev] - framework = "#custom" - command = "npm run start" - targetPort = 1313 - port = 8888 - publish = "public" - autoLaunch = false diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 8690cefb..00000000 --- a/package-lock.json +++ /dev/null @@ -1,15501 +0,0 @@ -{ - "name": "@hyas/doks", - "version": "0.3.5", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@hyas/doks", - "version": "0.3.5", - "hasInstallScript": true, - "license": "MIT", - "devDependencies": { - "@babel/cli": "^7.15", - "@babel/core": "^7.15", - "@babel/preset-env": "^7.15", - "@fullhuman/postcss-purgecss": "^8.0", - "auto-changelog": "^2.3.0", - "autoprefixer": "^10.3", - "bootstrap": "^5.1", - "clipboard": "^2.0", - "eslint": "^9.0", - "exec-bin": "^1.0.0", - "flexsearch": "^0.7.21", - "highlight.js": "^11.2", - "hugo-installer": "^4.0", - "instant.page": "^5.1", - "katex": "^0.16", - "lazysizes": "^5.3", - "markdownlint-cli": "^0.47", - "mermaid": "^11.0", - "node-fetch": "^3.0", - "postcss": "^8.3", - "postcss-cli": "^11.0", - "purgecss-whitelister": "^2.4", - "shx": "^0.4.0", - "stylelint": "^17.0", - "stylelint-config-standard": "^40.0" - } - }, - "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/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "dev": true, - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@antfu/utils": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.2.0.tgz", - "integrity": "sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@babel/cli": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.6.tgz", - "integrity": "sha512-6EUNcuBbNkj08Oj4gAZ+BUU8yLCgKzgVX4gaTh09Ya2C8ICM4P+G30g4m3akRxSYAp3A/gnWchrNst7px4/nUQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.28", - "commander": "^6.2.0", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.6.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/cli/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/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "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/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/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/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/@babel/helper-compilation-targets/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/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", - "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", - "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", - "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", - "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.6", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.6", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", - "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", - "dev": true - }, - "node_modules/@cacheable/memory": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.5.tgz", - "integrity": "sha512-fkiAxCvssEyJZ5fxX4tcdZFRmW9JehSTGvvqmXn6rTzG5cH6V/3C4ad8yb01vOjp2xBydHkHrgpW0qeGtzt6VQ==", - "dev": true, - "dependencies": { - "@cacheable/utils": "^2.3.0", - "@keyv/bigmap": "^1.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.4" - } - }, - "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz", - "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", - "dev": true, - "dependencies": { - "hashery": "^1.2.0", - "hookified": "^1.13.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "keyv": "^5.5.4" - } - }, - "node_modules/@cacheable/memory/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", - "dev": true, - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, - "node_modules/@cacheable/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-38NJXjIr4W1Sghun8ju+uYWD8h2c61B4dKwfnQHVDFpAJ9oS28RpfqZQJ6Dgd3RceGkILDY9YT+72HJR3LoeSQ==", - "dev": true, - "dependencies": { - "hashery": "^1.2.0", - "keyv": "^5.5.4" - } - }, - "node_modules/@cacheable/utils/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", - "dev": true, - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "dev": true, - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "dev": true, - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "dev": true - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "dev": true - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "dev": true - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.25.tgz", - "integrity": "sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", - "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", - "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@fullhuman/postcss-purgecss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-8.0.0.tgz", - "integrity": "sha512-fSRaBGf6+DYdfQMxedWfnIW8FSYE1LBpgy16jpK1L2vNb1HgeBRRZ+UX4UokNmW7YEAwPdvwkKdYtlkYpH+Aqg==", - "dev": true, - "dependencies": { - "purgecss": "^8.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true - }, - "node_modules/@iconify/utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.1.tgz", - "integrity": "sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==", - "dev": true, - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@antfu/utils": "^9.2.0", - "@iconify/types": "^2.0.0", - "debug": "^4.4.1", - "globals": "^15.15.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.1.1", - "mlly": "^1.7.4" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@keyv/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - "dev": true - }, - "node_modules/@mermaid-js/parser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", - "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", - "dev": true, - "dependencies": { - "langium": "3.3.1" - } - }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, - "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/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "dev": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "dev": true, - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "dev": true - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "dev": true - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "dev": true, - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "dev": true - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "dev": true - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "dev": true - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "dev": true, - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "dev": true - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "dev": true - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dev": true, - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "dev": true - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dev": true, - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", - "dev": true - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "dev": true - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "dev": true - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "dev": true - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dev": true, - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", - "dev": true - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "dev": true - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "dev": true, - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", - "dev": true - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "dev": true - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dev": true, - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "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/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", - "dev": true - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "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, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "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": "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/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "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/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/auto-changelog": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.5.0.tgz", - "integrity": "sha512-UTnLjT7I9U2U/xkCUH5buDlp8C7g0SGChfib+iDrJkamcj5kaMqNKHNfbKJw1kthJUq8sUo3i3q2S6FzO/l/wA==", - "dev": true, - "dependencies": { - "commander": "^7.2.0", - "handlebars": "^4.7.7", - "import-cwd": "^3.0.0", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.3", - "semver": "^7.3.5" - }, - "bin": { - "auto-changelog": "src/index.js" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/auto-changelog/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/auto-changelog/node_modules/node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/auto-changelog/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "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/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/baseline-browser-mapping": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.7.tgz", - "integrity": "sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==", - "dev": true, - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "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/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "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": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "node_modules/cacheable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.2.0.tgz", - "integrity": "sha512-LEJxRqfeomiiRd2t0uON6hxAtgOoWDfY3fugebbz+J3vDLO+SkdfFChQcOHTZhj9SYa9iwE9MGYNX72dKiOE4w==", - "dev": true, - "dependencies": { - "@cacheable/memory": "^2.0.5", - "@cacheable/utils": "^2.3.0", - "hookified": "^1.13.0", - "keyv": "^5.5.4", - "qified": "^0.5.2" - } - }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", - "dev": true, - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, - "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/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", - "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/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "dev": true, - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "dev": true, - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "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/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-stack/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "dev": true, - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/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/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true - }, - "node_modules/core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", - "dev": true, - "dependencies": { - "browserslist": "^4.25.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dev": true, - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", - "dev": true, - "engines": { - "node": ">=12 || >=16" - } - }, - "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "dev": true, - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cytoscape": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", - "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "dev": true, - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "dev": true, - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "dev": true, - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "dev": true - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "dev": true, - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dev": true, - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dev": true, - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dev": true, - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "dev": true, - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "dev": true, - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "dev": true, - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "dev": true - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dev": true, - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "dev": true - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "dev": true, - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dev": true, - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dev": true, - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", - "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", - "dev": true, - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/dayjs": { - "version": "1.11.18", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", - "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", - "dev": true - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "dev": true, - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dev": true, - "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "dependencies": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, - "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress/node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "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/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/del": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", - "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", - "dev": true, - "dependencies": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", - "is-glob": "^4.0.3", - "is-path-cwd": "^3.0.0", - "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dev": true, - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true - }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dompurify": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", - "dev": true, - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "dev": true - }, - "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/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "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, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.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/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/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/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.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/exec-bin": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/exec-bin/-/exec-bin-1.0.0.tgz", - "integrity": "sha512-p8f8h8b6op2nR7U5rsd+zACUMfsfB+jW8HNIBD2njOQ/gF2WvBfQRo/OU6Q6f/b34WLAyePZcwMJyrDdEjB/fw==", - "dev": true, - "bin": { - "exec-bin": "bin/exec-bin.js" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "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.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "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/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fetch-blob": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", - "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/flexsearch": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.31.tgz", - "integrity": "sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==", - "dev": true - }, - "node_modules/form-data-encoder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.2.tgz", - "integrity": "sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "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/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-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-all": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz", - "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==", - "dev": true, - "dependencies": { - "glob": "^7.1.2", - "yargs": "^15.3.1" - }, - "bin": { - "glob-all": "bin/glob-all" - } - }, - "node_modules/glob-all/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/glob-all/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-all/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/glob-all/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-all/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "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/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.0.tgz", - "integrity": "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "gonzales": "bin/gonzales.js" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "dependencies": { - "delegate": "^3.1.2" - } - }, - "node_modules/got": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.4.1.tgz", - "integrity": "sha512-Sz1ojLt4zGNkcftIyJKnulZT/yEDvifhUjccHA8QzOuTgPs/+njXYNMFE3jR4/2OODQSSbH8SdnoLCkbh41ieA==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.0", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hashery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.2.0.tgz", - "integrity": "sha512-43XJKpwle72Ik5Zpam7MuzRWyNdwwdf6XHlh8wCj2PggvWf+v/Dm5B0dxGZOmddidgeO6Ofu9As/o231Ti/9PA==", - "dev": true, - "dependencies": { - "hookified": "^1.13.0" - }, - "engines": { - "node": ">=20" - } - }, - "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/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/hookified": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", - "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", - "dev": true - }, - "node_modules/hpagent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.0.0.tgz", - "integrity": "sha512-SCleE2Uc1bM752ymxg8QXYGW0TWtAV4ZW3TqH1aOnyi6T6YW2xadCcclm5qeVjvMvfQ2RKNtZxO7uVb9CTPt1A==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", - "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", - "dev": true, - "engines": { - "node": ">=20.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/hugo-installer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/hugo-installer/-/hugo-installer-4.0.1.tgz", - "integrity": "sha512-pkp1RO7+ekQ0vw1aqgBMK+dD2dqioIWVbwWKsJsKLOpzfFc78gK68Cweoi/g+CftoiMFO7cyGx/2MgkHCMqaLQ==", - "dev": true, - "dependencies": { - "decompress": "4.2.x", - "del": "7.0.x", - "got": "12.4.x", - "hpagent": "1.0.x", - "object-path": "0.11.x", - "semver": "7.3.x", - "yargs": "17.5.x" - }, - "bin": { - "hugo-installer": "bin/hugo-installer.js" - } - }, - "node_modules/hugo-installer/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "dependencies": { - "import-from": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "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/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/instant.page": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/instant.page/-/instant.page-5.2.0.tgz", - "integrity": "sha512-DUSwWyoHFOQnmEwJtg9vzDx8Ef8uNNvTxTmHjd0vN9/XEIb5EQkm/itpZMypoH3dJLJvtkrD97WOCKuMqDdMHQ==", - "dev": true - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "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-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true - }, - "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-path-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "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, - "license": "MIT" - }, - "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "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.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/katex": { - "version": "0.16.28", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz", - "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", - "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "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/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true - }, - "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", - "dev": true, - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "dev": true - }, - "node_modules/lazysizes": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.2.tgz", - "integrity": "sha512-22UzWP+Vedi/sMeOr8O7FWimRVtiNJV2HCa+V8+peZOw6QbswN9k58VUhd7i6iK5bw5QkYrF01LJbeJe0PV8jg==", - "dev": true - }, - "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/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", - "dev": true, - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "node_modules/lodash.forown": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", - "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", - "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/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "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==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdownlint": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", - "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", - "dev": true, - "dependencies": { - "micromark": "4.0.2", - "micromark-core-commonmark": "2.0.3", - "micromark-extension-directive": "4.0.0", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.1", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2", - "string-width": "8.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-cli": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.47.0.tgz", - "integrity": "sha512-HOcxeKFAdDoldvoYDofd85vI8LgNWy8vmYpCwnlLV46PJcodmGzD7COSSBlhHwsfT4o9KrAStGodImVBus31Bg==", - "dev": true, - "dependencies": { - "commander": "~14.0.2", - "deep-extend": "~0.6.0", - "ignore": "~7.0.5", - "js-yaml": "~4.1.1", - "jsonc-parser": "~3.3.1", - "jsonpointer": "~5.0.1", - "markdown-it": "~14.1.0", - "markdownlint": "~0.40.0", - "minimatch": "~10.1.1", - "run-con": "~1.3.2", - "smol-toml": "~1.5.2", - "tinyglobby": "~0.2.15" - }, - "bin": { - "markdownlint": "markdownlint.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/markdownlint-cli/node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "dev": true, - "engines": { - "node": ">=20" - } - }, - "node_modules/markdownlint-cli/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/markdownlint-cli/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/markdownlint/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/markdownlint/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "dev": true, - "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdownlint/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/marked": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", - "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mathml-tag-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", - "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "dev": true - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/meow": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-14.0.0.tgz", - "integrity": "sha512-JhC3R1f6dbspVtmF3vKjAWz1EVIvwFrGGPLSdU6rK79xBwHWTuHoLnRX/t1/zHS1Ch1Y2UtIrih7DAHuH9JFJA==", - "dev": true, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/mermaid": { - "version": "11.12.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", - "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", - "dev": true, - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.1", - "@mermaid-js/parser": "^0.6.3", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.13", - "dayjs": "^1.11.18", - "dompurify": "^3.2.5", - "katex": "^0.16.22", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.2.1", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "dev": true, - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "dev": true, - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "dev": true, - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "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": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "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/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "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-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-manager-detector": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", - "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", - "dev": true - }, - "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/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", - "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "dev": true - }, - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "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-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": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "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/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "dev": true, - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "dev": true - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "dev": true, - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-cli": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", - "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.3.0", - "dependency-graph": "^1.0.0", - "fs-extra": "^11.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^5.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^5.0.0", - "tinyglobby": "^0.2.12", - "yargs": "^17.0.0" - }, - "bin": { - "postcss": "index.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-cli/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/postcss-load-config": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.0.2.tgz", - "integrity": "sha512-Q8QR3FYbqOKa0bnC1UQ2bFq9/ulHX5Bi34muzitMr8aDtUelO5xKeJEYC/5smE0jNE9zdB/NBnOwXKexELbRlw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/postcss-reporter": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.4.tgz", - "integrity": "sha512-jY/fnpGSin7kwJeunXbY35STp5O3VIxSFdjee5JkoPQ+FfGH5JW3N+Xe9oAPcL9UkjWjkK+JC72o8XH4XXKdhw==", - "dev": true, - "dependencies": { - "lodash.difference": "^4.5.0", - "lodash.forown": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.groupby": "^4.6.0", - "lodash.sortby": "^4.7.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "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/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/purgecss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-8.0.0.tgz", - "integrity": "sha512-QFJyps9y5oHeXnNA3Ql1EaAqWBivNwQn19Pw1lt9RxfB+4e+bIyqCyuombk79D6Fxe+lPXggVfI1WtRGEBwgbQ==", - "dev": true, - "dependencies": { - "commander": "^12.1.0", - "fast-glob": "^3.3.2", - "postcss": "^8.4.47", - "postcss-selector-parser": "^7.0.0" - }, - "bin": { - "purgecss": "bin/purgecss.js" - } - }, - "node_modules/purgecss-whitelister": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/purgecss-whitelister/-/purgecss-whitelister-2.4.0.tgz", - "integrity": "sha512-O0jBUDtY9dU9tUT0vA1FvwFdkKDerxzteYaBV49JCbm+QJLFKMlIsf5Kp5cdbLatHQNjJtV8VB8eXtISoZL2Dg==", - "dev": true, - "dependencies": { - "glob-all": "^3.1.0", - "gonzales-pe": "^4.2.4", - "scss-parser": "1.0.3" - } - }, - "node_modules/purgecss/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/qified": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.2.tgz", - "integrity": "sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==", - "dev": true, - "dependencies": { - "hookified": "^1.13.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ] - }, - "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/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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/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/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "dev": true, - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "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/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "dev": true - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "dev": true, - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "node_modules/run-con": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", - "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~4.1.0", - "minimist": "^1.2.8", - "strip-json-comments": "~3.1.1" - }, - "bin": { - "run-con": "cli.js" - } - }, - "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/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true - }, - "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/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/scss-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/scss-parser/-/scss-parser-1.0.3.tgz", - "integrity": "sha512-XQKCfOJERmhn1yoNRUyxv9wgkf4DIv29Jk0m4FiZforeiCmGxrby8K3not7tQ8GK1yvtd9N0OnNimNetJ8V+zQ==", - "dev": true, - "dependencies": { - "invariant": "2.2.2", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "dev": true, - "dependencies": { - "commander": "^2.8.1" - }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" - } - }, - "node_modules/seek-bzip/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true - }, - "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/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "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/shelljs": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", - "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "execa": "^1.0.0", - "fast-glob": "^3.3.2", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/shx": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", - "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.8", - "shelljs": "^0.9.2" - }, - "bin": { - "shx": "lib/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/smol-toml": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", - "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", - "dev": true, - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/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-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "dependencies": { - "is-natural-number": "^4.0.1" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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/stylelint": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.0.0.tgz", - "integrity": "sha512-saMZ2mqdQre4AfouxcbTdpVglDRcROb4MIucKHvgsDb/0IX7ODhcaz+EOIyfxAsm8Zjl/7j4hJj6MgIYYM8Xwg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - }, - { - "type": "github", - "url": "https://github.com/sponsors/stylelint" - } - ], - "dependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-syntax-patches-for-csstree": "^1.0.25", - "@csstools/css-tokenizer": "^4.0.0", - "@csstools/media-query-list-parser": "^5.0.0", - "@csstools/selector-resolve-nested": "^4.0.0", - "@csstools/selector-specificity": "^6.0.0", - "balanced-match": "^3.0.1", - "colord": "^2.9.3", - "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.3", - "css-tree": "^3.1.0", - "debug": "^4.4.3", - "fast-glob": "^3.3.3", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^11.1.1", - "global-modules": "^2.0.0", - "globby": "^16.1.0", - "globjoin": "^0.1.4", - "html-tags": "^5.1.0", - "ignore": "^7.0.5", - "import-meta-resolve": "^4.2.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.37.0", - "mathml-tag-names": "^4.0.0", - "meow": "^14.0.0", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.5.6", - "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.1.1", - "postcss-value-parser": "^4.2.0", - "string-width": "^8.1.0", - "supports-hyperlinks": "^4.4.0", - "svg-tags": "^1.0.0", - "table": "^6.9.0", - "write-file-atomic": "^7.0.0" - }, - "bin": { - "stylelint": "bin/stylelint.mjs" - }, - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/stylelint-config-recommended": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz", - "integrity": "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - }, - { - "type": "github", - "url": "https://github.com/sponsors/stylelint" - } - ], - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "stylelint": "^17.0" - } - }, - "node_modules/stylelint-config-standard": { - "version": "40.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz", - "integrity": "sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - }, - { - "type": "github", - "url": "https://github.com/sponsors/stylelint" - } - ], - "dependencies": { - "stylelint-config-recommended": "^18.0.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "stylelint": "^17.0" - } - }, - "node_modules/stylelint/node_modules/@csstools/selector-resolve-nested": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz", - "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.1.1" - } - }, - "node_modules/stylelint/node_modules/@csstools/selector-specificity": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", - "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.1.1" - } - }, - "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-3.0.1.tgz", - "integrity": "sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==", - "dev": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz", - "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", - "dev": true, - "dependencies": { - "flat-cache": "^6.1.19" - } - }, - "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz", - "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", - "dev": true, - "dependencies": { - "cacheable": "^2.2.0", - "flatted": "^3.3.3", - "hookified": "^1.13.0" - } - }, - "node_modules/stylelint/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/stylelint/node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "dev": true, - "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.4.0.tgz", - "integrity": "sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==", - "dev": true, - "dependencies": { - "has-flag": "^5.0.1", - "supports-color": "^10.2.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", - "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "node_modules/table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true - }, - "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "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/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "engines": { - "node": ">=6.10" - } - }, - "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/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", - "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", - "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", - "dev": true, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", - "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.2.0", - "picocolors": "^1.1.1" - }, - "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, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "dev": true, - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "dev": true, - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "dev": true - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "dev": true - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "dev": true - }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/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/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.0.tgz", - "integrity": "sha512-YnlPC6JqnZl6aO4uRc+dx5PHguiR9S6WeoLtpxNT9wIG+BDya7ZNE1q7KOjVgaA73hKhKLpVPgJ5QA9THQ5BRg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "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" - } - } - }, - "dependencies": { - "@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 - }, - "@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "dev": true, - "requires": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - } - }, - "@antfu/utils": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.2.0.tgz", - "integrity": "sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==", - "dev": true - }, - "@babel/cli": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.6.tgz", - "integrity": "sha512-6EUNcuBbNkj08Oj4gAZ+BUU8yLCgKzgVX4gaTh09Ya2C8ICM4P+G30g4m3akRxSYAp3A/gnWchrNst7px4/nUQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.28", - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.6.0", - "commander": "^6.2.0", - "convert-source-map": "^2.0.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "dependencies": { - "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 - } - } - }, - "@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - } - }, - "@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true - }, - "@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "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 - } - } - }, - "@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "requires": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "requires": { - "@babel/types": "^7.27.3" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "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, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" - } - }, - "@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "requires": { - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - } - }, - "@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - } - }, - "@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "dev": true, - "requires": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "requires": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "requires": { - "@babel/types": "^7.28.6" - } - }, - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", - "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", - "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", - "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.5" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", - "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - } - }, - "@babel/preset-env": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", - "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.28.6", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.28.5", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.6", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "core-js-compat": "^3.43.0", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - } - }, - "@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - } - }, - "@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - } - }, - "@braintree/sanitize-url": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", - "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", - "dev": true - }, - "@cacheable/memory": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.5.tgz", - "integrity": "sha512-fkiAxCvssEyJZ5fxX4tcdZFRmW9JehSTGvvqmXn6rTzG5cH6V/3C4ad8yb01vOjp2xBydHkHrgpW0qeGtzt6VQ==", - "dev": true, - "requires": { - "@cacheable/utils": "^2.3.0", - "@keyv/bigmap": "^1.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.4" - }, - "dependencies": { - "@keyv/bigmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz", - "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", - "dev": true, - "requires": { - "hashery": "^1.2.0", - "hookified": "^1.13.0" - } - }, - "keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", - "dev": true, - "requires": { - "@keyv/serialize": "^1.1.1" - } - } - } - }, - "@cacheable/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-38NJXjIr4W1Sghun8ju+uYWD8h2c61B4dKwfnQHVDFpAJ9oS28RpfqZQJ6Dgd3RceGkILDY9YT+72HJR3LoeSQ==", - "dev": true, - "requires": { - "hashery": "^1.2.0", - "keyv": "^5.5.4" - }, - "dependencies": { - "keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", - "dev": true, - "requires": { - "@keyv/serialize": "^1.1.1" - } - } - } - }, - "@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "dev": true, - "requires": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "dev": true, - "requires": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "dev": true - }, - "@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "dev": true - }, - "@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "dev": true - }, - "@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "requires": {} - }, - "@csstools/css-syntax-patches-for-csstree": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.25.tgz", - "integrity": "sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==", - "dev": true - }, - "@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true - }, - "@csstools/media-query-list-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", - "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", - "dev": true, - "requires": {} - }, - "@eslint-community/eslint-utils": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", - "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.4.3" - } - }, - "@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true - }, - "@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "requires": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - } - }, - "@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "requires": { - "@eslint/core": "^0.17.0" - } - }, - "@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.15" - } - }, - "@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.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" - }, - "dependencies": { - "globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true - }, - "@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true - }, - "@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "requires": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - } - }, - "@fullhuman/postcss-purgecss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-8.0.0.tgz", - "integrity": "sha512-fSRaBGf6+DYdfQMxedWfnIW8FSYE1LBpgy16jpK1L2vNb1HgeBRRZ+UX4UokNmW7YEAwPdvwkKdYtlkYpH+Aqg==", - "dev": true, - "requires": { - "purgecss": "^8.0.0" - } - }, - "@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true - }, - "@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "requires": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "dependencies": { - "@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true - } - } - }, - "@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 - }, - "@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "dev": true - }, - "@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true - }, - "@iconify/utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.1.tgz", - "integrity": "sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==", - "dev": true, - "requires": { - "@antfu/install-pkg": "^1.1.0", - "@antfu/utils": "^9.2.0", - "@iconify/types": "^2.0.0", - "debug": "^4.4.1", - "globals": "^15.15.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.1.1", - "mlly": "^1.7.4" - } - }, - "@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true - }, - "@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "requires": { - "@isaacs/balanced-match": "^4.0.1" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@keyv/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - "dev": true - }, - "@mermaid-js/parser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", - "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", - "dev": true, - "requires": { - "langium": "3.3.1" - } - }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", - "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@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, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "dev": true, - "peer": true - }, - "@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true - }, - "@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "dev": true, - "requires": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "dev": true - }, - "@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "dev": true, - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "dev": true, - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "dev": true - }, - "@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true - }, - "@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "dev": true, - "requires": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "dev": true - }, - "@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "dev": true - }, - "@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "dev": true, - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true - }, - "@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "dev": true - }, - "@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "dev": true, - "requires": { - "@types/d3-dsv": "*" - } - }, - "@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "dev": true - }, - "@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "dev": true - }, - "@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dev": true, - "requires": { - "@types/geojson": "*" - } - }, - "@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "dev": true - }, - "@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dev": true, - "requires": { - "@types/d3-color": "*" - } - }, - "@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", - "dev": true - }, - "@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "dev": true - }, - "@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "dev": true - }, - "@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "dev": true - }, - "@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dev": true, - "requires": { - "@types/d3-time": "*" - } - }, - "@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", - "dev": true - }, - "@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "dev": true - }, - "@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "dev": true, - "requires": { - "@types/d3-path": "*" - } - }, - "@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", - "dev": true - }, - "@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true - }, - "@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "dev": true - }, - "@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "dev": true, - "requires": { - "@types/d3-selection": "*" - } - }, - "@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dev": true, - "requires": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "dev": true - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@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 - }, - "@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true - }, - "@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", - "dev": true - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, - "optional": true - }, - "@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true - }, - "acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true - }, - "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, - "requires": {} - }, - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "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 - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "auto-changelog": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.5.0.tgz", - "integrity": "sha512-UTnLjT7I9U2U/xkCUH5buDlp8C7g0SGChfib+iDrJkamcj5kaMqNKHNfbKJw1kthJUq8sUo3i3q2S6FzO/l/wA==", - "dev": true, - "requires": { - "commander": "^7.2.0", - "handlebars": "^4.7.7", - "import-cwd": "^3.0.0", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.3", - "semver": "^7.3.5" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", - "dev": true, - "requires": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.5" - } - }, - "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 - }, - "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 - }, - "baseline-browser-mapping": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.7.tgz", - "integrity": "sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bootstrap": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", - "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", - "dev": true, - "requires": {} - }, - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "requires": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "cacheable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.2.0.tgz", - "integrity": "sha512-LEJxRqfeomiiRd2t0uON6hxAtgOoWDfY3fugebbz+J3vDLO+SkdfFChQcOHTZhj9SYa9iwE9MGYNX72dKiOE4w==", - "dev": true, - "requires": { - "@cacheable/memory": "^2.0.5", - "@cacheable/utils": "^2.3.0", - "hookified": "^1.13.0", - "keyv": "^5.5.4", - "qified": "^0.5.2" - }, - "dependencies": { - "keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", - "dev": true, - "requires": { - "@keyv/serialize": "^1.1.1" - } - } - } - }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", - "dev": true - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true - }, - "character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true - }, - "character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true - }, - "chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "dev": true, - "requires": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "dev": true, - "requires": { - "lodash-es": "^4.17.21" - } - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - } - } - }, - "clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "dev": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true - }, - "core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", - "dev": true, - "requires": { - "browserslist": "^4.25.0" - } - }, - "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 - }, - "cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dev": true, - "requires": { - "layout-base": "^1.0.0" - } - }, - "cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "requires": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - } - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", - "dev": true - }, - "css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "dev": true, - "requires": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cytoscape": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", - "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", - "dev": true - }, - "cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "dev": true, - "requires": { - "cose-base": "^1.0.0" - } - }, - "cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "dev": true, - "requires": { - "cose-base": "^2.2.0" - }, - "dependencies": { - "cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "dev": true, - "requires": { - "layout-base": "^2.0.0" - } - }, - "layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "dev": true - } - } - }, - "d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "dev": true, - "requires": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - } - }, - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dev": true, - "requires": { - "internmap": "1 - 2" - } - }, - "d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true - }, - "d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - } - }, - "d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, - "requires": { - "d3-path": "1 - 3" - } - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true - }, - "d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dev": true, - "requires": { - "d3-array": "^3.2.0" - } - }, - "d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dev": true, - "requires": { - "delaunator": "5" - } - }, - "d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true - }, - "d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, - "requires": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - } - }, - "d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, - "requires": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true - }, - "d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, - "requires": { - "d3-dsv": "1 - 3" - } - }, - "d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, - "requires": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "dev": true - }, - "d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "dev": true, - "requires": { - "d3-array": "2.5.0 - 3" - } - }, - "d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "dev": true - }, - "d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true - }, - "d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true - }, - "d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true - }, - "d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "dev": true, - "requires": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - }, - "dependencies": { - "d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "dev": true, - "requires": { - "internmap": "^1.0.0" - } - }, - "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "dev": true - }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dev": true, - "requires": { - "d3-path": "1" - } - }, - "internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "dev": true - } - } - }, - "d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, - "requires": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - } - }, - "d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "dev": true, - "requires": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - } - }, - "d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true - }, - "d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dev": true, - "requires": { - "d3-path": "^3.1.0" - } - }, - "d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dev": true, - "requires": { - "d3-array": "2 - 3" - } - }, - "d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, - "requires": { - "d3-time": "1 - 3" - } - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true - }, - "d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, - "requires": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, - "requires": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - } - }, - "dagre-d3-es": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", - "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", - "dev": true, - "requires": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true - }, - "dayjs": { - "version": "1.11.18", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", - "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", - "dev": true - }, - "debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "dev": true, - "requires": { - "character-entities": "^2.0.0" - } - }, - "decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dev": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - } - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "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 - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "del": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", - "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", - "dev": true, - "requires": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", - "is-glob": "^4.0.3", - "is-path-cwd": "^3.0.0", - "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" - }, - "dependencies": { - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dev": true, - "requires": { - "robust-predicates": "^3.0.2" - } - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true - }, - "dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "dev": true - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "requires": { - "dequal": "^2.0.0" - } - }, - "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, - "requires": { - "path-type": "^4.0.0" - } - }, - "dompurify": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", - "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", - "dev": true, - "requires": { - "@types/trusted-types": "^2.0.7" - } - }, - "electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "dev": true - }, - "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 - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true - }, - "eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - }, - "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "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, - "requires": { - "p-locate": "^5.0.0" - } - }, - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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, - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "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 - }, - "espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "requires": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - } - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "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, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-bin": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/exec-bin/-/exec-bin-1.0.0.tgz", - "integrity": "sha512-p8f8h8b6op2nR7U5rsd+zACUMfsfB+jW8HNIBD2njOQ/gF2WvBfQRo/OU6Q6f/b34WLAyePZcwMJyrDdEjB/fw==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - } - }, - "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 - }, - "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 - }, - "fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-blob": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", - "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", - "dev": true, - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } - }, - "file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "requires": { - "flat-cache": "^4.0.0" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - } - }, - "flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true - }, - "flexsearch": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.31.tgz", - "integrity": "sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==", - "dev": true - }, - "form-data-encoder": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.2.tgz", - "integrity": "sha512-FCaIOVTRA9E0siY6FeXid7D5yrCqpsErplUkE2a1BEiKj1BE9z6FbKB4ntDTwC4NVLie9p+4E9nX4mWwEOT05A==", - "dev": true - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "requires": { - "fetch-blob": "^3.1.2" - } - }, - "fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "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 - }, - "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 - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "dev": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "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" - } - }, - "glob-all": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz", - "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==", - "dev": true, - "requires": { - "glob": "^7.1.2", - "yargs": "^15.3.1" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "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, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true - }, - "globby": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.0.tgz", - "integrity": "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" - }, - "dependencies": { - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - }, - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "requires": { - "delegate": "^3.1.2" - } - }, - "got": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.4.1.tgz", - "integrity": "sha512-Sz1ojLt4zGNkcftIyJKnulZT/yEDvifhUjccHA8QzOuTgPs/+njXYNMFE3jR4/2OODQSSbH8SdnoLCkbh41ieA==", - "dev": true, - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.0", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "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 - } - } - }, - "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 - }, - "hashery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.2.0.tgz", - "integrity": "sha512-43XJKpwle72Ik5Zpam7MuzRWyNdwwdf6XHlh8wCj2PggvWf+v/Dm5B0dxGZOmddidgeO6Ofu9As/o231Ti/9PA==", - "dev": true, - "requires": { - "hookified": "^1.13.0" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "dev": true - }, - "hookified": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", - "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", - "dev": true - }, - "hpagent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.0.0.tgz", - "integrity": "sha512-SCleE2Uc1bM752ymxg8QXYGW0TWtAV4ZW3TqH1aOnyi6T6YW2xadCcclm5qeVjvMvfQ2RKNtZxO7uVb9CTPt1A==", - "dev": true - }, - "html-tags": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", - "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http2-wrapper": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", - "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "hugo-installer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/hugo-installer/-/hugo-installer-4.0.1.tgz", - "integrity": "sha512-pkp1RO7+ekQ0vw1aqgBMK+dD2dqioIWVbwWKsJsKLOpzfFc78gK68Cweoi/g+CftoiMFO7cyGx/2MgkHCMqaLQ==", - "dev": true, - "requires": { - "decompress": "4.2.x", - "del": "7.0.x", - "got": "12.4.x", - "hpagent": "1.0.x", - "object-path": "0.11.x", - "semver": "7.3.x", - "yargs": "17.5.x" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "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, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true - }, - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, - "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, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true - }, - "instant.page": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/instant.page/-/instant.page-5.2.0.tgz", - "integrity": "sha512-DUSwWyoHFOQnmEwJtg9vzDx8Ef8uNNvTxTmHjd0vN9/XEIb5EQkm/itpZMypoH3dJLJvtkrD97WOCKuMqDdMHQ==", - "dev": true - }, - "internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true - }, - "is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "requires": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "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, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "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 - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true - }, - "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 - }, - "is-path-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "dev": true - }, - "is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true - }, - "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 - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "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 - }, - "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true - }, - "katex": { - "version": "0.16.28", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz", - "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", - "dev": true, - "requires": { - "commander": "^8.3.0" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - } - } - }, - "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, - "requires": { - "json-buffer": "3.0.1" - } - }, - "khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true - }, - "kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true - }, - "langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", - "dev": true, - "requires": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - } - }, - "layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "dev": true - }, - "lazysizes": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.2.tgz", - "integrity": "sha512-22UzWP+Vedi/sMeOr8O7FWimRVtiNJV2HCa+V8+peZOw6QbswN9k58VUhd7i6iK5bw5QkYrF01LJbeJe0PV8jg==", - "dev": true - }, - "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, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "requires": { - "uc.micro": "^2.0.0" - } - }, - "local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", - "dev": true, - "requires": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "lodash.forown": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz", - "integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", - "dev": true - }, - "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 - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "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, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - } - }, - "markdownlint": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", - "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", - "dev": true, - "requires": { - "micromark": "4.0.2", - "micromark-core-commonmark": "2.0.3", - "micromark-extension-directive": "4.0.0", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.1", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2", - "string-width": "8.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true - }, - "string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "dev": true, - "requires": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "markdownlint-cli": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.47.0.tgz", - "integrity": "sha512-HOcxeKFAdDoldvoYDofd85vI8LgNWy8vmYpCwnlLV46PJcodmGzD7COSSBlhHwsfT4o9KrAStGodImVBus31Bg==", - "dev": true, - "requires": { - "commander": "~14.0.2", - "deep-extend": "~0.6.0", - "ignore": "~7.0.5", - "js-yaml": "~4.1.1", - "jsonc-parser": "~3.3.1", - "jsonpointer": "~5.0.1", - "markdown-it": "~14.1.0", - "markdownlint": "~0.40.0", - "minimatch": "~10.1.1", - "run-con": "~1.3.2", - "smol-toml": "~1.5.2", - "tinyglobby": "~0.2.15" - }, - "dependencies": { - "commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "dev": true - }, - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - }, - "minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "requires": { - "@isaacs/brace-expansion": "^5.0.0" - } - } - } - }, - "marked": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", - "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", - "dev": true - }, - "mathml-tag-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", - "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", - "dev": true - }, - "mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "dev": true - }, - "mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "meow": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-14.0.0.tgz", - "integrity": "sha512-JhC3R1f6dbspVtmF3vKjAWz1EVIvwFrGGPLSdU6rK79xBwHWTuHoLnRX/t1/zHS1Ch1Y2UtIrih7DAHuH9JFJA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "mermaid": { - "version": "11.12.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", - "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", - "dev": true, - "requires": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.1", - "@mermaid-js/parser": "^0.6.3", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.13", - "dayjs": "^1.11.18", - "dompurify": "^3.2.5", - "katex": "^0.16.22", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.2.1", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "dev": true, - "requires": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - } - }, - "micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "requires": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "dev": true, - "requires": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "requires": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "requires": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "requires": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "requires": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "requires": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true - }, - "micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true - }, - "micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "requires": { - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "requires": { - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "requires": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "requires": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true - }, - "micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "dev": true, - "requires": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - }, - "dependencies": { - "confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true - }, - "pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "requires": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true - }, - "node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - }, - "node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true - }, - "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 - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@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" - } - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "requires": { - "aggregate-error": "^4.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-manager-detector": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", - "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", - "dev": true - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - } - }, - "parse-github-url": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", - "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "dev": true - }, - "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 - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "dev": true, - "requires": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "dev": true - }, - "points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "dev": true, - "requires": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "requires": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - }, - "postcss-cli": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", - "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", - "dev": true, - "requires": { - "chokidar": "^3.3.0", - "dependency-graph": "^1.0.0", - "fs-extra": "^11.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^5.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^5.0.0", - "tinyglobby": "^0.2.12", - "yargs": "^17.0.0" - }, - "dependencies": { - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true - } - } - }, - "postcss-load-config": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.0.2.tgz", - "integrity": "sha512-Q8QR3FYbqOKa0bnC1UQ2bFq9/ulHX5Bi34muzitMr8aDtUelO5xKeJEYC/5smE0jNE9zdB/NBnOwXKexELbRlw==", - "dev": true, - "requires": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - } - }, - "postcss-reporter": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.4.tgz", - "integrity": "sha512-jY/fnpGSin7kwJeunXbY35STp5O3VIxSFdjee5JkoPQ+FfGH5JW3N+Xe9oAPcL9UkjWjkK+JC72o8XH4XXKdhw==", - "dev": true, - "requires": { - "lodash.difference": "^4.5.0", - "lodash.forown": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.groupby": "^4.6.0", - "lodash.sortby": "^4.7.0", - "picocolors": "^1.0.0" - } - }, - "postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", - "dev": true, - "requires": {} - }, - "postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "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 - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "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 - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true - }, - "purgecss": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-8.0.0.tgz", - "integrity": "sha512-QFJyps9y5oHeXnNA3Ql1EaAqWBivNwQn19Pw1lt9RxfB+4e+bIyqCyuombk79D6Fxe+lPXggVfI1WtRGEBwgbQ==", - "dev": true, - "requires": { - "commander": "^12.1.0", - "fast-glob": "^3.3.2", - "postcss": "^8.4.47", - "postcss-selector-parser": "^7.0.0" - }, - "dependencies": { - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true - } - } - }, - "purgecss-whitelister": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/purgecss-whitelister/-/purgecss-whitelister-2.4.0.tgz", - "integrity": "sha512-O0jBUDtY9dU9tUT0vA1FvwFdkKDerxzteYaBV49JCbm+QJLFKMlIsf5Kp5cdbLatHQNjJtV8VB8eXtISoZL2Dg==", - "dev": true, - "requires": { - "glob-all": "^3.1.0", - "gonzales-pe": "^4.2.4", - "scss-parser": "1.0.3" - } - }, - "qified": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.2.tgz", - "integrity": "sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==", - "dev": true, - "requires": { - "hookified": "^1.13.0" - } - }, - "quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - } - }, - "regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "dev": true, - "requires": { - "jsesc": "~3.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "requires": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "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 - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "requires": { - "lowercase-keys": "^3.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "dev": true - }, - "roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "dev": true, - "requires": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "run-con": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", - "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~4.1.0", - "minimist": "^1.2.8", - "strip-json-comments": "~3.1.1" - } - }, - "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, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true - }, - "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 - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scss-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/scss-parser/-/scss-parser-1.0.3.tgz", - "integrity": "sha512-XQKCfOJERmhn1yoNRUyxv9wgkf4DIv29Jk0m4FiZforeiCmGxrby8K3not7tQ8GK1yvtd9N0OnNimNetJ8V+zQ==", - "dev": true, - "requires": { - "invariant": "2.2.2", - "lodash": "^4.17.4" - } - }, - "seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "dev": true, - "requires": { - "commander": "^2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "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, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "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 - }, - "shelljs": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", - "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "fast-glob": "^3.3.2", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shx": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", - "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", - "dev": true, - "requires": { - "minimist": "^1.2.8", - "shelljs": "^0.9.2" - } - }, - "signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "smol-toml": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", - "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", - "dev": true - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "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, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true - }, - "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 - }, - "stylelint": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.0.0.tgz", - "integrity": "sha512-saMZ2mqdQre4AfouxcbTdpVglDRcROb4MIucKHvgsDb/0IX7ODhcaz+EOIyfxAsm8Zjl/7j4hJj6MgIYYM8Xwg==", - "dev": true, - "requires": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-syntax-patches-for-csstree": "^1.0.25", - "@csstools/css-tokenizer": "^4.0.0", - "@csstools/media-query-list-parser": "^5.0.0", - "@csstools/selector-resolve-nested": "^4.0.0", - "@csstools/selector-specificity": "^6.0.0", - "balanced-match": "^3.0.1", - "colord": "^2.9.3", - "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.3", - "css-tree": "^3.1.0", - "debug": "^4.4.3", - "fast-glob": "^3.3.3", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^11.1.1", - "global-modules": "^2.0.0", - "globby": "^16.1.0", - "globjoin": "^0.1.4", - "html-tags": "^5.1.0", - "ignore": "^7.0.5", - "import-meta-resolve": "^4.2.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.37.0", - "mathml-tag-names": "^4.0.0", - "meow": "^14.0.0", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.5.6", - "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.1.1", - "postcss-value-parser": "^4.2.0", - "string-width": "^8.1.0", - "supports-hyperlinks": "^4.4.0", - "svg-tags": "^1.0.0", - "table": "^6.9.0", - "write-file-atomic": "^7.0.0" - }, - "dependencies": { - "@csstools/selector-resolve-nested": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz", - "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", - "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", - "dev": true, - "requires": {} - }, - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true - }, - "balanced-match": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-3.0.1.tgz", - "integrity": "sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==", - "dev": true - }, - "file-entry-cache": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz", - "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", - "dev": true, - "requires": { - "flat-cache": "^6.1.19" - } - }, - "flat-cache": { - "version": "6.1.19", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz", - "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", - "dev": true, - "requires": { - "cacheable": "^2.2.0", - "flatted": "^3.3.3", - "hookified": "^1.13.0" - } - }, - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - }, - "string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "dev": true, - "requires": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "stylelint-config-recommended": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz", - "integrity": "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==", - "dev": true, - "requires": {} - }, - "stylelint-config-standard": { - "version": "40.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz", - "integrity": "sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^18.0.0" - } - }, - "stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.4.0.tgz", - "integrity": "sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==", - "dev": true, - "requires": { - "has-flag": "^5.0.1", - "supports-color": "^10.2.2" - }, - "dependencies": { - "has-flag": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", - "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", - "dev": true - }, - "supports-color": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", - "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "dev": true - } - } - }, - "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 - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true - }, - "tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true - }, - "tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "requires": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "dependencies": { - "fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "requires": {} - }, - "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true - } - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "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, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true - }, - "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, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true - }, - "uglify-js": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", - "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", - "dev": true, - "optional": true - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "dev": true - }, - "unicorn-magic": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", - "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", - "dev": true, - "requires": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "dev": true - }, - "vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "dev": true - }, - "vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "dev": true, - "requires": { - "vscode-languageserver-protocol": "3.17.5" - } - }, - "vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "dev": true, - "requires": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "dev": true - }, - "vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "dev": true - }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "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, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.0.tgz", - "integrity": "sha512-YnlPC6JqnZl6aO4uRc+dx5PHguiR9S6WeoLtpxNT9wIG+BDya7ZNE1q7KOjVgaA73hKhKLpVPgJ5QA9THQ5BRg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "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 - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 004df6bd..00000000 --- a/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "@hyas/doks", - "description": "Doks theme", - "version": "0.3.5", - "browserslist": [ - "defaults" - ], - "repository": "https://github.com/h-enk/doks", - "license": "MIT", - "publishConfig": { - "access": "public" - }, - "scripts": { - "init": "shx rm -rf .git && git init -b main", - "create": "exec-bin node_modules/.bin/hugo/hugo new", - "prestart": "npm run clean", - "start": "exec-bin node_modules/.bin/hugo/hugo server --bind=0.0.0.0 --disableFastRender", - "prebuild": "npm run clean", - "build": "exec-bin node_modules/.bin/hugo/hugo --gc --minify", - "build:preview": "npm run build -D -F", - "clean": "shx rm -rf public resources", - "clean:install": "shx rm -rf package-lock.json node_modules ", - "lint": "npm run -s lint:scripts && npm run -s lint:styles && npm run -s lint:markdown", - "lint:scripts": "eslint assets/js config functions", - "lint:styles": "stylelint \"assets/scss/**/*.{css,sass,scss,sss,less}\"", - "lint:markdown": "markdownlint \"*.md\" \"content/**/*.md\"", - "server": "exec-bin node_modules/.bin/hugo/hugo server", - "test": "npm run -s lint", - "env": "env", - "precheck": "npm version", - "check": "exec-bin node_modules/.bin/hugo/hugo version", - "copy:katex-fonts": "shx cp ./node_modules/katex/dist/fonts/* ./static/fonts/", - "postinstall": "hugo-installer --version otherDependencies.hugo --extended --destination node_modules/.bin/hugo", - "version": "auto-changelog -p && git add CHANGELOG.md" - }, - "devDependencies": { - "@babel/cli": "^7.15", - "@babel/core": "^7.15", - "@babel/preset-env": "^7.15", - "@fullhuman/postcss-purgecss": "^8.0", - "auto-changelog": "^2.3.0", - "autoprefixer": "^10.3", - "bootstrap": "^5.1", - "clipboard": "^2.0", - "eslint": "^9.0", - "exec-bin": "^1.0.0", - "hugo-installer": "^4.0", - "flexsearch": "^0.7.21", - "highlight.js": "^11.2", - "instant.page": "^5.1", - "katex": "^0.16", - "lazysizes": "^5.3", - "markdownlint-cli": "^0.47", - "node-fetch": "^3.0", - "mermaid": "^11.0", - "postcss": "^8.3", - "postcss-cli": "^11.0", - "purgecss-whitelister": "^2.4", - "shx": "^0.4.0", - "stylelint": "^17.0", - "stylelint-config-standard": "^40.0" - }, - "otherDependencies": { - "hugo": "0.88.1" - } -} diff --git a/release-to-blog.sh b/release-to-blog.sh deleted file mode 100755 index 5efb8c96..00000000 --- a/release-to-blog.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -TMPFILE=/tmp/release.$1.data - -curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/cloud-hypervisor/cloud-hypervisor/releases/tags/$1 > /tmp/release.$1.data - -NAME=`jq -r <$TMPFILE .name` -BODY=`jq -r <$TMPFILE .body` -DATE=`jq -r <$TMPFILE .published_at` -URL=`jq -r <$TMPFILE .html_url` -mkdir content/en/blog/$NAME -echo -e "---\ntitle: \"Cloud Hypervisor $NAME Released!\"\ndate: $DATE\ndraft: false\ncontributors: ["Cloud Hypervisor Team"]\n---\n$BODY\n### Download\n See the GitHub Release for the release assets." > content/en/blog/$NAME/index.md diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000..77f3994b --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://www.cloudhypervisor.org/sitemap.xml \ No newline at end of file diff --git a/static/site.webmanifest b/site.webmanifest similarity index 100% rename from static/site.webmanifest rename to site.webmanifest diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..f892dfe4 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://www.cloudhypervisor.org/docs/prologue/introduction/2020-10-06T08:48:57+00:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/quick-start/2020-11-16T13:59:39+01:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/commands/2020-10-13T15:21:01+02:00weekly0.5https://www.cloudhypervisor.org/contributors/cloud-hypervisor-team/2026-02-20T01:34:50+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v51.0-released/2026-02-20T01:34:50+00:00weekly0.5https://www.cloudhypervisor.org/contributors/2026-02-20T01:34:50+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.1-released/2026-02-20T01:21:45+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v50.0-released/2025-12-19T03:04:36+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v49.0-released/2025-11-09T05:36:56+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v48.0-released/2025-09-12T23:05:40+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v47.0-released/2025-07-22T22:48:05+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v46.0-released/2025-05-23T22:07:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v45.0-released/2025-03-30T17:28:57+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v44.0-released/2025-02-03T19:34:45+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v43.0-released/2024-12-18T21:31:26+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v42.0-released/2024-10-25T09:20:04+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v41.0-released/2024-08-16T12:17:19+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v40.0-released/2024-06-21T11:12:02+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v39.0-released/2024-04-27T13:40:07+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v38.0-released/2024-02-16T18:20:29+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v37.0-released/2023-12-14T18:58:49+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v36.0-released/2023-11-02T16:06:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v35.0-released/2023-09-21T14:47:24+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v34.0-released/2023-08-10T16:44:32+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v33.0-released/2023-06-29T17:32:25+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v32.0-released/2023-05-18T18:13:12+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v31.0-released/2023-04-06T14:47:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v30.0-released/2023-02-24T01:10:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v29.0-released/2023-01-14T12:46:39+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v28.1-released/2022-12-14T11:20:23+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v28.0-released/2022-11-17T16:59:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v27.0-released/2022-09-29T18:02:19+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v26.0-released/2022-08-17T16:48:15+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v25.0-released/2022-07-07T14:59:55+00:00weekly0.5https://www.cloudhypervisor.org/blog/memory-management-techniques/2022-07-07T08:00:00+00:00weekly0.5https://www.cloudhypervisor.org/contributors/sebastien-boeuf/2022-07-07T08:00:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v24.0-released/2022-05-27T08:00:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/achieving-bare-metal-performance-within-a-virtual-machine/2022-05-19T08:00:00+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v23.1-released/2022-05-09T14:24:16+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v23.0-released/2022-04-14T08:42:28+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v22.1-released/2022-03-11T09:09:21+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v21.1-released/2022-03-11T09:08:36+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v22.0-released/2022-03-03T18:10:22+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v21.0-released/2022-01-20T15:31:31+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v20.2-released/2022-01-04T17:57:10+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v20.1-released/2021-12-13T15:06:54+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v20.0-released/2021-12-02T16:15:22+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v19.0-released/2021-10-14T15:36:27+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v18.0-released/2021-09-09T14:31:29+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v17.0-released/2021-07-22T16:31:16+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v16.0-released/2021-06-10T16:13:47+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v15.0-released/2021-04-29T15:27:07+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.14.1-released/2021-03-31T16:11:23+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.14.0-released/2021-03-26T12:01:05+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.13.0-released/2021-02-12T11:02:35+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.12.0-released/2020-12-10T18:56:49+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.11.0-released/2020-10-29T17:55:41+00:00weekly0.5https://www.cloudhypervisor.org/blog/2020-10-06T08:49:55+00:00weekly0.5https://www.cloudhypervisor.org/docs/prologue/2020-10-06T08:48:45+00:00weekly0.5https://www.cloudhypervisor.org/docs/2020-10-06T08:48:23+00:00weekly0.5https://www.cloudhypervisor.org/2020-10-06T08:47:36+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.10.0-released/2020-09-18T13:42:24+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.9.0-released/2020-08-06T14:30:07+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.8.0-released/2020-06-11T17:48:52+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.7.0-released/2020-04-30T15:52:08+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.6.0-released/2020-03-20T11:45:57+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.5.0-released/2020-02-07T15:42:54+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.4.0-released/2019-12-13T11:39:09+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.3.0-released/2019-10-18T11:21:46+00:00weekly0.5https://www.cloudhypervisor.org/blog/cloud-hypervisor-v0.2.0-released/2019-09-10T14:00:12+00:00weekly0.5 \ No newline at end of file diff --git a/static/fonts/vendor/.gitkeep b/static/fonts/vendor/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/static/images/vendor/.gitkeep b/static/images/vendor/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/static/js/vendor/.gitkeep b/static/js/vendor/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/theme.toml b/theme.toml deleted file mode 100644 index 7ffb6820..00000000 --- a/theme.toml +++ /dev/null @@ -1,14 +0,0 @@ -name = "Doks" -license = "MIT" -licenselink = "https://github.com/h-enk/doks/blob/master/LICENSE" -description = "Hugo theme helping you build modern documentation websites that are secure, fast, and SEO-ready — by default." - -homepage = "https://github.com/h-enk/doks" -demosite = "https://doks.netlify.app" - -tags = ["landing page", "documentation", "blog", "minimal", "modern", "customizable", "search", "dark mode", "bootstrap"] -features = ["security aware", "fast by default", "seo-ready", "development tools", "bootstrap framework", "netlify-ready", "full text search", "page layouts", "dark mode"] - -[author] - name = "Henk Verlinde" - homepage = "https://henkverlinde.com" diff --git a/static/videos/flower.mp4 b/videos/flower.mp4 similarity index 100% rename from static/videos/flower.mp4 rename to videos/flower.mp4 diff --git a/static/videos/flower.webm b/videos/flower.webm similarity index 100% rename from static/videos/flower.webm rename to videos/flower.webm