From 854c97a92ec774f6f7d24e2c0fd426c5fae18d54 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Tue, 29 Oct 2024 06:59:16 +0300 Subject: [PATCH 01/43] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20streaming=20sup?= =?UTF-8?q?port?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/docs/README.md | 47 - apps/docs/package.json | 2 +- apps/www/package.json | 1 + apps/www/src/routes/play/[id]/index.tsx | 32 + bun.lockb | Bin 768688 -> 769064 bytes package-lock.json | 31209 ---------------------- packages/eslint-config/qwik.js | 1 + 7 files changed, 35 insertions(+), 31257 deletions(-) delete mode 100644 apps/docs/README.md create mode 100644 apps/www/src/routes/play/[id]/index.tsx delete mode 100644 package-lock.json diff --git a/apps/docs/README.md b/apps/docs/README.md deleted file mode 100644 index 95051065..00000000 --- a/apps/docs/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Docus - -## Setup - -Install dependencies: - -```bash -npm install -``` - -## Development - -```bash -npm run dev -``` - -## Edge Side Rendering - -Can be deployed to Vercel Functions, Netlify Functions, AWS, and most Node-compatible environments. - -Look at all the available presets [here](https://v3.nuxtjs.org/guide/deploy/presets). - -```bash -npm build -``` - -## Static Generation - -Use the `generate` command to build your application. - -The HTML files will be generated in the .output/public directory and ready to be deployed to any static compatible hosting. - -```bash -npm run generate -``` - -## Preview build - -You might want to preview the result of your build locally, to do so, run the following command: - -```bash -yarn preview -``` - ---- - -For a detailed explanation of how things work, check out [Docus](https://docus.dev). diff --git a/apps/docs/package.json b/apps/docs/package.json index 543a50d7..d01b00d9 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "nuxi dev", + "nestri.dev": "nuxi dev", "build": "nuxi build", "generate": "nuxi generate", "preview": "nuxi preview", diff --git a/apps/www/package.json b/apps/www/package.json index 7e56b847..246b92ba 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -32,6 +32,7 @@ "@builder.io/qwik": "^1.8.0", "@builder.io/qwik-city": "^1.8.0", "@builder.io/qwik-react": "0.5.0", + "@kixelated/moq": "^0.2.0", "@modular-forms/qwik": "^0.27.0", "@nestri/eslint-config": "*", "@nestri/moq": "*", diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx new file mode 100644 index 00000000..c50d705e --- /dev/null +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -0,0 +1,32 @@ +import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; +import { useLocation } from "@builder.io/qwik-city"; + +// Upstream MoQ lib does not work well with our Qwik Vite implementation +import { Player } from "@nestri/moq/playback" + +export default component$(() => { + const id = useLocation().params.id; + const element = useSignal(); + const url = 'https://relay.fst.so' + + useVisibleTask$( + async () => { + if(element.value){ + await Player.create({ url, fingerprint: undefined, canvas: element.value, namespace: id }); + } + } + ) + + return ( + { + // if (element.value) { + // await element.value.requestFullscreen() + // // Do not use - unadjustedMovement: true - breaks input on linux + // element.value.requestPointerLock(); + // } + // }} + class="aspect-video w-full rounded-md" /> + ) +}) \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 0a3752ae00285550372631f67a4c5a72e0e390e8..7c718e6b7674648568274ae4f7b1c9a667f4376d 100755 GIT binary patch delta 29148 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 Uo}&CpqxmH+P{kD95wY@r0P5st^8f$< delta 28731 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%0A9;fHu^5`m<9xli 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
5}2vgt>eL@vuqn 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" - } - }, - "apps/docs": { - "name": "docus-starter", - "version": "0.1.0", - "devDependencies": { - "@nuxt-themes/docus": "latest", - "@nuxt/devtools": "^1.4.1", - "@nuxt/eslint-config": "^0.5.6", - "@nuxtjs/plausible": "^1.0.2", - "@types/node": "^20.16.5", - "eslint": "^9.10.0", - "nuxt": "^3.13.1" - } - }, - "apps/www": { - "name": "@nestri/web", - "devDependencies": { - "@builder.io/qwik": "^1.8.0", - "@builder.io/qwik-city": "^1.8.0", - "@builder.io/qwik-react": "0.5.0", - "@modular-forms/qwik": "^0.27.0", - "@nestri/eslint-config": "*", - "@nestri/moq": "*", - "@nestri/typescript-config": "*", - "@nestri/ui": "*", - "@types/eslint": "8.56.10", - "@types/node": "^22.5.1", - "@types/react": "^18.2.28", - "@types/react-dom": "^18.2.13", - "@typescript-eslint/eslint-plugin": "7.16.1", - "@typescript-eslint/parser": "7.16.1", - "eslint": "8.57.0", - "eslint-plugin-qwik": "^1.8.0", - "prettier": "3.3.3", - "react": "18.2.0", - "react-dom": "18.2.0", - "typescript": "5.4.5", - "undici": "*", - "valibot": "^0.42.1", - "vite": "5.3.5", - "vite-tsconfig-paths": "^4.2.1", - "wrangler": "^3.0.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - } - }, - "apps/www/node_modules/@cloudflare/workers-types": { - "version": "4.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240925.0.tgz", - "integrity": "sha512-KpqyRWvanEuXgBTKYFzRp4NsWOEcswxjsPRSre1zYQcODmc8PUrraVHQUmgvkJgv3FzB+vI9xm7J6oE4MmZHCA==", - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "peer": true - }, - "apps/www/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "apps/www/node_modules/@types/node": { - "version": "22.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "apps/www/node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", - "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/type-utils": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "apps/www/node_modules/@typescript-eslint/parser": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", - "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "apps/www/node_modules/@typescript-eslint/type-utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", - "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "apps/www/node_modules/@typescript-eslint/utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", - "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "apps/www/node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "apps/www/node_modules/eslint-plugin-qwik": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-qwik/-/eslint-plugin-qwik-1.9.0.tgz", - "integrity": "sha512-9EsvIVwtpANSj/ICKMoR5aeabDPgPVcW58bxY8N7R/9oQs6piCm7XbFErxAeaGxmhuvpMZsc+7AN5DizDfDdrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsx-ast-utils": "^3.3.5" - }, - "engines": { - "node": ">=16.8.0 <18.0.0 || >=18.11" - }, - "peerDependencies": { - "eslint": "^8.57.0" - } - }, - "apps/www/node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "apps/www/node_modules/valibot": { - "version": "0.42.1", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.42.1.tgz", - "integrity": "sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">=5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "apps/www/node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "apps/www/node_modules/wrangler": { - "version": "3.78.12", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.78.12.tgz", - "integrity": "sha512-a/xk/N04IvOGk9J+BLkiFg42GDyPS+0BiJimbrHsbX+CDr8Iqq3HNMEyQld+6zbmq01u/gmc8S7GKVR9vDx4+g==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.3.4", - "@cloudflare/workers-shared": "0.5.4", - "@esbuild-plugins/node-globals-polyfill": "^0.2.3", - "@esbuild-plugins/node-modules-polyfill": "^0.2.2", - "blake3-wasm": "^2.1.5", - "chokidar": "^3.5.3", - "esbuild": "0.17.19", - "miniflare": "3.20240925.0", - "nanoid": "^3.3.3", - "path-to-regexp": "^6.3.0", - "resolve": "^1.22.8", - "resolve.exports": "^2.0.2", - "selfsigned": "^2.0.1", - "source-map": "^0.6.1", - "unenv": "npm:unenv-nightly@2.0.0-20240919-125358-9a64854", - "workerd": "1.20240925.0", - "xxhash-wasm": "^1.0.1" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=16.17.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20240925.0" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "apps/www/node_modules/wrangler/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", - "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@aws-crypto/util/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/@aws-sdk/client-lambda": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.478.0.tgz", - "integrity": "sha512-7+PEE1aV3qVeuswL6cUBfHeljxC/WaXFj+214/W3q71uRdLbX5Z7ZOD15sJbjSu+4VZN9ugMaxEcp+oLiqWl+A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.478.0", - "@aws-sdk/core": "3.477.0", - "@aws-sdk/credential-provider-node": "3.478.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-signing": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.478.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/core": "^1.2.0", - "@smithy/eventstream-serde-browser": "^2.0.15", - "@smithy/eventstream-serde-config-resolver": "^2.0.15", - "@smithy/eventstream-serde-node": "^2.0.15", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-stream": "^2.0.23", - "@smithy/util-utf8": "^2.0.2", - "@smithy/util-waiter": "^2.0.15", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.478.0.tgz", - "integrity": "sha512-Jxy9cE1JMkPR0PklCpq3cORHnZq/Z4klhSTNGgZNeBWovMa+plor52kyh8iUNHKl3XEJvTbHM7V+dvrr/x0P1g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.477.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.478.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/core": "^1.2.0", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.478.0.tgz", - "integrity": "sha512-D+QID0dYzmn9dcxgKP3/nMndUqiQbDLsqI0Zf2pG4MW5gPhVNKlDGIV3Ztz8SkMjzGJExNOLW2L569o8jshJVw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.477.0", - "@aws-sdk/credential-provider-node": "3.478.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.478.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/core": "^1.2.0", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/protocol-http": "^3.0.11", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-middleware": "^2.0.8", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-utf8": "^2.0.2", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.477.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.477.0.tgz", - "integrity": "sha512-o0434EH+d1BxHZvgG7z8vph2SYefciQ5RnJw2MgvETGnthgqsnI4nnNJLSw0FVeqCeS18n6vRtzqlGYR2YPCNg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^1.2.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/signature-v4": "^2.0.0", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", - "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.478.0.tgz", - "integrity": "sha512-SsrYEYUvTG9ZoPC+zB19AnVoOKID+QIEHJDIi1GCZXW5kTVyr1saTVm4orG2TjYvbHQMddsWtHOvGYXZWAYMbw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.468.0", - "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.478.0", - "@aws-sdk/credential-provider-web-identity": "3.468.0", - "@aws-sdk/types": "3.468.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.478.0.tgz", - "integrity": "sha512-nwDutJYeHiIZCQDgKIUrsgwAWTil0mNe+cbd+j8fi+wwxkWUzip+F0+z02molJ8WrUUKNRhqB1V5aVx7IranuA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.468.0", - "@aws-sdk/credential-provider-ini": "3.478.0", - "@aws-sdk/credential-provider-process": "3.468.0", - "@aws-sdk/credential-provider-sso": "3.478.0", - "@aws-sdk/credential-provider-web-identity": "3.468.0", - "@aws-sdk/types": "3.468.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", - "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.478.0.tgz", - "integrity": "sha512-LsDShG51X/q+s5ZFN7kHVqrd8ZHdyEyHqdhoocmRvvw2Dif50M0AqQfvCrW1ndj5CNzXO4x/eH8EK5ZOVlS6Sg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.478.0", - "@aws-sdk/token-providers": "3.478.0", - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", - "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", - "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", - "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", - "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", - "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.7.0", - "@smithy/util-middleware": "^2.0.8", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz", - "integrity": "sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.478.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", - "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.8", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.478.0.tgz", - "integrity": "sha512-7b5tj1y/wGHZIZ+ckjOUKgKrMuCJMF/G1UKZKIqqdekeEsjcThbvoxAMeY0FEowu2ODVk/ggOmpBFxcu0iYd6A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.468.0", - "@aws-sdk/middleware-logger": "3.468.0", - "@aws-sdk/middleware-recursion-detection": "3.468.0", - "@aws-sdk/middleware-user-agent": "3.478.0", - "@aws-sdk/region-config-resolver": "3.470.0", - "@aws-sdk/types": "3.468.0", - "@aws-sdk/util-endpoints": "3.478.0", - "@aws-sdk/util-user-agent-browser": "3.468.0", - "@aws-sdk/util-user-agent-node": "3.470.0", - "@smithy/config-resolver": "^2.0.21", - "@smithy/fetch-http-handler": "^2.3.1", - "@smithy/hash-node": "^2.0.17", - "@smithy/invalid-dependency": "^2.0.15", - "@smithy/middleware-content-length": "^2.0.17", - "@smithy/middleware-endpoint": "^2.2.3", - "@smithy/middleware-retry": "^2.0.24", - "@smithy/middleware-serde": "^2.0.15", - "@smithy/middleware-stack": "^2.0.9", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/node-http-handler": "^2.2.1", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.11", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.18", - "@smithy/types": "^2.7.0", - "@smithy/url-parser": "^2.0.15", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.1", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.22", - "@smithy/util-defaults-mode-node": "^2.0.29", - "@smithy/util-endpoints": "^1.0.7", - "@smithy/util-retry": "^2.0.8", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", - "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.478.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz", - "integrity": "sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/util-endpoints": "^1.0.7", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.468.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", - "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/types": "^2.7.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.470.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", - "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.468.0", - "@smithy/node-config-provider": "^2.1.8", - "@smithy/types": "^2.7.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.3.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", - "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@babel/generator/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", - "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, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "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, - "license": "ISC" - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz", - "integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-decorators": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", - "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", - "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/standalone": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.25.6.tgz", - "integrity": "sha512-Kf2ZcZVqsKbtYhlA7sP0z5A3q5hmCVYMKMWRWNK/5OVwHIve3JY1djVRmIVAx8FMueLIfZGKQDIILK2w8zO4mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@barbapapazes/plausible-tracker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@barbapapazes/plausible-tracker/-/plausible-tracker-0.5.2.tgz", - "integrity": "sha512-su3ut2STFDV+pVCRd0SbCYCA31YWqqEk0Z4/vDMeGvqLMw5hJaQt2mXxbbokIzXTnjODDTeCA/m+TjkHRTWBEg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@builder.io/qwik": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@builder.io/qwik/-/qwik-1.9.0.tgz", - "integrity": "sha512-E4EFXOaUz4A6D48lw1CwKR4CLZCPquetuMPrRoAPZjBueL/R1oBzXdRt5zVemS6lAoTSjXBsnxXo2kGYKCI7pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.1", - "vite": "^5" - }, - "bin": { - "qwik": "dist/qwik-cli.cjs" - }, - "engines": { - "node": ">=16.8.0 <18.0.0 || >=18.11" - } - }, - "node_modules/@builder.io/qwik-city": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@builder.io/qwik-city/-/qwik-city-1.9.0.tgz", - "integrity": "sha512-N+TARxsrVMNpIQQ+cnTN+c/gCdI5PlUGPFaRnWT4dw3ug+bizoaldksFvdATarWVYUMkoK7tTpop3cORKN9tAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3", - "@types/mdx": "^2", - "source-map": "^0.7.4", - "svgo": "^3.3", - "undici": "*", - "valibot": ">=0.36.0 <2", - "vfile": "6.0.1", - "vite": "^5", - "vite-imagetools": "^7", - "zod": "3.22.4" - }, - "engines": { - "node": ">=16.8.0 <18.0.0 || >=18.11" - } - }, - "node_modules/@builder.io/qwik-city/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@builder.io/qwik-city/node_modules/valibot": { - "version": "0.42.1", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.42.1.tgz", - "integrity": "sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">=5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@builder.io/qwik-react": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@builder.io/qwik-react/-/qwik-react-0.5.0.tgz", - "integrity": "sha512-JdJWQWOJGv7ddQqEZwzR8wPh0IoCQZwD9qo75+reiQaLp6eH+Pjsm/kn1LaMQt6u72pCCNjnj5kEn/bnbfnIjQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@builder.io/qwik": ">=0.22.0", - "@types/react": ">=18.0.1", - "@types/react-dom": ">=18.0.0", - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/@cf-wasm/resvg": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/@cf-wasm/resvg/-/resvg-0.1.22.tgz", - "integrity": "sha512-RScHxeG9MheTEpZcA/JOz5EO2P1Kjj09kuAAdFWpbCuu/VVq1gF5oRUb3KhZzLYYMsGPvqKNMqdBlT0g8P+tfw==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@resvg/resvg-wasm": "^2.6.2", - "@resvg/resvg-wasm-2.4.1": "npm:@resvg/resvg-wasm@2.4.1" - } - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", - "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "mime": "^3.0.0" - }, - "engines": { - "node": ">=16.13" - } - }, - "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240925.0.tgz", - "integrity": "sha512-KdLnSXuzB65CbqZPm+qYzk+zkQ1tUNPaaRGYVd/jPYAxwwtfTUQdQ+ahDPwVVs2tmQELKy7ZjQjf2apqSWUfjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240925.0.tgz", - "integrity": "sha512-MiQ6uUmCXjsXgWNV+Ock2tp2/tYqNJGzjuaH6jFioeRF+//mz7Tv7J7EczOL4zq+TH8QFOh0/PUsLyazIWVGng==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240925.0.tgz", - "integrity": "sha512-Rjix8jsJMfsInmq3Hm3fmiRQ+rwzuWRPV1pg/OWhMSfNP7Qp2RCU+RGkhgeR9Z5eNAje0Sn2BMrFq4RvF9/yRA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240925.0.tgz", - "integrity": "sha512-VYIPeMHQRtbwQoIjUwS/zULlywPxyDvo46XkTpIW5MScEChfqHvAYviQ7TzYGx6Q+gmZmN+DUB2KOMx+MEpCxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240925.0.tgz", - "integrity": "sha512-C8peGvaU5R51bIySi1VbyfRgwNSSRknqoFSnSbSBI3uTN3THTB3UnmRKy7GXJDmyjgXuT9Pcs1IgaWNubLtNtw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=16" - } - }, - "node_modules/@cloudflare/workers-shared": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-shared/-/workers-shared-0.5.4.tgz", - "integrity": "sha512-PNL/0TjKRdUHa1kwgVdqUNJVZ9ez4kacsi8omz+gv859EvJmsVuGiMAClY2YfJnC9LVKhKCcjqmFgKNXG9/IXA==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "mime": "^3.0.0", - "zod": "^3.22.3" - }, - "engines": { - "node": ">=16.7.0" - } - }, - "node_modules/@cloudflare/workers-types": { - "version": "4.20240821.1", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240821.1.tgz", - "integrity": "sha512-icAkbnAqgVl6ef9lgLTom8na+kj2RBw2ViPAQ586hbdj0xZcnrjK7P46Eu08OU9D/lNDgN2sKU/sxhe2iK/gIg==", - "dev": true, - "license": "MIT OR Apache-2.0" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.13.tgz", - "integrity": "sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.7.1", - "@csstools/css-tokenizer": "^2.4.1" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", - "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^2.4.1" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz", - "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", - "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@esbuild-plugins/node-globals-polyfill": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", - "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "esbuild": "*" - } - }, - "node_modules/@esbuild-plugins/node-modules-polyfill": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", - "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", - "dev": true, - "license": "ISC", - "dependencies": { - "escape-string-regexp": "^4.0.0", - "rollup-plugin-node-polyfills": "^0.2.1" - }, - "peerDependencies": { - "esbuild": "*" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/compat": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.1.1.tgz", - "integrity": "sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@fontsource/bricolage-grotesque": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@fontsource/bricolage-grotesque/-/bricolage-grotesque-5.1.0.tgz", - "integrity": "sha512-kdZyXbftmi09GjewApG5z7KVbcz5ZXNvFUguKodNtOe34j9F3Hp7dWjcZNqMt/o4BtBKZBBLM4MjAVE+DrQpng==", - "dev": true, - "license": "OFL-1.1" - }, - "node_modules/@fontsource/geist-sans": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@fontsource/geist-sans/-/geist-sans-5.1.0.tgz", - "integrity": "sha512-4AI/UxIcZiYgK6/cTo4R9oM4VHHLcFdHVv7m2+M42VyY16hhKJADrGe4HPjTxvolmce2IZX/jc6sFJ+GkLB64w==", - "dev": true, - "license": "OFL-1.1" - }, - "node_modules/@grpc/grpc-js": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.3.tgz", - "integrity": "sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "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, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "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, - "license": "MIT" - }, - "node_modules/@iconify/vue": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.2.tgz", - "integrity": "sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@iconify/types": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/cyberalien" - }, - "peerDependencies": { - "vue": ">=3" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.2.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@jsquash/avif": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsquash/avif/-/avif-1.3.0.tgz", - "integrity": "sha512-N6zH27O/AioCPNGxaf33PYnUEQZmAjUz0JwwAf9eMHRdYItn+CxwxlsHSSOkFmZKW+v9uVX6c7ZPQ4RTXArL7A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "wasm-feature-detect": "^1.2.11" - } - }, - "node_modules/@jsquash/jpeg": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@jsquash/jpeg/-/jpeg-1.4.0.tgz", - "integrity": "sha512-I/uGQ5Gk3qOEQNufUcR9boZ0qH+eoXW7cp0mW9eNInlgjRXwEhepvfbnutQ+RM1dNeuIHoOM5YVCEK1y/ATipQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@jsquash/resize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@jsquash/resize/-/resize-2.0.0.tgz", - "integrity": "sha512-7tHcS/mMzXyzB4ryDjEX+GQnae5E9FDx9COs/F873YrDvP60fvMAGEp/dbq+XBIxp40NLsP/rzHZnDVNADT2iA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@logdna/tail-file": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@logdna/tail-file/-/tail-file-2.2.0.tgz", - "integrity": "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng==", - "dev": true, - "license": "SEE LICENSE IN LICENSE", - "engines": { - "node": ">=10.3.0" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true, - "license": "MIT" - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@modular-forms/qwik": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@modular-forms/qwik/-/qwik-0.27.0.tgz", - "integrity": "sha512-FbyXzxx1rMSHIRkoQ5MOu016BZkItHkk4ezkf67zFrAwlSZSA2ADOqAjeoheiYeVO26CGyPDetQh8v/AXYHDGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "decode-formdata": ">=0.7.5 <1", - "valibot": ">=0.33.0 <1" - }, - "peerDependencies": { - "@builder.io/qwik": "^1.4.0", - "@builder.io/qwik-city": "^1.4.0" - } - }, - "node_modules/@modular-forms/qwik/node_modules/valibot": { - "version": "0.42.1", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.42.1.tgz", - "integrity": "sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">=5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@nestri/cache": { - "resolved": "packages/cache", - "link": true - }, - "node_modules/@nestri/core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@nestri/eslint-config": { - "resolved": "packages/eslint-config", - "link": true - }, - "node_modules/@nestri/moq": { - "resolved": "packages/moq", - "link": true - }, - "node_modules/@nestri/nexus": { - "resolved": "packages/api", - "link": true - }, - "node_modules/@nestri/typescript-config": { - "resolved": "packages/typescript-config", - "link": true - }, - "node_modules/@nestri/ui": { - "resolved": "packages/ui", - "link": true - }, - "node_modules/@nestri/web": { - "resolved": "apps/www", - "link": true - }, - "node_modules/@netlify/functions": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.8.1.tgz", - "integrity": "sha512-+6wtYdoz0yE06dSa9XkP47tw5zm6g13QMeCwM3MmHx1vn8hzwFa51JtmfraprdkL7amvb7gaNM+OOhQU1h6T8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@netlify/serverless-functions-api": "1.19.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@netlify/node-cookies": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@netlify/node-cookies/-/node-cookies-0.1.0.tgz", - "integrity": "sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.16.0 || >=16.0.0" - } - }, - "node_modules/@netlify/serverless-functions-api": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.19.1.tgz", - "integrity": "sha512-2KYkyluThg1AKfd0JWI7FzpS4A/fzVVGYIf6AM4ydWyNj8eI/86GQVLeRgDoH7CNOxt243R5tutWlmHpVq0/Ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@netlify/node-cookies": "^0.1.0", - "urlpattern-polyfill": "8.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz", - "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.1", - "@npmcli/installed-package-contents": "^2.1.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.1", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.1.0", - "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "bin-links": "^4.0.4", - "cacache": "^18.0.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.2", - "json-parse-even-better-errors": "^3.0.2", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^7.2.1", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-registry-fetch": "^17.0.1", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.0", - "proc-log": "^4.2.0", - "proggy": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.6", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", - "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", - "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", - "dev": true, - "license": "ISC", - "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^18.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", - "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/query": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", - "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nuxt-themes/docus": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@nuxt-themes/docus/-/docus-1.15.0.tgz", - "integrity": "sha512-V2kJ5ecGUxXcEovXeQkJBPYfQwjmjaxB5fnl2XaQV+S2Epcn+vhPWShSlL6/WXzLPiAkQFdwbBj9xedTvXgjkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt-themes/elements": "^0.9.5", - "@nuxt-themes/tokens": "^1.9.1", - "@nuxt-themes/typography": "^0.11.0", - "@nuxt/content": "^2.8.5", - "@nuxthq/studio": "^1.0.0", - "@vueuse/integrations": "^10.4.1", - "@vueuse/nuxt": "^10.4.1", - "focus-trap": "^7.5.3", - "fuse.js": "^6.6.2" - } - }, - "node_modules/@nuxt-themes/elements": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@nuxt-themes/elements/-/elements-0.9.5.tgz", - "integrity": "sha512-uAA5AiIaT1SxCBjNIURJyCDPNR27+8J+t3AWuzWyhbNPr3L1inEcETZ3RVNzFdQE6mx7MGAMwFBqxPkOUhZQuA==", - "dev": true, - "dependencies": { - "@nuxt-themes/tokens": "^1.9.1", - "@vueuse/core": "^9.13.0" - } - }, - "node_modules/@nuxt-themes/tokens": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@nuxt-themes/tokens/-/tokens-1.9.1.tgz", - "integrity": "sha512-5C28kfRvKnTX8Tux+xwyaf+2pxKgQ53dC9l6C33sZwRRyfUJulGDZCFjKbuNq4iqVwdGvkFSQBYBYjFAv6t75g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxtjs/color-mode": "^3.2.0", - "@vueuse/core": "^9.13.0", - "pinceau": "^0.18.8" - } - }, - "node_modules/@nuxt-themes/typography": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@nuxt-themes/typography/-/typography-0.11.0.tgz", - "integrity": "sha512-TqyvD7sDWnqGmL00VtuI7JdmNTPL5/g957HCAWNzcNp+S20uJjW/FXSdkM76d4JSVDHvBqw7Wer3RsqVhqvA4w==", - "dev": true, - "dependencies": { - "@nuxtjs/color-mode": "^3.2.0", - "nuxt-config-schema": "^0.4.5", - "nuxt-icon": "^0.3.3", - "pinceau": "^0.18.8", - "ufo": "^1.1.1" - } - }, - "node_modules/@nuxt/content": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/@nuxt/content/-/content-2.13.2.tgz", - "integrity": "sha512-9AmX7iG8+1MaWia8XLe1TyzoLrTaIhchas19w6VxqZI0dEoQCGslEcdOxy8xLrdGVFuy6MObBwU8SZgpQB9pyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.12.4", - "@nuxtjs/mdc": "^0.8.3", - "@vueuse/core": "^10.11.0", - "@vueuse/head": "^2.0.0", - "@vueuse/nuxt": "^10.11.0", - "consola": "^3.2.3", - "defu": "^6.1.4", - "destr": "^2.0.3", - "json5": "^2.2.3", - "knitwork": "^1.1.0", - "listhen": "^1.7.2", - "mdast-util-to-string": "^4.0.0", - "mdurl": "^2.0.0", - "micromark": "^4.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-types": "^2.0.0", - "minisearch": "^7.0.2", - "ohash": "^1.1.3", - "pathe": "^1.1.2", - "scule": "^1.3.0", - "shiki": "^1.10.3", - "slugify": "^1.6.6", - "socket.io-client": "^4.7.5", - "ufo": "^1.5.4", - "unist-util-stringify-position": "^4.0.0", - "unstorage": "^1.10.2", - "ws": "^8.18.0" - } - }, - "node_modules/@nuxt/content/node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxt/content/node_modules/@vueuse/core": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", - "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@nuxt/content/node_modules/@vueuse/metadata": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", - "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@nuxt/content/node_modules/@vueuse/shared": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", - "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@nuxt/content/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@nuxt/devalue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", - "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxt/devtools": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-1.5.1.tgz", - "integrity": "sha512-A5+TEKJURuwes/PD30hl6gksA+935UY7i8DIkDr+9a4AWnPgrVt/WsGRmz84Q/9eRBxlLjwD9/kwDpNYcMST6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@nuxt/devtools-kit": "1.5.1", - "@nuxt/devtools-wizard": "1.5.1", - "@nuxt/kit": "^3.13.2", - "@vue/devtools-core": "7.4.4", - "@vue/devtools-kit": "7.4.4", - "birpc": "^0.2.17", - "consola": "^3.2.3", - "cronstrue": "^2.50.0", - "destr": "^2.0.3", - "error-stack-parser-es": "^0.1.5", - "execa": "^7.2.0", - "fast-npm-meta": "^0.2.2", - "flatted": "^3.3.1", - "get-port-please": "^3.1.2", - "hookable": "^5.5.3", - "image-meta": "^0.2.1", - "is-installed-globally": "^1.0.0", - "launch-editor": "^2.9.1", - "local-pkg": "^0.5.0", - "magicast": "^0.3.5", - "nypm": "^0.3.11", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.0", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.6.3", - "simple-git": "^3.27.0", - "sirv": "^2.0.4", - "tinyglobby": "^0.2.6", - "unimport": "^3.12.0", - "vite-plugin-inspect": "^0.8.7", - "vite-plugin-vue-inspector": "^5.2.0", - "which": "^3.0.1", - "ws": "^8.18.0" - }, - "bin": { - "devtools": "cli.mjs" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/@nuxt/devtools-kit": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-1.5.1.tgz", - "integrity": "sha512-s2dpN1vCOgua2pSYG7/xUMjf7CyLTBeEK2IRqeOeiNpiElft4ygDddlg6P3ot0Hpp+GvWTz0uPGot/vI73uk4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.13.2", - "@nuxt/schema": "^3.13.2", - "execa": "^7.2.0" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/@nuxt/devtools-wizard": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-1.5.1.tgz", - "integrity": "sha512-09VqUYnL8dh31GK85g9+L1xZCXCmieOBWsV9H5a3ZA7wNepDjbrmaRFr/KSA6fsI7AZoqzkNuRsGUzEksEDxpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3", - "diff": "^7.0.0", - "execa": "^7.2.0", - "global-directory": "^4.0.1", - "magicast": "^0.3.5", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "prompts": "^2.4.2", - "rc9": "^2.1.2", - "semver": "^7.6.3" - }, - "bin": { - "devtools-wizard": "cli.mjs" - } - }, - "node_modules/@nuxt/eslint-config": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@nuxt/eslint-config/-/eslint-config-0.5.7.tgz", - "integrity": "sha512-B+snO9NS9+v2657Z84tMbW3hLxjauIUkk2m4vnYjb9xfAFdoQwK07q6aaf7LzvagmVFmQiclT9LbJMvlRqzmsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint/js": "^9.10.0", - "@nuxt/eslint-plugin": "0.5.7", - "@stylistic/eslint-plugin": "^2.8.0", - "@typescript-eslint/eslint-plugin": "^8.5.0", - "@typescript-eslint/parser": "^8.5.0", - "eslint-config-flat-gitignore": "^0.3.0", - "eslint-flat-config-utils": "^0.4.0", - "eslint-plugin-import-x": "^4.2.1", - "eslint-plugin-jsdoc": "^50.2.2", - "eslint-plugin-regexp": "^2.6.0", - "eslint-plugin-unicorn": "^55.0.0", - "eslint-plugin-vue": "^9.28.0", - "globals": "^15.9.0", - "local-pkg": "^0.5.0", - "pathe": "^1.1.2", - "vue-eslint-parser": "^9.4.3" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@nuxt/eslint-config/node_modules/@eslint/js": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", - "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@nuxt/eslint-config/node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nuxt/eslint-plugin": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@nuxt/eslint-plugin/-/eslint-plugin-0.5.7.tgz", - "integrity": "sha512-vYQYs/L87g2pBIoTmkk2mgYBqePTQDnhk87nGqsosKbfQ80xj9kkN3dsVb6BDQFk0zik4THWpXmnfjkvsjm/eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "^8.5.0", - "@typescript-eslint/utils": "^8.5.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@nuxt/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@nuxt/kit": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.13.2.tgz", - "integrity": "sha512-KvRw21zU//wdz25IeE1E5m/aFSzhJloBRAQtv+evcFeZvuroIxpIQuUqhbzuwznaUwpiWbmwlcsp5uOWmi4vwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/schema": "3.13.2", - "c12": "^1.11.2", - "consola": "^3.2.3", - "defu": "^6.1.4", - "destr": "^2.0.3", - "globby": "^14.0.2", - "hash-sum": "^2.0.0", - "ignore": "^5.3.2", - "jiti": "^1.21.6", - "klona": "^2.0.6", - "knitwork": "^1.1.0", - "mlly": "^1.7.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "scule": "^1.3.0", - "semver": "^7.6.3", - "ufo": "^1.5.4", - "unctx": "^2.3.1", - "unimport": "^3.12.0", - "untyped": "^1.4.2" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/schema": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.13.2.tgz", - "integrity": "sha512-CCZgpm+MkqtOMDEgF9SWgGPBXlQ01hV/6+2reDEpJuqFPGzV8HYKPBcIFvn7/z5ahtgutHLzjP71Na+hYcqSpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "compatx": "^0.1.8", - "consola": "^3.2.3", - "defu": "^6.1.4", - "hookable": "^5.5.3", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "scule": "^1.3.0", - "std-env": "^3.7.0", - "ufo": "^1.5.4", - "uncrypto": "^0.1.3", - "unimport": "^3.12.0", - "untyped": "^1.4.2" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/telemetry": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.6.0.tgz", - "integrity": "sha512-h4YJ1d32cU7tDKjjhjtIIEck4WF/w3DTQBT348E9Pz85YLttnLqktLM0Ez9Xc2LzCeUgBDQv1el7Ob/zT3KUqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.13.1", - "ci-info": "^4.0.0", - "consola": "^3.2.3", - "create-require": "^1.1.1", - "defu": "^6.1.4", - "destr": "^2.0.3", - "dotenv": "^16.4.5", - "git-url-parse": "^15.0.0", - "is-docker": "^3.0.0", - "jiti": "^1.21.6", - "mri": "^1.2.0", - "nanoid": "^5.0.7", - "ofetch": "^1.3.4", - "package-manager-detector": "^0.2.0", - "parse-git-config": "^3.0.0", - "pathe": "^1.1.2", - "rc9": "^2.1.2", - "std-env": "^3.7.0" - }, - "bin": { - "nuxt-telemetry": "bin/nuxt-telemetry.mjs" - } - }, - "node_modules/@nuxt/telemetry/node_modules/git-url-parse": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-15.0.0.tgz", - "integrity": "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/@nuxt/telemetry/node_modules/nanoid": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", - "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/@nuxt/vite-builder": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.13.2.tgz", - "integrity": "sha512-3dzc3YH3UeTmzGtCevW1jTq0Q8/cm+yXqo/VS/EFM3aIO/tuNPS88is8ZF2YeBButFnLFllq/QenziPbq0YD6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "3.13.2", - "@rollup/plugin-replace": "^5.0.7", - "@vitejs/plugin-vue": "^5.1.3", - "@vitejs/plugin-vue-jsx": "^4.0.1", - "autoprefixer": "^10.4.20", - "clear": "^0.1.0", - "consola": "^3.2.3", - "cssnano": "^7.0.6", - "defu": "^6.1.4", - "esbuild": "^0.23.1", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "externality": "^1.0.2", - "get-port-please": "^3.1.2", - "h3": "^1.12.0", - "knitwork": "^1.1.0", - "magic-string": "^0.30.11", - "mlly": "^1.7.1", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.0", - "postcss": "^8.4.47", - "rollup-plugin-visualizer": "^5.12.0", - "std-env": "^3.7.0", - "strip-literal": "^2.1.0", - "ufo": "^1.5.4", - "unenv": "^1.10.0", - "unplugin": "^1.14.1", - "vite": "^5.4.5", - "vite-node": "^2.1.1", - "vite-plugin-checker": "^0.8.0", - "vue-bundle-renderer": "^2.1.0" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - }, - "peerDependencies": { - "vue": "^3.3.4" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/@nuxt/vite-builder/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" - } - }, - "node_modules/@nuxthq/studio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@nuxthq/studio/-/studio-1.1.2.tgz", - "integrity": "sha512-YVEiIuU+5cLZ0qdLsRAYuFE395XoYf87UTR5xwxxpw9++uhlyLiQyO7JIXTTWIOdEiMHt8frrrLJBBPd5tHAeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.11.2", - "defu": "^6.1.4", - "git-url-parse": "^14.0.0", - "nuxt-component-meta": "^0.6.4", - "parse-git-config": "^3.0.0", - "pkg-types": "^1.1.1", - "socket.io-client": "^4.7.5", - "ufo": "^1.5.3", - "untyped": "^1.4.2" - } - }, - "node_modules/@nuxtjs/color-mode": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@nuxtjs/color-mode/-/color-mode-3.5.1.tgz", - "integrity": "sha512-GRHF3WUwX6fXIiRVlngNq1nVDwrVuP6dWX1DRmox3QolzX0eH1oJEcFr/lAm1nkT71JVGb8mszho9w+yHJbePw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.13.1", - "changelogen": "^0.5.5", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "semver": "^7.6.3" - } - }, - "node_modules/@nuxtjs/mdc": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@nuxtjs/mdc/-/mdc-0.8.3.tgz", - "integrity": "sha512-FqvJFWkBN9u2FeWog+7+C0aIOx0WIu61TYgAXPmmIOVVua6s2mXQsMyF3fXY2M56QBIaYJzK/SYN+5FGr5GNTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.12.2", - "@shikijs/transformers": "^1.10.0", - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "@vue/compiler-core": "^3.4.31", - "consola": "^3.2.3", - "debug": "^4.3.5", - "defu": "^6.1.4", - "destr": "^2.0.3", - "detab": "^3.0.2", - "github-slugger": "^2.0.0", - "hast-util-to-string": "^3.0.0", - "mdast-util-to-hast": "^13.2.0", - "micromark-util-sanitize-uri": "^2.0.0", - "ohash": "^1.1.3", - "parse5": "^7.1.2", - "pathe": "^1.1.2", - "property-information": "^6.5.0", - "rehype-external-links": "^3.0.0", - "rehype-raw": "^7.0.0", - "rehype-slug": "^6.0.0", - "rehype-sort-attribute-values": "^5.0.0", - "rehype-sort-attributes": "^5.0.0", - "remark-emoji": "^5.0.0", - "remark-gfm": "^4.0.0", - "remark-mdc": "^3.2.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.0", - "scule": "^1.3.0", - "shiki": "^1.10.0", - "ufo": "^1.5.3", - "unified": "^11.0.5", - "unist-builder": "^4.0.0", - "unist-util-visit": "^5.0.0", - "unwasm": "^0.3.9" - } - }, - "node_modules/@nuxtjs/plausible": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/plausible/-/plausible-1.0.2.tgz", - "integrity": "sha512-AT5GoVddqgvbp39OY1/DtWHUgjn+6LGjJXB75imdEUxPok2uAVGtr3oZ0F7merC9T3y0rIqZx8HzpUmCcipBnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@barbapapazes/plausible-tracker": "^0.5.2", - "@nuxt/kit": "^3.12.4", - "defu": "^6.1.4" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", - "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", - "integrity": "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.26.0.tgz", - "integrity": "sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", - "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.1.tgz", - "integrity": "sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.26.0.tgz", - "integrity": "sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.26.0.tgz", - "integrity": "sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.26.0.tgz", - "integrity": "sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/context-async-hooks": "1.26.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/propagator-b3": "1.26.0", - "@opentelemetry/propagator-jaeger": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", - "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.4.1", - "@parcel/watcher-darwin-arm64": "2.4.1", - "@parcel/watcher-darwin-x64": "2.4.1", - "@parcel/watcher-freebsd-x64": "2.4.1", - "@parcel/watcher-linux-arm-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-musl": "2.4.1", - "@parcel/watcher-linux-x64-glibc": "2.4.1", - "@parcel/watcher-linux-x64-musl": "2.4.1", - "@parcel/watcher-win32-arm64": "2.4.1", - "@parcel/watcher-win32-ia32": "2.4.1", - "@parcel/watcher-win32-x64": "2.4.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", - "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz", - "integrity": "sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==", - "bundleDependencies": [ - "napi-wasm" - ], - "dev": true, - "license": "MIT", - "dependencies": { - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "napi-wasm": "^1.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@pulumi/pulumi": { - "version": "3.134.1", - "resolved": "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-3.134.1.tgz", - "integrity": "sha512-uXUldyEsYbEXkqE3nPfgABnfgnXjQv3YkzkiigeOBzTF2+7rQe7C/9nMnMJHs4k5XMW5183t7bYMU/W4qUUVcA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.10.1", - "@logdna/tail-file": "^2.0.6", - "@npmcli/arborist": "^7.3.1", - "@opentelemetry/api": "^1.9", - "@opentelemetry/exporter-zipkin": "^1.25", - "@opentelemetry/instrumentation": "^0.52", - "@opentelemetry/instrumentation-grpc": "^0.52", - "@opentelemetry/resources": "^1.25", - "@opentelemetry/sdk-trace-base": "^1.25", - "@opentelemetry/sdk-trace-node": "^1.25", - "@opentelemetry/semantic-conventions": "^1.25", - "@pulumi/query": "^0.3.0", - "@types/google-protobuf": "^3.15.5", - "@types/semver": "^7.5.6", - "@types/tmp": "^0.2.6", - "execa": "^5.1.0", - "fdir": "^6.1.1", - "google-protobuf": "^3.5.0", - "got": "^11.8.6", - "ini": "^2.0.0", - "js-yaml": "^3.14.0", - "minimist": "^1.2.6", - "normalize-package-data": "^6.0.0", - "picomatch": "^3.0.1", - "pkg-dir": "^7.0.0", - "require-from-string": "^2.0.1", - "semver": "^7.5.2", - "source-map-support": "^0.5.6", - "tmp": "^0.2.1", - "upath": "^1.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "ts-node": ">= 7.0.1 < 12", - "typescript": ">= 3.8.3 < 6" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@pulumi/pulumi/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@pulumi/pulumi/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@pulumi/pulumi/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@pulumi/pulumi/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pulumi/pulumi/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@pulumi/pulumi/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@pulumi/pulumi/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@pulumi/pulumi/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pulumi/pulumi/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@pulumi/pulumi/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@pulumi/query": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@pulumi/query/-/query-0.3.0.tgz", - "integrity": "sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@resvg/resvg-wasm": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@resvg/resvg-wasm/-/resvg-wasm-2.6.2.tgz", - "integrity": "sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@resvg/resvg-wasm-2.4.1": { - "name": "@resvg/resvg-wasm", - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@resvg/resvg-wasm/-/resvg-wasm-2.4.1.tgz", - "integrity": "sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@rollup/plugin-alias": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", - "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.8", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", - "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/plugin-commonjs/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz", - "integrity": "sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", - "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz", - "integrity": "sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz", - "integrity": "sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz", - "integrity": "sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz", - "integrity": "sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz", - "integrity": "sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz", - "integrity": "sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz", - "integrity": "sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz", - "integrity": "sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz", - "integrity": "sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz", - "integrity": "sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz", - "integrity": "sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz", - "integrity": "sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz", - "integrity": "sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz", - "integrity": "sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz", - "integrity": "sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz", - "integrity": "sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@shikijs/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.21.0.tgz", - "integrity": "sha512-zAPMJdiGuqXpZQ+pWNezQAk5xhzRXBNiECFPcJLtUdsFM3f//G95Z15EHTnHchYycU8kIIysqGgxp8OVSj1SPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-javascript": "1.21.0", - "@shikijs/engine-oniguruma": "1.21.0", - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.3" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.21.0.tgz", - "integrity": "sha512-jxQHNtVP17edFW4/0vICqAVLDAxmyV31MQJL4U/Kg+heQALeKYVOWo0sMmEZ18FqBt+9UCdyqGKYE7bLRtk9mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2", - "oniguruma-to-js": "0.4.3" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.21.0.tgz", - "integrity": "sha512-AIZ76XocENCrtYzVU7S4GY/HL+tgHGbVU+qhiDyNw1qgCA5OSi4B4+HY4BtAoJSMGuD/L5hfTzoRVbzEm2WTvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2" - } - }, - "node_modules/@shikijs/transformers": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.21.0.tgz", - "integrity": "sha512-aA+XGGSzipcvqdsOYL8l6Q2RYiMuJNdhdt9eZnkJmW+wjSOixN/I7dBq3fISwvEMDlawrtuXM3eybLCEC+Fjlg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shiki": "1.21.0" - } - }, - "node_modules/@shikijs/types": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.21.0.tgz", - "integrity": "sha512-tzndANDhi5DUndBtpojEq/42+dpUF2wS7wdCDQaFtIXm3Rd1QkrcVgSSRLOvEwexekihOXfbYJINW37g96tJRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^9.2.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz", - "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz", - "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz", - "integrity": "sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-config-provider": "^2.3.0", - "@smithy/util-middleware": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.4.2.tgz", - "integrity": "sha512-2fek3I0KZHWJlRLvRTqxTEri+qV0GRHrJIoLFuBMZB4EMg4WgeBGfF0X6abnrNYpq55KJ6R4D6x4f0vLnhzinA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-endpoint": "^2.5.1", - "@smithy/middleware-retry": "^2.3.1", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.1", - "@smithy/types": "^2.12.0", - "@smithy/util-middleware": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz", - "integrity": "sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/eventstream-codec": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz", - "integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.12.0", - "@smithy/util-hex-encoding": "^2.2.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz", - "integrity": "sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz", - "integrity": "sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz", - "integrity": "sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz", - "integrity": "sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-codec": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz", - "integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^3.3.0", - "@smithy/querystring-builder": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/util-base64": "^2.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz", - "integrity": "sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz", - "integrity": "sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz", - "integrity": "sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.1.tgz", - "integrity": "sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^2.3.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-middleware": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.3.1.tgz", - "integrity": "sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/service-error-classification": "^2.1.5", - "@smithy/smithy-client": "^2.5.1", - "@smithy/types": "^2.12.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz", - "integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz", - "integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz", - "integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz", - "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/querystring-builder": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz", - "integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz", - "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz", - "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-uri-escape": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz", - "integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz", - "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz", - "integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.3.0.tgz", - "integrity": "sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/util-hex-encoding": "^2.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-uri-escape": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.1.tgz", - "integrity": "sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-endpoint": "^2.5.1", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-stream": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", - "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz", - "integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz", - "integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz", - "integrity": "sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz", - "integrity": "sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz", - "integrity": "sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.1.tgz", - "integrity": "sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^2.2.0", - "@smithy/smithy-client": "^2.5.1", - "@smithy/types": "^2.12.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.1.tgz", - "integrity": "sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^2.2.0", - "@smithy/credential-provider-imds": "^2.3.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/smithy-client": "^2.5.1", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz", - "integrity": "sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz", - "integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz", - "integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz", - "integrity": "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^2.1.5", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz", - "integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-hex-encoding": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz", - "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.2.0.tgz", - "integrity": "sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.8.0.tgz", - "integrity": "sha512-Ufvk7hP+bf+pD35R/QfunF793XlSRIC7USr3/EdgduK9j13i2JjmsM0LUz3/foS+jDYp2fzyWZA9N44CPur0Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.4.0", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "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/@stylistic/eslint-plugin/node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/audioworklet": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.50.tgz", - "integrity": "sha512-Wic6k+tczhJZz4yq2ianEowIF/xH10wI9ac8sBDh27Jvs+WIvXIeM+nWPPRITFwSKuLZKlvVjfLiNmUjfy4koA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.145", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.145.tgz", - "integrity": "sha512-dtByW6WiFk5W5Jfgz1VM+YPA21xMXTuSFoLYIDY0L44jDLLflVPtZkYuu3/YxpGcvjzKFBZLU+GyKjR0HOYtyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/dom-mediacapture-transform": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-transform/-/dom-mediacapture-transform-0.1.9.tgz", - "integrity": "sha512-/K96dASG23bqF+VAftybbI5SUj9qSsdsSKZglm7Bq/sIaEve5z8I+GdClARcSQMAAVkH7bc83UI1jiH/qc5LMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/dom-webcodecs": "*" - } - }, - "node_modules/@types/dom-webcodecs": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@types/dom-webcodecs/-/dom-webcodecs-0.1.11.tgz", - "integrity": "sha512-yPEZ3z7EohrmOxbk/QTAa0yonMFkNkjnVXqbGb7D4rMr+F1dGQ8ZUFxXkyLLJuiICPejZ0AZE9Rrk9wUCczx4A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "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, - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/google-protobuf": { - "version": "3.15.12", - "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz", - "integrity": "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "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, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.16.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", - "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/nprogress": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.3.tgz", - "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", - "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tmp": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", - "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/type-utils": "8.7.0", - "@typescript-eslint/utils": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", - "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", - "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", - "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/typescript-estree": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", - "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", - "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", - "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz", - "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", - "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.7.0", - "@typescript-eslint/utils": "8.7.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", - "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", - "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", - "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", - "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", - "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.7.0", - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/typescript-estree": "8.7.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", - "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", - "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "@typescript-eslint/visitor-keys": "8.7.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", - "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz", - "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.16.1", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript/lib-dom": { - "name": "@types/web", - "version": "0.0.115", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.115.tgz", - "integrity": "sha512-IBtUgtxnITC7WTCg4tv6kCnSP0T+fM+3PzQPIzLzJY1DDlhBFKM/9+uMURw14YweWPDiFNIZ94Gc1bJtwow97g==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@unhead/dom": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.7.tgz", - "integrity": "sha512-Nj2ulnbY5lvIcxqXwdO5YfdvLm8EYLjcaOje2b2aQnfyPAyOIVeR8iB79DDKk/uZZAPEwkdhSnUdEh9Ny0b3lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unhead/schema": "1.11.7", - "@unhead/shared": "1.11.7" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/schema": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.7.tgz", - "integrity": "sha512-j9uN7T63aUXrZ6yx2CfjVT7xZHjn0PZO7TPMaWqMFjneIH/NONKvDVCMEqDlXeqdSIERIYtk/xTHgCUMer5eyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hookable": "^5.5.3", - "zhead": "^2.2.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/shared": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.7.tgz", - "integrity": "sha512-5v3PmV1LMyikGyQi/URYS5ilH8dg1Iomtja7iFWke990O8RBDEzAdagJqcsUE/fw+o7cXRSOamyx5wCf5Q1TrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unhead/schema": "1.11.7" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/ssr": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.11.7.tgz", - "integrity": "sha512-qI1zNFY8fU5S9EhroxlXSA5Q/XKbWAKXrVVNG+6bIh/IRrMOMJrPk4d1GmphF4gmNri3ARqly+OWx4VVaj0scA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unhead/schema": "1.11.7", - "@unhead/shared": "1.11.7" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/vue": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.11.7.tgz", - "integrity": "sha512-SLr0eQfznVp63iKi47L4s5Yz+oiQjDA82VBP4jlXi7dM9fSIn1ul1aKvBqle/ZxI2cqY8zVGz60EjhjWeu754A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unhead/schema": "1.11.7", - "@unhead/shared": "1.11.7", - "defu": "^6.1.4", - "hookable": "^5.5.3", - "unhead": "1.11.7" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - }, - "peerDependencies": { - "vue": ">=2.7 || >=3" - } - }, - "node_modules/@unocss/reset": { - "version": "0.50.8", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.50.8.tgz", - "integrity": "sha512-2WoM6O9VyuHDPAnvCXr7LBJQ8ZRHDnuQAFsL1dWXp561Iq2l9whdNtPuMcozLGJGUUrFfVBXIrHY4sfxxScgWg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vercel/nft": { - "version": "0.26.5", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.26.5.tgz", - "integrity": "sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5", - "@rollup/pluginutils": "^4.0.0", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.2", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@vercel/nft/node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@vercel/nft/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vercel/nft/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vercel/nft/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@vercel/nft/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", - "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitejs/plugin-vue-jsx": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.0.1.tgz", - "integrity": "sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7", - "@vue/babel-plugin-jsx": "^1.2.2" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0", - "vue": "^3.0.0" - } - }, - "node_modules/@volar/language-core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.4.1.tgz", - "integrity": "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "1.4.1" - } - }, - "node_modules/@volar/source-map": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.4.1.tgz", - "integrity": "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "muggle-string": "^0.2.2" - } - }, - "node_modules/@volar/typescript": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.11.1.tgz", - "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "1.11.1", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@volar/typescript/node_modules/@volar/language-core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", - "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "1.11.1" - } - }, - "node_modules/@volar/typescript/node_modules/@volar/source-map": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", - "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "muggle-string": "^0.3.1" - } - }, - "node_modules/@volar/typescript/node_modules/muggle-string": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", - "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/vue-language-core": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.6.5.tgz", - "integrity": "sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "1.4.1", - "@volar/source-map": "1.4.1", - "@vue/compiler-dom": "^3.3.0", - "@vue/compiler-sfc": "^3.3.0", - "@vue/reactivity": "^3.3.0", - "@vue/shared": "^3.3.0", - "minimatch": "^9.0.0", - "muggle-string": "^0.2.2", - "vue-template-compiler": "^2.7.14" - } - }, - "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@volar/vue-language-core/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vue-macros/common": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.14.0.tgz", - "integrity": "sha512-xwQhDoEXRNXobNQmdqOD20yUGdVLVLZe4zhDlT9q/E+z+mvT3wukaAoJG80XRnv/BcgOOCVpxqpkQZ3sNTgjWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.6", - "@rollup/pluginutils": "^5.1.0", - "@vue/compiler-sfc": "^3.5.4", - "ast-kit": "^1.1.0", - "local-pkg": "^0.5.0", - "magic-string-ast": "^0.6.2" - }, - "engines": { - "node": ">=16.14.0" - }, - "peerDependencies": { - "vue": "^2.7.0 || ^3.2.25" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } - }, - "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", - "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/babel-plugin-jsx": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", - "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.6", - "@babel/types": "^7.25.6", - "@vue/babel-helper-vue-transform-on": "1.2.5", - "@vue/babel-plugin-resolve-type": "1.2.5", - "html-tags": "^3.3.1", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - } - } - }, - "node_modules/@vue/babel-plugin-resolve-type": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", - "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/parser": "^7.25.6", - "@vue/compiler-sfc": "^3.5.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.10.tgz", - "integrity": "sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.10", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.10.tgz", - "integrity": "sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.10", - "@vue/shared": "3.5.10" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.10.tgz", - "integrity": "sha512-to8E1BgpakV7224ZCm8gz1ZRSyjNCAWEplwFMWKlzCdP9DkMKhRRwt0WkCjY7jkzi/Vz3xgbpeig5Pnbly4Tow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.10", - "@vue/compiler-dom": "3.5.10", - "@vue/compiler-ssr": "3.5.10", - "@vue/shared": "3.5.10", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.47", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.10.tgz", - "integrity": "sha512-hxP4Y3KImqdtyUKXDRSxKSRkSm1H9fCvhojEYrnaoWhE4w/y8vwWhnosJoPPe2AXm5sU7CSbYYAgkt2ZPhDz+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.10", - "@vue/shared": "3.5.10" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/devtools-core": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.4.4.tgz", - "integrity": "sha512-DLxgA3DfeADkRzhAfm3G2Rw/cWxub64SdP5b+s5dwL30+whOGj+QNhmyFpwZ8ZTrHDFRIPj0RqNzJ8IRR1pz7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.4.4", - "@vue/devtools-shared": "^7.4.4", - "mitt": "^3.0.1", - "nanoid": "^3.3.4", - "pathe": "^1.1.2", - "vite-hot-client": "^0.2.3" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.4.4.tgz", - "integrity": "sha512-awK/4NfsUG0nQ7qnTM37m7ZkEUMREyPh8taFCX+uQYps/MTFEum0AD05VeGDRMXwWvMmGIcWX9xp8ZiBddY0jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.4.4", - "birpc": "^0.2.17", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.1" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.4.6.tgz", - "integrity": "sha512-rPeSBzElnHYMB05Cc056BQiJpgocQjY8XVulgni+O9a9Gr9tNXgPteSzFFD+fT/iWMxNuUgGKs9CuW5DZewfIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/language-core": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.27.tgz", - "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~1.11.1", - "@volar/source-map": "~1.11.1", - "@vue/compiler-dom": "^3.3.0", - "@vue/shared": "^3.3.0", - "computeds": "^0.0.1", - "minimatch": "^9.0.3", - "muggle-string": "^0.3.1", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/node_modules/@volar/language-core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.11.1.tgz", - "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "1.11.1" - } - }, - "node_modules/@vue/language-core/node_modules/@volar/source-map": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.11.1.tgz", - "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "muggle-string": "^0.3.1" - } - }, - "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vue/language-core/node_modules/muggle-string": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", - "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/reactivity": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.10.tgz", - "integrity": "sha512-kW08v06F6xPSHhid9DJ9YjOGmwNDOsJJQk0ax21wKaUYzzuJGEuoKNU2Ujux8FLMrP7CFJJKsHhXN9l2WOVi2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.10" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.10.tgz", - "integrity": "sha512-9Q86I5Qq3swSkFfzrZ+iqEy7Vla325M7S7xc1NwKnRm/qoi1Dauz0rT6mTMmscqx4qz0EDJ1wjB+A36k7rl8mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.10", - "@vue/shared": "3.5.10" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.10.tgz", - "integrity": "sha512-t3x7ht5qF8ZRi1H4fZqFzyY2j+GTMTDxRheT+i8M9Ph0oepUxoadmbwlFwMoW7RYCpNQLpP2Yx3feKs+fyBdpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.10", - "@vue/runtime-core": "3.5.10", - "@vue/shared": "3.5.10", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.10.tgz", - "integrity": "sha512-IVE97tt2kGKwHNq9yVO0xdh1IvYfZCShvDSy46JIh5OQxP1/EXSpoDqetVmyIzL7CYOWnnmMkVqd7YK2QSWkdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.10", - "@vue/shared": "3.5.10" - }, - "peerDependencies": { - "vue": "3.5.10" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.10.tgz", - "integrity": "sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/head": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@vueuse/head/-/head-2.0.0.tgz", - "integrity": "sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unhead/dom": "^1.7.0", - "@unhead/schema": "^1.7.0", - "@unhead/ssr": "^1.7.0", - "@unhead/vue": "^1.7.0" - }, - "peerDependencies": { - "vue": ">=2.7 || >=3" - } - }, - "node_modules/@vueuse/integrations": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.11.1.tgz", - "integrity": "sha512-Y5hCGBguN+vuVYTZmdd/IMXLOdfS60zAmDmFYc4BKBcMUPZH1n4tdyDECCPjXm0bNT3ZRUy1xzTLGaUje8Xyaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vueuse/core": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^4", - "drauu": "^0.3", - "focus-trap": "^7", - "fuse.js": "^6", - "idb-keyval": "^6", - "jwt-decode": "^3", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^6" - }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } - } - }, - "node_modules/@vueuse/integrations/node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/integrations/node_modules/@vueuse/core": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", - "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations/node_modules/@vueuse/metadata": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", - "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations/node_modules/@vueuse/shared": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", - "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/nuxt": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-10.11.1.tgz", - "integrity": "sha512-UiaYSIwOkmUVn8Gl1AqtLWYR12flO+8sEu9X0Y1fNjSR7EWy9jMuiCvOGqwtoeTsqfHrivl0d5HfMzr11GFnMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.12.1", - "@vueuse/core": "10.11.1", - "@vueuse/metadata": "10.11.1", - "local-pkg": "^0.5.0", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "nuxt": "^3.0.0" - } - }, - "node_modules/@vueuse/nuxt/node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vueuse/nuxt/node_modules/@vueuse/core": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", - "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/nuxt/node_modules/@vueuse/metadata": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", - "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/nuxt/node_modules/@vueuse/shared": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", - "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", - "dev": true, - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/nuxt/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/as-table": { - "version": "1.0.55", - "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "printable-characters": "^1.0.42" - } - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/ast-kit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-1.2.1.tgz", - "integrity": "sha512-h31wotR7rkFLrlmGPn0kGqOZ/n5EQFvp7dBs400chpHDhHc8BK3gpvyHDluRujuGgeoTAv3dSIMz9BI3JxAWyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.6", - "pathe": "^1.1.2" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ast-walker-scope": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.6.2.tgz", - "integrity": "sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "ast-kit": "^1.0.1" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "dev": true, - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws4fetch": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/aws4fetch/-/aws4fetch-1.0.20.tgz", - "integrity": "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==", - "license": "MIT" - }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bin-links": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", - "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", - "dev": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/birpc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", - "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/blake3-wasm": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", - "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", - "dev": true, - "license": "MIT" - }, - "node_modules/body-scroll-lock-upgrade": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/body-scroll-lock-upgrade/-/body-scroll-lock-upgrade-1.1.0.tgz", - "integrity": "sha512-nnfVAS+tB7CS9RaksuHVTpgHWHF7fE/ptIBJnwZrMqImIvWJF1OGcLnMpBhC6qhkx9oelvyxmWXwmIJXCV98Sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "license": "MIT" - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c12": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/c12/-/c12-1.11.2.tgz", - "integrity": "sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.6.0", - "confbox": "^0.1.7", - "defu": "^6.1.4", - "dotenv": "^16.4.5", - "giget": "^1.2.3", - "jiti": "^1.21.6", - "mlly": "^1.7.1", - "ohash": "^1.1.3", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.4" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001664", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", - "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", - "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" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/capnp-ts": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", - "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.1", - "tslib": "^2.2.0" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "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/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/changelogen": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/changelogen/-/changelogen-0.5.7.tgz", - "integrity": "sha512-cTZXBcJMl3pudE40WENOakXkcVtrbBpbkmSkM20NdRiUqa4+VYRdXdEsgQ0BNQ6JBE2YymTNWtPKVF7UCTN5+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "c12": "^1.11.2", - "colorette": "^2.0.20", - "consola": "^3.2.3", - "convert-gitmoji": "^0.1.5", - "mri": "^1.2.0", - "node-fetch-native": "^1.6.4", - "ofetch": "^1.3.4", - "open": "^10.1.0", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "scule": "^1.3.0", - "semver": "^7.6.3", - "std-env": "^3.7.0", - "yaml": "^2.5.1" - }, - "bin": { - "changelogen": "dist/cli.mjs" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chroma-js": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.6.0.tgz", - "integrity": "sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A==", - "dev": true, - "license": "(BSD-3-Clause AND Apache-2.0)" - }, - "node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/clear": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", - "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/clipboardy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", - "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^8.0.1", - "is-wsl": "^3.1.0", - "is64bit": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/clipboardy/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/clipboardy/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/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, - "license": "MIT" - }, - "node_modules/cliui/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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/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, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cmd-shim": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", - "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "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, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true, - "license": "ISC" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/compatx": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.1.8.tgz", - "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==", - "dev": true, - "license": "MIT" - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/compress-commons/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "node_modules/convert-gitmoji": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/convert-gitmoji/-/convert-gitmoji-0.1.5.tgz", - "integrity": "sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-es": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3" - }, - "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, - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/croner": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/croner/-/croner-8.1.2.tgz", - "integrity": "sha512-ypfPFcAXHuAZRCzo3vJL6ltENzniTjwe/qsLleH1V2/7SRDjgvRQyrLmumFTLmjFax4IuSxfGXEn79fozXcJog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0" - } - }, - "node_modules/cronstrue": { - "version": "2.50.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.50.0.tgz", - "integrity": "sha512-ULYhWIonJzlScCCQrPUG5uMXzXxSixty4djud9SS37DoNxDdkeRocxzHuAo4ImRBUK+mAuU5X9TSwEDccnnuPg==", - "dev": true, - "license": "MIT", - "bin": { - "cronstrue": "bin/cli.js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/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, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crossws": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.2.4.tgz", - "integrity": "sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "uWebSockets.js": "*" - }, - "peerDependenciesMeta": { - "uWebSockets.js": { - "optional": true - } - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", - "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^7.0.6", - "lilconfig": "^3.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", - "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.0", - "postcss-calc": "^10.0.2", - "postcss-colormin": "^7.0.2", - "postcss-convert-values": "^7.0.4", - "postcss-discard-comments": "^7.0.3", - "postcss-discard-duplicates": "^7.0.1", - "postcss-discard-empty": "^7.0.0", - "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.4", - "postcss-merge-rules": "^7.0.4", - "postcss-minify-font-values": "^7.0.0", - "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.2", - "postcss-minify-selectors": "^7.0.4", - "postcss-normalize-charset": "^7.0.0", - "postcss-normalize-display-values": "^7.0.0", - "postcss-normalize-positions": "^7.0.0", - "postcss-normalize-repeat-style": "^7.0.0", - "postcss-normalize-string": "^7.0.0", - "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.2", - "postcss-normalize-url": "^7.0.0", - "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.1", - "postcss-reduce-initial": "^7.0.2", - "postcss-reduce-transforms": "^7.0.0", - "postcss-svgo": "^7.0.1", - "postcss-unique-selectors": "^7.0.3" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true, - "license": "MIT" - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/db0": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/db0/-/db0-0.1.4.tgz", - "integrity": "sha512-Ft6eCwONYxlwLjBXSJxw0t0RYtA5gW9mq8JfBXn9TtC0nDPlqePAhpv9v4g9aONBi6JI1OXHTKKkUYGd+BOrCA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@libsql/client": "^0.5.2", - "better-sqlite3": "^9.4.3", - "drizzle-orm": "^0.29.4" - }, - "peerDependenciesMeta": { - "@libsql/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "drizzle-orm": { - "optional": true - } - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-formdata": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/decode-formdata/-/decode-formdata-0.8.0.tgz", - "integrity": "sha512-iUzDgnWsw5ToSkFY7VPFA5Gfph6ROoOxOB7Ybna4miUSzLZ4KaSJk6IAB2AdW6+C9vCVWhjjNA4gjT6wF3eZHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", - "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detab": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/detab/-/detab-3.0.2.tgz", - "integrity": "sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/detect-indent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", - "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-newline": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", - "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "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, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/docus-starter": { - "resolved": "apps/docs", - "link": true - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-8.0.2.tgz", - "integrity": "sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.29", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", - "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "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, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.1.tgz", - "integrity": "sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser-es": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", - "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/errx": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz", - "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "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/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", - "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.1", - "@eslint/plugin-kit": "^0.2.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.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", - "is-path-inside": "^3.0.3", - "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", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "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-config-flat-gitignore": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-0.3.0.tgz", - "integrity": "sha512-0Ndxo4qGhcewjTzw52TK06Mc00aDtHNTdeeW2JfONgDcLkRO/n/BteMRzNVpLQYxdCC/dFEilfM9fjjpGIJ9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint/compat": "^1.1.1", - "find-up-simple": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "eslint": "^9.5.0" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-turbo": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-2.1.2.tgz", - "integrity": "sha512-UCNwxBrTOx0K41h1OrwMg7vPdGvcGSAlj40ZzpuUi0S2Muac2UOs+6F2dMYQiKg7lX2HAtyHXlF0T2wlWNHjGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-plugin-turbo": "2.1.2" - }, - "peerDependencies": { - "eslint": ">6.6.0" - } - }, - "node_modules/eslint-flat-config-utils": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-0.4.0.tgz", - "integrity": "sha512-kfd5kQZC+BMO0YwTol6zxjKX1zAsk8JfSAopbKjKqmENTJcew+yBejuvccAg37cvOrN0Mh+DVbeyznuNWEjt4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "engines": { - "node": ">=6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-plugin-import-x": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.3.0.tgz", - "integrity": "sha512-PxGzP7gAjF2DLeRnQtbYkkgZDg1intFyYr/XS1LgTYXUDrSXMHGkXx8++6i2eDv2jMs0jfeO6G6ykyeWxiFX7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.1.0", - "debug": "^4.3.4", - "doctrine": "^3.0.0", - "eslint-import-resolver-node": "^0.3.9", - "get-tsconfig": "^4.7.3", - "is-glob": "^4.0.3", - "minimatch": "^9.0.3", - "semver": "^7.6.3", - "stable-hash": "^0.0.4", - "tslib": "^2.6.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/eslint-plugin-import-x/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint-plugin-jsdoc": { - "version": "50.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.3.0.tgz", - "integrity": "sha512-P7qDB/RckdKETpBM4CtjHRQ5qXByPmFhRi86sN3E+J+tySchq+RSOGGhI2hDIefmmKFuTi/1ACjqsnDJDDDfzg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@es-joy/jsdoccomment": "~0.48.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.6", - "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", - "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "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-plugin-jsdoc/node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-only-warn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.1.0.tgz", - "integrity": "sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz", - "integrity": "sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-regexp": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.6.0.tgz", - "integrity": "sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.9.1", - "comment-parser": "^1.4.0", - "jsdoc-type-pratt-parser": "^4.0.0", - "refa": "^0.12.1", - "regexp-ast-analysis": "^0.7.1", - "scslre": "^0.3.0" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "eslint": ">=8.44.0" - } - }, - "node_modules/eslint-plugin-tsdoc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", - "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "0.16.2" - } - }, - "node_modules/eslint-plugin-turbo": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-2.1.2.tgz", - "integrity": "sha512-q2ikGubfVLZDPEKliiuubZc3sI5oqbKIZJ6fRi6Bldv8E3cMNH3Qt7g6hXZV4+GxwQbzEEteCYSBNbOn1DBqRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dotenv": "16.0.3" - }, - "peerDependencies": { - "eslint": ">6.6.0" - } - }, - "node_modules/eslint-plugin-turbo/node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/eslint-plugin-unicorn": { - "version": "55.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz", - "integrity": "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^4.0.0", - "clean-regexp": "^1.0.0", - "core-js-compat": "^3.37.0", - "esquery": "^1.5.0", - "globals": "^15.7.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.6.1", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=18.18" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.56.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz", - "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.3", - "vue-eslint-parser": "^9.4.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "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/node_modules/@eslint/js": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", - "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", - "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/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "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/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/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, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eslint/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, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/eslint/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/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "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.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/externality": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz", - "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "enhanced-resolve": "^5.14.1", - "mlly": "^1.3.0", - "pathe": "^1.1.1", - "ufo": "^1.1.2" - } - }, - "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, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "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, - "license": "MIT" - }, - "node_modules/fast-npm-meta": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-0.2.2.tgz", - "integrity": "sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", - "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-6.0.1.tgz", - "integrity": "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, - "node_modules/focus-trap": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz", - "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framer-motion": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.9.0.tgz", - "integrity": "sha512-nCfGxvsQecVLjjYDu35G2F5ls+ArE3FBfhxV0RSiisMaUKqteq5DMBFNRKwMyVj+VqKTNhawt+BV480YCHKFlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "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, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuse.js": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/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, - "license": "MIT" - }, - "node_modules/gauge/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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "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, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port-please": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", - "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/get-source": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "data-uri-to-buffer": "^2.0.0", - "source-map": "^0.6.1" - } - }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/giget": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", - "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", - "dev": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.3", - "nypm": "^0.3.8", - "ohash": "^1.1.3", - "pathe": "^1.1.2", - "tar": "^6.2.0" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/git-config-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", - "integrity": "sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/git-hooks-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.1.0.tgz", - "integrity": "sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/fisker/git-hooks-list?sponsor=1" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.1.0.tgz", - "integrity": "sha512-8xg65dTxGHST3+zGpycMMFZcoTzAdZ2dOtu4vmgIfkTFnVHBxHMzBC2L1k8To7EmrSiHesT8JgPLT91VKw1B5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "dev": true, - "license": "ISC" - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-directory/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, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/google-protobuf": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz", - "integrity": "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==", - "dev": true, - "license": "(BSD-3-Clause AND Apache-2.0)" - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/gzip-size": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", - "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/h3": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.12.0.tgz", - "integrity": "sha512-Zi/CcNeWBXDrFNlV0hUBJQR9F7a96RjMeAZweW/ZWkR9fuXrMcvKnSA63f/zZ9l0GgQOZDVHGvXivNN9PWOwhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cookie-es": "^1.1.0", - "crossws": "^0.2.4", - "defu": "^6.1.4", - "destr": "^2.0.3", - "iron-webcrypto": "^1.1.1", - "ohash": "^1.1.3", - "radix3": "^1.1.2", - "ufo": "^1.5.3", - "uncrypto": "^0.1.3", - "unenv": "^1.9.0" - } - }, - "node_modules/h3/node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true, - "license": "MIT" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-heading-rank": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", - "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", - "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", - "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.4" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-string": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", - "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/hono": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.6.3.tgz", - "integrity": "sha512-0LeEuBNFeSHGqZ9sNVVgZjB1V5fmhkBSB0hZrpqStSMLOWgfLy0dHOvrjbJh0H2khsjet6rbHfWTHY0kpYThKQ==", - "license": "MIT", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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, - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-shutdown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", - "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/httpxy": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.5.tgz", - "integrity": "sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": 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" - } - ], - "license": "BSD-3-Clause" - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/image-meta": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.1.tgz", - "integrity": "sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/imagetools-core": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/imagetools-core/-/imagetools-core-7.0.1.tgz", - "integrity": "sha512-XDUx3Ac1VrZ4XF5eAJNYdHbFXRPNyebHFrwJsZ4WHb7X2MitOVW23cFphSDByT3MH5rdWdxKr4edSW2agChvDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-in-the-middle": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.1.tgz", - "integrity": "sha512-lGdg70ECFGv/OHQXL/IPhcxkFPeQ7YA4zborlA54XHVr58oM50QNxItRiayHMqj1MspC5Y9zaHf+QHod/gq7Ug==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/impound": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/impound/-/impound-0.1.0.tgz", - "integrity": "sha512-F9nJgOsDc3tysjN74edE0vGPEQrU7DAje6g5nNAL5Jc9Tv4JW3mH7XMGne+EaadTniDXLeUrVR21opkNfWO1zQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "mlly": "^1.7.1", - "pathe": "^1.1.2", - "unenv": "^1.10.0", - "unplugin": "^1.12.2" - } - }, - "node_modules/impound/node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "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, - "license": "ISC" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ioredis": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/iron-webcrypto": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/brc-dd" - } - }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-bun-module": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", - "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.6.3" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "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, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is64bit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", - "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "system-architecture": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jose": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.3.tgz", - "integrity": "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "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, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/just-diff": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", - "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", - "dev": true, - "license": "MIT" - }, - "node_modules/just-diff-apply": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", - "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/knitwork": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.1.0.tgz", - "integrity": "sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==", - "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, - "license": "MIT" - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "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, - "license": "MIT" - }, - "node_modules/listhen": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.8.0.tgz", - "integrity": "sha512-Wj5hk++HPDqnG/0nc9++oXf8M3GlzObC6AJJJ9VYAVhVTdeW+t3HyeiKhK6Ro0GPhVd8lOYM75zsckrtzLB2Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@parcel/watcher": "^2.4.1", - "@parcel/watcher-wasm": "^2.4.1", - "citty": "^0.1.6", - "clipboardy": "^4.0.0", - "consola": "^3.2.3", - "crossws": "^0.2.4", - "defu": "^6.1.4", - "get-port-please": "^3.1.2", - "h3": "^1.12.0", - "http-shutdown": "^1.2.2", - "jiti": "^2.0.0", - "mlly": "^1.7.1", - "node-forge": "^1.3.1", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "ufo": "^1.5.4", - "untun": "^0.1.3", - "uqr": "^0.1.2" - }, - "bin": { - "listen": "bin/listhen.mjs", - "listhen": "bin/listhen.mjs" - } - }, - "node_modules/listhen/node_modules/jiti": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.0.0.tgz", - "integrity": "sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magic-string-ast": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.6.2.tgz", - "integrity": "sha512-oN3Bcd7ZVt+0VGEs7402qR/tjgjbM7kPlH/z7ufJnzTLVBzXJITRHOJiwMmmYMgZfdoWQsfQcY+iKlxiBppnMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.10" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", - "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", - "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" - }, - "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/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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.1", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", - "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.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, - "license": "MIT", - "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, - "license": "MIT", - "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-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "dev": true, - "license": "MIT", - "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-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", - "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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-mdx-expression": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", - "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", - "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "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.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/miniflare": { - "version": "3.20240925.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240925.0.tgz", - "integrity": "sha512-2LmQbKHf0n6ertUKhT+Iltixi53giqDH7P71+wCir3OnGyXIODqYwOECx1mSDNhYThpxM2dav8UdPn6SQiMoXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "acorn": "^8.8.0", - "acorn-walk": "^8.2.0", - "capnp-ts": "^0.7.0", - "exit-hook": "^2.2.1", - "glob-to-regexp": "^0.4.1", - "stoppable": "^1.1.0", - "undici": "^5.28.4", - "workerd": "1.20240925.0", - "ws": "^8.17.1", - "youch": "^3.2.2", - "zod": "^3.22.3" - }, - "bin": { - "miniflare": "bootstrap.js" - }, - "engines": { - "node": ">=16.13" - } - }, - "node_modules/miniflare/node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "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, - "license": "ISC", - "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, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minisearch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.0.tgz", - "integrity": "sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==", - "dev": true, - "license": "MIT" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdist": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/mkdist/-/mkdist-1.5.9.tgz", - "integrity": "sha512-PdJimzhcgDxaHpk1SUabw56gT3BU15vBHUTHkeeus8Kl7jUkpgG7+z0PiS/y23XXgO8TiU/dKP3L1oG55qrP1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.20", - "citty": "^0.1.6", - "cssnano": "^7.0.6", - "defu": "^6.1.4", - "esbuild": "^0.23.1", - "fast-glob": "^3.3.2", - "jiti": "^1.21.6", - "mlly": "^1.7.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "postcss": "^8.4.45", - "postcss-nested": "^6.2.0", - "semver": "^7.6.3" - }, - "bin": { - "mkdist": "dist/cli.cjs" - }, - "peerDependencies": { - "sass": "^1.78.0", - "typescript": ">=5.5.4", - "vue-tsc": "^1.8.27 || ^2.0.21" - }, - "peerDependenciesMeta": { - "sass": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/mkdist/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/mkdist/node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==", - "dev": true, - "license": "MIT" - }, - "node_modules/mp4box": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/mp4box/-/mp4box-0.5.2.tgz", - "integrity": "sha512-zRmGlvxy+YdW3Dmt+TR4xPHynbxwXtAQDTN/Fo9N3LMxaUlB2C5KmZpzYyGKy4c7k4Jf3RCR0A2pm9SZELOLXw==", - "license": "BSD-3-Clause" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "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, - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz", - "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true, - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanotar": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.1.1.tgz", - "integrity": "sha512-AiJsGsSF3O0havL1BydvI4+wR76sKT+okKRwWIaK96cZUnXqH0uNBOsHlbwZq3+m2BR1VKqHDVudl3gO4mYjpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nitropack": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.9.7.tgz", - "integrity": "sha512-aKXvtNrWkOCMsQbsk4A0qQdBjrJ1ZcvwlTQevI/LAgLWLYc5L7Q/YiYxGLal4ITyNSlzir1Cm1D2ZxnYhmpMEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cloudflare/kv-asset-handler": "^0.3.4", - "@netlify/functions": "^2.8.0", - "@rollup/plugin-alias": "^5.1.0", - "@rollup/plugin-commonjs": "^25.0.8", - "@rollup/plugin-inject": "^5.0.5", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.7", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/pluginutils": "^5.1.0", - "@types/http-proxy": "^1.17.14", - "@vercel/nft": "^0.26.5", - "archiver": "^7.0.1", - "c12": "^1.11.1", - "chalk": "^5.3.0", - "chokidar": "^3.6.0", - "citty": "^0.1.6", - "consola": "^3.2.3", - "cookie-es": "^1.1.0", - "croner": "^8.0.2", - "crossws": "^0.2.4", - "db0": "^0.1.4", - "defu": "^6.1.4", - "destr": "^2.0.3", - "dot-prop": "^8.0.2", - "esbuild": "^0.20.2", - "escape-string-regexp": "^5.0.0", - "etag": "^1.8.1", - "fs-extra": "^11.2.0", - "globby": "^14.0.1", - "gzip-size": "^7.0.0", - "h3": "^1.12.0", - "hookable": "^5.5.3", - "httpxy": "^0.1.5", - "ioredis": "^5.4.1", - "jiti": "^1.21.6", - "klona": "^2.0.6", - "knitwork": "^1.1.0", - "listhen": "^1.7.2", - "magic-string": "^0.30.10", - "mime": "^4.0.3", - "mlly": "^1.7.1", - "mri": "^1.2.0", - "node-fetch-native": "^1.6.4", - "ofetch": "^1.3.4", - "ohash": "^1.1.3", - "openapi-typescript": "^6.7.6", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.1.1", - "pretty-bytes": "^6.1.1", - "radix3": "^1.1.2", - "rollup": "^4.18.0", - "rollup-plugin-visualizer": "^5.12.0", - "scule": "^1.3.0", - "semver": "^7.6.2", - "serve-placeholder": "^2.0.2", - "serve-static": "^1.15.0", - "std-env": "^3.7.0", - "ufo": "^1.5.3", - "uncrypto": "^0.1.3", - "unctx": "^2.3.1", - "unenv": "^1.9.0", - "unimport": "^3.7.2", - "unstorage": "^1.10.2", - "unwasm": "^0.3.9" - }, - "bin": { - "nitro": "dist/cli/index.mjs", - "nitropack": "dist/cli/index.mjs" - }, - "engines": { - "node": "^16.11.0 || >=17.0.0" - }, - "peerDependencies": { - "xml2js": "^0.6.2" - }, - "peerDependenciesMeta": { - "xml2js": { - "optional": true - } - } - }, - "node_modules/nitropack/node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/nitropack/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/nitropack/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/nitropack/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nitropack/node_modules/mime": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz", - "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa" - ], - "license": "MIT", - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/nitropack/node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" - } - }, - "node_modules/nitropack/node_modules/unenv/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", - "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", - "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", - "dev": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "dev": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", - "dev": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nuxi": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/nuxi/-/nuxi-3.14.0.tgz", - "integrity": "sha512-MhG4QR6D95jQxhnwKfdKXulZ8Yqy1nbpwbotbxY5IcabOzpEeTB8hYn2BFkmYdMUB0no81qpv2ldZmVCT9UsnQ==", - "dev": true, - "license": "MIT", - "bin": { - "nuxi": "bin/nuxi.mjs", - "nuxi-ng": "bin/nuxi.mjs", - "nuxt": "bin/nuxi.mjs", - "nuxt-cli": "bin/nuxi.mjs" - }, - "engines": { - "node": "^16.10.0 || >=18.0.0" - } - }, - "node_modules/nuxt": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.13.2.tgz", - "integrity": "sha512-Bjc2qRsipfBhjXsBEJCN+EUAukhdgFv/KoIR5HFB2hZOYRSqXBod3oWQs78k3ja1nlIhAEdBG533898KJxUtJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/devalue": "^2.0.2", - "@nuxt/devtools": "^1.4.2", - "@nuxt/kit": "3.13.2", - "@nuxt/schema": "3.13.2", - "@nuxt/telemetry": "^2.6.0", - "@nuxt/vite-builder": "3.13.2", - "@unhead/dom": "^1.11.5", - "@unhead/shared": "^1.11.5", - "@unhead/ssr": "^1.11.5", - "@unhead/vue": "^1.11.5", - "@vue/shared": "^3.5.5", - "acorn": "8.12.1", - "c12": "^1.11.2", - "chokidar": "^3.6.0", - "compatx": "^0.1.8", - "consola": "^3.2.3", - "cookie-es": "^1.2.2", - "defu": "^6.1.4", - "destr": "^2.0.3", - "devalue": "^5.0.0", - "errx": "^0.1.0", - "esbuild": "^0.23.1", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "globby": "^14.0.2", - "h3": "^1.12.0", - "hookable": "^5.5.3", - "ignore": "^5.3.2", - "impound": "^0.1.0", - "jiti": "^1.21.6", - "klona": "^2.0.6", - "knitwork": "^1.1.0", - "magic-string": "^0.30.11", - "mlly": "^1.7.1", - "nanotar": "^0.1.1", - "nitropack": "^2.9.7", - "nuxi": "^3.13.2", - "nypm": "^0.3.11", - "ofetch": "^1.3.4", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.0", - "radix3": "^1.1.2", - "scule": "^1.3.0", - "semver": "^7.6.3", - "std-env": "^3.7.0", - "strip-literal": "^2.1.0", - "tinyglobby": "0.2.6", - "ufo": "^1.5.4", - "ultrahtml": "^1.5.3", - "uncrypto": "^0.1.3", - "unctx": "^2.3.1", - "unenv": "^1.10.0", - "unhead": "^1.11.5", - "unimport": "^3.12.0", - "unplugin": "^1.14.1", - "unplugin-vue-router": "^0.10.8", - "unstorage": "^1.12.0", - "untyped": "^1.4.2", - "vue": "^3.5.5", - "vue-bundle-renderer": "^2.1.0", - "vue-devtools-stub": "^0.1.0", - "vue-router": "^4.4.5" - }, - "bin": { - "nuxi": "bin/nuxt.mjs", - "nuxt": "bin/nuxt.mjs" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - }, - "peerDependencies": { - "@parcel/watcher": "^2.1.0", - "@types/node": "^14.18.0 || >=16.10.0" - }, - "peerDependenciesMeta": { - "@parcel/watcher": { - "optional": true - }, - "@types/node": { - "optional": true - } - } - }, - "node_modules/nuxt-component-meta": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/nuxt-component-meta/-/nuxt-component-meta-0.6.6.tgz", - "integrity": "sha512-Y5/tuZuZOlD4GluAjcTU6JlhtEeg7/92VEfoV814t2uTuZK+b9RokJeGtrMotXuCJ4vuT1Is7M+pkPm+vY/tXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.9.1", - "citty": "^0.1.5", - "scule": "^1.1.1", - "typescript": "^5.3.3", - "vue-component-meta": "^1.8.27" - }, - "bin": { - "nuxt-component-meta": "bin/nuxt-component-meta.mjs" - } - }, - "node_modules/nuxt-config-schema": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/nuxt-config-schema/-/nuxt-config-schema-0.4.6.tgz", - "integrity": "sha512-kHLWJFynj5QrxVZ1MjY2xmDaTSN1BCMLGExA+hMMLoCb3wn9TJlDVqnE/nSdUJPMRkNn/NQ5WP9NLA9vlAXRUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.4.2", - "defu": "^6.1.2", - "jiti": "^1.18.2", - "pathe": "^1.0.0", - "untyped": "^1.3.2" - } - }, - "node_modules/nuxt-icon": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/nuxt-icon/-/nuxt-icon-0.3.3.tgz", - "integrity": "sha512-KdhJAigBGTP8/YIFZ3orwetk40AgLq6VQ5HRYuDLmv5hiDptor9Ro+WIdZggHw7nciRxZvDdQkEwi9B5G/jrkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@iconify/vue": "^4.1.0", - "@nuxt/kit": "^3.3.1", - "nuxt-config-schema": "^0.4.5" - } - }, - "node_modules/nuxt/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/nuxt/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nuxt/node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" - } - }, - "node_modules/nypm": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.12.tgz", - "integrity": "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "execa": "^8.0.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "ufo": "^1.5.4" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/nypm/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/nypm/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nypm/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/nypm/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ofetch": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.0.tgz", - "integrity": "sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "destr": "^2.0.3", - "node-fetch-native": "^1.6.4", - "ufo": "^1.5.4" - } - }, - "node_modules/ohash": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz", - "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/oidc-token-hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", - "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", - "license": "MIT", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/oniguruma-to-js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", - "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "regex": "^4.3.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openapi-typescript": { - "version": "6.7.6", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-6.7.6.tgz", - "integrity": "sha512-c/hfooPx+RBIOPM09GSxABOZhYPblDoyaGhqBkD/59vtpN21jEuWKDlM0KYTvqJVlSYjKs0tBcIdeXKChlSPtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.3", - "fast-glob": "^3.3.2", - "js-yaml": "^4.1.0", - "supports-color": "^9.4.0", - "undici": "^5.28.4", - "yargs-parser": "^21.1.1" - }, - "bin": { - "openapi-typescript": "bin/cli.js" - } - }, - "node_modules/openapi-typescript/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/openapi-typescript/node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/openid-client": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz", - "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==", - "license": "MIT", - "dependencies": { - "jose": "^4.15.4", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/openid-client/node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/openid-client/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==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/package-manager-detector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.0.tgz", - "integrity": "sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==", - "dev": true, - "license": "MIT" - }, - "node_modules/pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/paneer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/paneer/-/paneer-0.1.0.tgz", - "integrity": "sha512-SZfJe/y9fbpeXZU+Kf7cSG2G7rnGP50hUYzCvcWyhp7hYzA3YXGthpkGfv6NSt0oo6QbcRyKwycg/6dpG5p8aw==", - "deprecated": "Please migrate to https://github.com/unjs/magicast", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.15", - "@types/estree": "^1.0.0", - "recast": "^0.22.0" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-conflict-json": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", - "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, - "node_modules/parse-git-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz", - "integrity": "sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "git-config-path": "^2.0.0", - "ini": "^1.3.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parse-git-config/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, - "license": "ISC" - }, - "node_modules/parse-imports": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", - "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", - "dev": true, - "license": "Apache-2.0 AND MIT", - "dependencies": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" - }, - "engines": { - "node": ">= 18" - } - }, - "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, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/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, - "license": "MIT" - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "license": "MIT", - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "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, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/periscopic/node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "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": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinceau": { - "version": "0.18.9", - "resolved": "https://registry.npmjs.org/pinceau/-/pinceau-0.18.9.tgz", - "integrity": "sha512-GJ+l8a5Y+7PP/diwuajJhd2QONTIFkk2YXjrVTh7QKC3sMQEphpLH6ZJfXSeeSonQ0/BnhrrMi9a5e14mmqXug==", - "dev": true, - "license": "MIT", - "workspaces": [ - "docs", - "playground" - ], - "dependencies": { - "@unocss/reset": "^0.50.3", - "@volar/vue-language-core": "^1.2.0", - "acorn": "^8.8.2", - "chroma-js": "^2.4.2", - "consola": "^3.0.1", - "csstype": "^3.1.1", - "defu": "^6.1.2", - "magic-string": "^0.30.0", - "nanoid": "^4.0.1", - "ohash": "^1.0.0", - "paneer": "^0.1.0", - "pathe": "^1.1.0", - "postcss-custom-properties": "13.1.4", - "postcss-dark-theme-class": "0.7.3", - "postcss-nested": "^6.0.1", - "recast": "^0.22.0", - "scule": "^1.0.0", - "style-dictionary-esm": "^1.3.7", - "unbuild": "^1.1.2", - "unplugin": "^1.1.0" - } - }, - "node_modules/pinceau/node_modules/nanoid": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", - "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "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.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", - "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12 || ^20.9 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.38" - } - }, - "node_modules/postcss-colormin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", - "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", - "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-custom-properties": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.1.4.tgz", - "integrity": "sha512-iSAdaZrM3KMec8cOSzeTUNXPYDlhqsMJHpt62yrjwG6nAnMtRHPk5JdMzGosBJtqEahDolvD5LNbcq+EZ78o5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.0", - "@csstools/css-parser-algorithms": "^2.0.0", - "@csstools/css-tokenizer": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dark-theme-class": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/postcss-dark-theme-class/-/postcss-dark-theme-class-0.7.3.tgz", - "integrity": "sha512-M9vtfh8ORzQsVdT9BWb+xpEDAzC7nHBn7wVc988/JkEVLPupKcUnV0jw7RZ8sSj0ovpqN1POf6PLdt19JCHfhQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-discard-comments": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", - "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", - "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", - "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", - "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-merge-longhand": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", - "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.4" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", - "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", - "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", - "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", - "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", - "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", - "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", - "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", - "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", - "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", - "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", - "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", - "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", - "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", - "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-ordered-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", - "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", - "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", - "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", - "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.3.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", - "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "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, - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/prettier-plugin-packagejson": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.2.tgz", - "integrity": "sha512-w+TmoLv2pIa+siplW1cCj2ujEXQQS6z7wmWLOiLQK/2QVl7Wy6xh/ZUpqQw8tbKMXDodmSW4GONxlA33xpdNOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sort-package-json": "2.10.1", - "synckit": "0.9.1" - }, - "peerDependencies": { - "prettier": ">= 1.16.0" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } - } - }, - "node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/printable-characters": { - "version": "1.0.42", - "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/proggy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", - "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", - "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", - "dev": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "dev": true, - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, - "license": "MIT", - "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/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" - } - ], - "license": "MIT" - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-wrap-balancer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/react-wrap-balancer/-/react-wrap-balancer-1.1.1.tgz", - "integrity": "sha512-AB+l7FPRWl6uZ28VcJ8skkwLn2+UC62bjiw8tQUrZPlEWDVnR9MG0lghyn7EyxuJSsFEpht4G+yh2WikEqQ/5Q==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0 || ^17.0.0 || ^18" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-cmd-shim": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/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, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/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, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/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, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/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/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/recast": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.22.0.tgz", - "integrity": "sha512-5AAx+mujtXijsEavc5lWXBPQqrM4+Dl5qNH96N2aNeuJFUzpiiToKPsxQD/zAIJHspz7zz0maX0PCtCTFVlixQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert": "^2.0.0", - "ast-types": "0.15.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dev": true, - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/refa": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", - "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.8.0" - }, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regex": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz", - "integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/regexp-ast-analysis": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", - "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.8.0", - "refa": "^0.12.1" - }, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true, - "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/rehype-external-links": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", - "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-is-element": "^3.0.0", - "is-absolute-url": "^4.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-slug": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", - "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "github-slugger": "^2.0.0", - "hast-util-heading-rank": "^3.0.0", - "hast-util-to-string": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-sort-attribute-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rehype-sort-attribute-values/-/rehype-sort-attribute-values-5.0.1.tgz", - "integrity": "sha512-lU3ABJO5frbUgV132YS6SL7EISf//irIm9KFMaeu5ixHfgWf6jhe+09Uf/Ef8pOYUJWKOaQJDRJGCXs6cNsdsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-sort-attributes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rehype-sort-attributes/-/rehype-sort-attributes-5.0.1.tgz", - "integrity": "sha512-Bxo+AKUIELcnnAZwJDt5zUDDRpt4uzhfz9d0PVGhcxYWsbFj5Cv35xuWxu5r1LeYNFNhgGqsr9Q2QiIOM/Qctg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.1.tgz", - "integrity": "sha512-QCqTSvcZ65Ym+P+VyBKd4JfJfh7icMl7cIOGVmPMzWkDtdD8pQ0nQG7yxGolVIiMzSx90EZ7SwNiVpYpfTxn7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.4", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.3", - "unified": "^11.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/remark-mdc/-/remark-mdc-3.2.1.tgz", - "integrity": "sha512-MLNqQE7ryygOA3TtH4hKmIvmjFAqTMzCs2zrMzXs4MWJXYM2vbtdwR2NfgcN3vxIp5Pllgq3oLGuKgQSs8J19w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.3", - "@types/unist": "^3.0.2", - "flat": "^6.0.1", - "js-yaml": "^4.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.1.0", - "micromark": "^4.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.1.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.1", - "scule": "^1.3.0", - "stringify-entities": "^4.0.3", - "unified": "^11.0.4", - "unist-util-visit": "^5.0.0", - "unist-util-visit-parents": "^6.0.1" - } - }, - "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", - "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-in-the-middle": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", - "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "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, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.22.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.5.tgz", - "integrity": "sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.5", - "@rollup/rollup-android-arm64": "4.22.5", - "@rollup/rollup-darwin-arm64": "4.22.5", - "@rollup/rollup-darwin-x64": "4.22.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.5", - "@rollup/rollup-linux-arm-musleabihf": "4.22.5", - "@rollup/rollup-linux-arm64-gnu": "4.22.5", - "@rollup/rollup-linux-arm64-musl": "4.22.5", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.5", - "@rollup/rollup-linux-riscv64-gnu": "4.22.5", - "@rollup/rollup-linux-s390x-gnu": "4.22.5", - "@rollup/rollup-linux-x64-gnu": "4.22.5", - "@rollup/rollup-linux-x64-musl": "4.22.5", - "@rollup/rollup-win32-arm64-msvc": "4.22.5", - "@rollup/rollup-win32-ia32-msvc": "4.22.5", - "@rollup/rollup-win32-x64-msvc": "4.22.5", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" - } - }, - "node_modules/rollup-plugin-inject/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup-plugin-inject/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rollup-plugin-inject": "^3.0.0" - } - }, - "node_modules/rollup-plugin-visualizer": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz", - "integrity": "sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "open": "^8.4.0", - "picomatch": "^2.3.1", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "rollup": "2.x || 3.x || 4.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/scslre": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", - "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.8.0", - "refa": "^0.12.0", - "regexp-ast-analysis": "^0.7.0" - }, - "engines": { - "node": "^14.0.0 || >=16.0.0" - } - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true, - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-placeholder": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", - "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/sharp/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shiki": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.21.0.tgz", - "integrity": "sha512-apCH5BoWTrmHDPGgg3RF8+HAAbEL/CdbYr8rMw7eIrdhCkZHdVGat5mMNlRtd1erNG01VPMIKHNQ0Pj2HMAiog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/core": "1.21.0", - "@shikijs/engine-javascript": "1.21.0", - "@shikijs/engine-oniguruma": "1.21.0", - "@shikijs/types": "1.21.0", - "@shikijs/vscode-textmate": "^9.2.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/simple-git": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", - "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/slashes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true, - "license": "ISC" - }, - "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true, - "license": "MIT" - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/socket.io-client": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.0.tgz", - "integrity": "sha512-C0jdhD5yQahMws9alf/yvtsMGTaIDBnZ8Rb5HU56svyq0l5LIrGzIDZZD5pHQlmzxLuU91Gz+VpQMKgCTNYtkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/sort-object-keys": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", - "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sort-package-json": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.10.1.tgz", - "integrity": "sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-indent": "^7.0.1", - "detect-newline": "^4.0.0", - "get-stdin": "^9.0.0", - "git-hooks-list": "^3.0.0", - "globby": "^13.1.2", - "is-plain-obj": "^4.1.0", - "semver": "^7.6.0", - "sort-object-keys": "^1.1.3" - }, - "bin": { - "sort-package-json": "cli.js" - } - }, - "node_modules/sort-package-json/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sort-package-json/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true, - "license": "MIT" - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sst": { - "version": "3.0.94", - "resolved": "https://registry.npmjs.org/sst/-/sst-3.0.94.tgz", - "integrity": "sha512-jlNCjdozAHoJJosth90tNkPRkJ2kEnoF3wEidkyYT862MEZeqzNoHy/m23iT9xuRPurj5rRxlDFxFw9tym1dRg==", - "dependencies": { - "@aws-sdk/client-lambda": "3.478.0", - "aws4fetch": "^1.0.18", - "jose": "5.2.3", - "openid-client": "5.6.4" - }, - "bin": { - "sst": "bin/sst.mjs" - }, - "optionalDependencies": { - "sst-darwin-arm64": "3.0.94", - "sst-darwin-x64": "3.0.94", - "sst-linux-arm64": "3.0.94", - "sst-linux-x64": "3.0.94", - "sst-linux-x86": "3.0.94" - }, - "peerDependencies": { - "hono": "4.x", - "valibot": "0.30.x" - }, - "peerDependenciesMeta": { - "hono": { - "optional": true - }, - "valibot": { - "optional": true - } - } - }, - "node_modules/sst-darwin-arm64": { - "version": "3.0.94", - "resolved": "https://registry.npmjs.org/sst-darwin-arm64/-/sst-darwin-arm64-3.0.94.tgz", - "integrity": "sha512-wEuhw5HuUiGFAX5QVo9dcDG6/7lXlUI7PGmc6h8kCYZ27AvrkdjxhLFFE7q55ly3uiHmvteGzN9cLrSdLemXHg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/sst-darwin-x64": { - "version": "3.0.94", - "resolved": "https://registry.npmjs.org/sst-darwin-x64/-/sst-darwin-x64-3.0.94.tgz", - "integrity": "sha512-2ij6Ocl8YCMgkbCrWXVdlP/ki71OGlbC9eh9O9TTZB+2ooz9O4uxI/HbGTALFz1diVxQrEWzk+70TWj+BhcCVw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/sst-linux-arm64": { - "version": "3.0.94", - "resolved": "https://registry.npmjs.org/sst-linux-arm64/-/sst-linux-arm64-3.0.94.tgz", - "integrity": "sha512-muEfHav98AVbKfRMpLxUJskheDUt08tGbSU3ftRZBlmsJ/tYX5nL51PRCO36gy0do0oNMR+TPJDO5f3Bczibhg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/sst-linux-x64": { - "version": "3.0.94", - "resolved": "https://registry.npmjs.org/sst-linux-x64/-/sst-linux-x64-3.0.94.tgz", - "integrity": "sha512-VdB94B0jvGxeXV3rDJbbI7/cQLpSJ8yADKFkR7uShlcsL+/z4uQeKCqTxu+wqOeKDgx9V8Ft3CQLcBM4c10fzQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/sst-linux-x86": { - "version": "3.0.94", - "resolved": "https://registry.npmjs.org/sst-linux-x86/-/sst-linux-x86-3.0.94.tgz", - "integrity": "sha512-1KEZI+XZgOlm4bJeBWEpfYXb9/9P/tVlEKncKINqL4wMnAduffZPjpmu/RWRkNoYkI0rEqOO/8Y0ZTeCrufMrA==", - "cpu": [ - "x86" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/stable-hash": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", - "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/stacktracey": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", - "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "as-table": "^1.0.36", - "get-source": "^2.0.12" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4", - "npm": ">=6" - } - }, - "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "license": "MIT" - }, - "node_modules/style-dictionary-esm": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/style-dictionary-esm/-/style-dictionary-esm-1.9.2.tgz", - "integrity": "sha512-MR+ppTqzkJJtXH6UyDJ0h4h4ekBCePA8A8xlYNuL0tLj2K+ngyuxoe0AvCHQ7sJVX8O5WK2z32ANSgIcF4mGxw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "chalk": "^5.3.0", - "change-case": "^4.1.2", - "commander": "^11.1.0", - "consola": "^3.2.3", - "fast-glob": "^3.3.2", - "glob": "^10.3.10", - "jiti": "^1.21.0", - "json5": "^2.2.3", - "jsonc-parser": "^3.2.0", - "lodash.template": "^4.5.0", - "tinycolor2": "^1.6.0" - }, - "bin": { - "style-dictionary": "bin/style-dictionary.js" - } - }, - "node_modules/style-dictionary-esm/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", - "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/superjson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", - "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "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-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, - "license": "MIT", - "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": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/system-architecture": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", - "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "dev": true, - "license": "MIT" - }, - "node_modules/tailwind-merge": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", - "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwind-variants": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.2.1.tgz", - "integrity": "sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tailwind-merge": "^2.2.0" - }, - "engines": { - "node": ">=16.x", - "pnpm": ">=7.x" - }, - "peerDependencies": { - "tailwindcss": "*" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", - "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/tailwindcss/node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/terser": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", - "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/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, - "license": "MIT" - }, - "node_modules/text-decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", - "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.6.tgz", - "integrity": "sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==", - "dev": true, - "license": "ISC", - "dependencies": { - "fdir": "^6.3.0", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/treeverse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsconfck": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz", - "integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/turbo": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.1.2.tgz", - "integrity": "sha512-Jb0rbU4iHEVQ18An/YfakdIv9rKnd3zUfSE117EngrfWXFHo3RndVH96US3GsT8VHpwTncPePDBT2t06PaFLrw==", - "dev": true, - "license": "MIT", - "bin": { - "turbo": "bin/turbo" - }, - "optionalDependencies": { - "turbo-darwin-64": "2.1.2", - "turbo-darwin-arm64": "2.1.2", - "turbo-linux-64": "2.1.2", - "turbo-linux-arm64": "2.1.2", - "turbo-windows-64": "2.1.2", - "turbo-windows-arm64": "2.1.2" - } - }, - "node_modules/turbo-darwin-64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.1.2.tgz", - "integrity": "sha512-3TEBxHWh99h2yIzkuIigMEOXt/ItYQp0aPiJjPd1xN4oDcsKK5AxiFKPH9pdtfIBzYsY59kQhZiFj0ELnSP7Bw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo-darwin-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.1.2.tgz", - "integrity": "sha512-he0miWNq2WxJzsH82jS2Z4MXpnkzn9SH8a79iPXiJkq25QREImucscM4RPasXm8wARp91pyysJMq6aasD45CeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/turbo-linux-64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.1.2.tgz", - "integrity": "sha512-fKUBcc0rK8Vdqv5a/E3CSpMBLG1bzwv+Q0Q83F8fG2ZfNCNKGbcEYABdonNZkkx141Rj03cZQFCgxu3MVEGU+A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-linux-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.1.2.tgz", - "integrity": "sha512-sV8Bpmm0WiuxgbhxymcC7wSsuxfBBieI98GegSwbr/bs1ANAgzCg93urIrdKdQ3/b31zZxQwcaP4FBF1wx1Qdg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-windows-64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.1.2.tgz", - "integrity": "sha512-wcmIJZI9ORT9ykHGliFE6kWRQrlH930QGSjSgWC8uFChFFuOyUlvC7ttcxuSvU9VqC7NF4C+GVAcFJQ8lTjN7g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/turbo-windows-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.1.2.tgz", - "integrity": "sha512-zdnXjrhk7YO6CP+Q5wPueEvOCLH4lDa6C4rrwiakcWcPgcQGbVozJlo4uaQ6awo8HLWQEvOwu84RkWTdLAc/Hw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "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, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ultrahtml": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", - "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==", - "dev": true, - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbuild": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/unbuild/-/unbuild-1.2.1.tgz", - "integrity": "sha512-J4efk69Aye43tWcBPCsLK7TIRppGrEN4pAlDzRKo3HSE6MgTSTBxSEuE3ccx7ixc62JvGQ/CoFXYqqF2AHozow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/plugin-alias": "^5.0.0", - "@rollup/plugin-commonjs": "^24.1.0", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.2", - "@rollup/plugin-replace": "^5.0.2", - "@rollup/pluginutils": "^5.0.2", - "chalk": "^5.2.0", - "consola": "^3.0.2", - "defu": "^6.1.2", - "esbuild": "^0.17.16", - "globby": "^13.1.4", - "hookable": "^5.5.3", - "jiti": "^1.18.2", - "magic-string": "^0.30.0", - "mkdist": "^1.2.0", - "mlly": "^1.2.0", - "mri": "^1.2.0", - "pathe": "^1.1.0", - "pkg-types": "^1.0.2", - "pretty-bytes": "^6.1.0", - "rollup": "^3.20.2", - "rollup-plugin-dts": "^5.3.0", - "scule": "^1.0.0", - "typescript": "^5.0.4", - "untyped": "^1.3.2" - }, - "bin": { - "unbuild": "dist/cli.mjs" - } - }, - "node_modules/unbuild/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/@rollup/plugin-commonjs": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz", - "integrity": "sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/unbuild/node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/unbuild/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/unbuild/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/unbuild/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/unbuild/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/unbuild/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/unbuild/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unbuild/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/unbuild/node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/unbuild/node_modules/rollup-plugin-dts": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.3.1.tgz", - "integrity": "sha512-gusMi+Z4gY/JaEQeXnB0RUdU82h1kF0WYzCWgVmV4p3hWXqelaKuCvcJawfeg+EKn2T1Ie+YWF2OiN1/L8bTVg==", - "dev": true, - "license": "LGPL-3.0", - "dependencies": { - "magic-string": "^0.30.2" - }, - "engines": { - "node": ">=v14.21.3" - }, - "funding": { - "url": "https://github.com/sponsors/Swatinem" - }, - "optionalDependencies": { - "@babel/code-frame": "^7.22.5" - }, - "peerDependencies": { - "rollup": "^3.0", - "typescript": "^4.1 || ^5.0" - } - }, - "node_modules/unbuild/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uncrypto": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/unctx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.3.1.tgz", - "integrity": "sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.8.2", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.0", - "unplugin": "^1.3.1" - } - }, - "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unenv": { - "name": "unenv-nightly", - "version": "2.0.0-20240919-125358-9a64854", - "resolved": "https://registry.npmjs.org/unenv-nightly/-/unenv-nightly-2.0.0-20240919-125358-9a64854.tgz", - "integrity": "sha512-XjsgUTrTHR7iw+k/SRTNjh6EQgwpC9voygnoCJo5kh4hKqsSDHUW84MhL9EsHTNfLctvVBHaSw8e2k3R2fKXsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "ufo": "^1.5.4" - } - }, - "node_modules/unhead": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.11.7.tgz", - "integrity": "sha512-aA0+JBRryLhDKUq6L2JhMDLZEG/ElyyDASyC9wiwDl6nvvsj9hD26LgPWgmAsSd+9HtMGM2N1gU27CWEMo16CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unhead/dom": "1.11.7", - "@unhead/schema": "1.11.7", - "@unhead/shared": "1.11.7", - "hookable": "^5.5.3" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unimport": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.13.1.tgz", - "integrity": "sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.2", - "acorn": "^8.12.1", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.2", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.11", - "mlly": "^1.7.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "scule": "^1.3.0", - "strip-literal": "^2.1.0", - "unplugin": "^1.14.1" - } - }, - "node_modules/unimport/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unist-builder": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", - "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unplugin": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", - "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.12.1", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "webpack-sources": "^3" - }, - "peerDependenciesMeta": { - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/unplugin-vue-router": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.10.8.tgz", - "integrity": "sha512-xi+eLweYAqolIoTRSmumbi6Yx0z5M0PLvl+NFNVWHJgmE2ByJG1SZbrn+TqyuDtIyln20KKgq8tqmL7aLoiFjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.4", - "@rollup/pluginutils": "^5.1.0", - "@vue-macros/common": "^1.12.2", - "ast-walker-scope": "^0.6.2", - "chokidar": "^3.6.0", - "fast-glob": "^3.3.2", - "json5": "^2.2.3", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.11", - "mlly": "^1.7.1", - "pathe": "^1.1.2", - "scule": "^1.3.0", - "unplugin": "^1.12.2", - "yaml": "^2.5.0" - }, - "peerDependencies": { - "vue-router": "^4.4.0" - }, - "peerDependenciesMeta": { - "vue-router": { - "optional": true - } - } - }, - "node_modules/unstorage": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.12.0.tgz", - "integrity": "sha512-ARZYTXiC+e8z3lRM7/qY9oyaOkaozCeNd2xoz7sYK9fv7OLGhVsf+BZbmASqiK/HTZ7T6eAlnVq9JynZppyk3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^3.6.0", - "destr": "^2.0.3", - "h3": "^1.12.0", - "listhen": "^1.7.2", - "lru-cache": "^10.4.3", - "mri": "^1.2.0", - "node-fetch-native": "^1.6.4", - "ofetch": "^1.3.4", - "ufo": "^1.5.4" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.7.0", - "@azure/cosmos": "^4.1.1", - "@azure/data-tables": "^13.2.2", - "@azure/identity": "^4.4.1", - "@azure/keyvault-secrets": "^4.8.0", - "@azure/storage-blob": "^12.24.0", - "@capacitor/preferences": "^6.0.2", - "@netlify/blobs": "^6.5.0 || ^7.0.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.0", - "@vercel/kv": "^1.0.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.1" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - } - } - }, - "node_modules/untun": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", - "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.5", - "consola": "^3.2.3", - "pathe": "^1.1.1" - }, - "bin": { - "untun": "bin/untun.mjs" - } - }, - "node_modules/untyped": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.5.0.tgz", - "integrity": "sha512-o2Vjmn2dal08BzCcINxSmWuAteReUUiXseii5VRhmxyLF0b21K0iKZQ9fMYK7RWspVkY+0saqaVQNq4roe3Efg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/standalone": "^7.25.6", - "@babel/types": "^7.25.6", - "defu": "^6.1.4", - "jiti": "^2.0.0", - "mri": "^1.2.0", - "scule": "^1.3.0" - }, - "bin": { - "untyped": "dist/cli.mjs" - } - }, - "node_modules/untyped/node_modules/jiti": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.0.0.tgz", - "integrity": "sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/unwasm": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.9.tgz", - "integrity": "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "knitwork": "^1.0.0", - "magic-string": "^0.30.8", - "mlly": "^1.6.1", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "unplugin": "^1.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "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" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/uqr": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", - "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", - "dev": true, - "license": "MIT" - }, - "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/urlpattern-polyfill": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/valibot": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.30.0.tgz", - "integrity": "sha512-5POBdbSkM+3nvJ6ZlyQHsggisfRtyT4tVTo1EIIShs6qCdXJnyWU5TJ68vr8iTg5zpOLjXLRiBqNx+9zwZz/rA==", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-hot-client": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.3.tgz", - "integrity": "sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0" - } - }, - "node_modules/vite-imagetools": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/vite-imagetools/-/vite-imagetools-7.0.4.tgz", - "integrity": "sha512-C9C7b2p/8/TCN2g26tE9haoer2i8K4x0v2RXUiHsIjiz221vQuKItCQ+VyiVCsUMPXfJC/tlZsmCZVBz5jh7uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.5", - "imagetools-core": "^7.0.1", - "sharp": "^0.33.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/vite-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", - "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.6", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-checker": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.8.0.tgz", - "integrity": "sha512-UA5uzOGm97UvZRTdZHiQVYFnd86AVn8EVaD4L3PoVzxH+IZSfaAw14WGFwX9QS23UW3lV/5bVKZn6l0w+q9P0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "ansi-escapes": "^4.3.0", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "commander": "^8.0.0", - "fast-glob": "^3.2.7", - "fs-extra": "^11.1.0", - "npm-run-path": "^4.0.1", - "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", - "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^3.0.2" - }, - "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "@biomejs/biome": ">=1.7", - "eslint": ">=7", - "meow": "^9.0.0", - "optionator": "^0.9.1", - "stylelint": ">=13", - "typescript": "*", - "vite": ">=2.0.0", - "vls": "*", - "vti": "*", - "vue-tsc": "~2.1.6" - }, - "peerDependenciesMeta": { - "@biomejs/biome": { - "optional": true - }, - "eslint": { - "optional": true - }, - "meow": { - "optional": true - }, - "optionator": { - "optional": true - }, - "stylelint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vls": { - "optional": true - }, - "vti": { - "optional": true - }, - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/vite-plugin-checker/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/vite-plugin-checker/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite-plugin-inspect": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.7.tgz", - "integrity": "sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@rollup/pluginutils": "^5.1.0", - "debug": "^4.3.6", - "error-stack-parser-es": "^0.1.5", - "fs-extra": "^11.2.0", - "open": "^10.1.0", - "perfect-debounce": "^1.0.0", - "picocolors": "^1.0.1", - "sirv": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/vite-plugin-vue-inspector": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.2.0.tgz", - "integrity": "sha512-wWxyb9XAtaIvV/Lr7cqB1HIzmHZFVUJsTNm3yAxkS87dgh/Ky4qr2wDEWNxF23fdhVa3jQ8MZREpr4XyiuaRqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/plugin-proposal-decorators": "^7.23.0", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.22.15", - "@vue/babel-plugin-jsx": "^1.1.5", - "@vue/compiler-dom": "^3.3.4", - "kolorist": "^1.8.0", - "magic-string": "^0.30.4" - }, - "peerDependencies": { - "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0 || >=10.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" - }, - "engines": { - "vscode": "^1.52.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dev": true, - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.16.0" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dev": true, - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - } - }, - "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, - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.10.tgz", - "integrity": "sha512-Vy2kmJwHPlouC/tSnIgXVg03SG+9wSqT1xu1Vehc+ChsXsRd7jLkKgMltVEFOzUdBr3uFwBCG+41LJtfAcBRng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.10", - "@vue/compiler-sfc": "3.5.10", - "@vue/runtime-dom": "3.5.10", - "@vue/server-renderer": "3.5.10", - "@vue/shared": "3.5.10" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-bundle-renderer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.1.1.tgz", - "integrity": "sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "ufo": "^1.5.4" - } - }, - "node_modules/vue-component-meta": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/vue-component-meta/-/vue-component-meta-1.8.27.tgz", - "integrity": "sha512-j3WJsyQHP4TDlvnjHc/eseo0/eVkf0FaCpkqGwez5zD+Tj31onBzWZEXTnWKs8xRj0n3dMNYdy3SpiS6NubSvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "~1.11.1", - "@vue/language-core": "1.8.27", - "path-browserify": "^1.0.1", - "vue-component-type-helpers": "1.8.27" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-component-type-helpers": { - "version": "1.8.27", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-1.8.27.tgz", - "integrity": "sha512-0vOfAtI67UjeO1G6UiX5Kd76CqaQ67wrRZiOe7UAb9Jm6GzlUr/fC7CV90XfwapJRjpCMaZFhv1V0ajWRmE9Dg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-devtools-stub": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz", - "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-router": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", - "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true, - "license": "ISC" - }, - "node_modules/wasm-feature-detect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz", - "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "license": "MIT", - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerd": { - "version": "1.20240925.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240925.0.tgz", - "integrity": "sha512-/Jj6+yLwfieZGEt3Kx4+5MoufuC3g/8iFaIh4MPBNGJOGYmdSKXvgCqz09m2+tVCYnysRfbq2zcbVxJRBfOCqQ==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "bin": { - "workerd": "bin/workerd" - }, - "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20240925.0", - "@cloudflare/workerd-darwin-arm64": "1.20240925.0", - "@cloudflare/workerd-linux-64": "1.20240925.0", - "@cloudflare/workerd-linux-arm64": "1.20240925.0", - "@cloudflare/workerd-windows-64": "1.20240925.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", - "integrity": "sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xxhash-wasm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", - "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "ISC", - "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==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "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.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "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, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/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, - "license": "MIT" - }, - "node_modules/yargs/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, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/youch": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", - "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cookie": "^0.5.0", - "mustache": "^4.2.0", - "stacktracey": "^2.1.8" - } - }, - "node_modules/zhead": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz", - "integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "packages/api": { - "name": "@nestri/nexus", - "version": "0.0.1", - "dependencies": { - "hono": "^4.5.5" - }, - "devDependencies": { - "@cf-wasm/resvg": "^0.1.21", - "@cloudflare/workers-types": "^4.20240529.0", - "@jsquash/avif": "^1.3.0", - "@jsquash/jpeg": "^1.4.0", - "@jsquash/resize": "^2.0.0", - "@nestri/cache": "*", - "tinycolor2": "^1.6.0", - "wrangler": "^3.72.2" - } - }, - "packages/api/node_modules/@cloudflare/workers-types": { - "version": "4.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240925.0.tgz", - "integrity": "sha512-KpqyRWvanEuXgBTKYFzRp4NsWOEcswxjsPRSre1zYQcODmc8PUrraVHQUmgvkJgv3FzB+vI9xm7J6oE4MmZHCA==", - "dev": true, - "license": "MIT OR Apache-2.0" - }, - "packages/api/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/api/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "packages/api/node_modules/wrangler": { - "version": "3.78.12", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.78.12.tgz", - "integrity": "sha512-a/xk/N04IvOGk9J+BLkiFg42GDyPS+0BiJimbrHsbX+CDr8Iqq3HNMEyQld+6zbmq01u/gmc8S7GKVR9vDx4+g==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.3.4", - "@cloudflare/workers-shared": "0.5.4", - "@esbuild-plugins/node-globals-polyfill": "^0.2.3", - "@esbuild-plugins/node-modules-polyfill": "^0.2.2", - "blake3-wasm": "^2.1.5", - "chokidar": "^3.5.3", - "esbuild": "0.17.19", - "miniflare": "3.20240925.0", - "nanoid": "^3.3.3", - "path-to-regexp": "^6.3.0", - "resolve": "^1.22.8", - "resolve.exports": "^2.0.2", - "selfsigned": "^2.0.1", - "source-map": "^0.6.1", - "unenv": "npm:unenv-nightly@2.0.0-20240919-125358-9a64854", - "workerd": "1.20240925.0", - "xxhash-wasm": "^1.0.1" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=16.17.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20240925.0" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "packages/cache": { - "name": "@nestri/cache", - "version": "0.0.0", - "devDependencies": { - "@cloudflare/workers-types": "^4.20240529.0", - "wrangler": "^3.57.2" - } - }, - "packages/cache/node_modules/@cloudflare/workers-types": { - "version": "4.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240925.0.tgz", - "integrity": "sha512-KpqyRWvanEuXgBTKYFzRp4NsWOEcswxjsPRSre1zYQcODmc8PUrraVHQUmgvkJgv3FzB+vI9xm7J6oE4MmZHCA==", - "dev": true, - "license": "MIT OR Apache-2.0" - }, - "packages/cache/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/cache/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "packages/cache/node_modules/wrangler": { - "version": "3.78.12", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.78.12.tgz", - "integrity": "sha512-a/xk/N04IvOGk9J+BLkiFg42GDyPS+0BiJimbrHsbX+CDr8Iqq3HNMEyQld+6zbmq01u/gmc8S7GKVR9vDx4+g==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.3.4", - "@cloudflare/workers-shared": "0.5.4", - "@esbuild-plugins/node-globals-polyfill": "^0.2.3", - "@esbuild-plugins/node-modules-polyfill": "^0.2.2", - "blake3-wasm": "^2.1.5", - "chokidar": "^3.5.3", - "esbuild": "0.17.19", - "miniflare": "3.20240925.0", - "nanoid": "^3.3.3", - "path-to-regexp": "^6.3.0", - "resolve": "^1.22.8", - "resolve.exports": "^2.0.2", - "selfsigned": "^2.0.1", - "source-map": "^0.6.1", - "unenv": "npm:unenv-nightly@2.0.0-20240919-125358-9a64854", - "workerd": "1.20240925.0", - "xxhash-wasm": "^1.0.1" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=16.17.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20240925.0" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "packages/core": { - "name": "@nestri/core", - "version": "0.0.0", - "devDependencies": { - "@cloudflare/workers-types": "^4.20240529.0", - "wrangler": "^3.57.2" - } - }, - "packages/core/node_modules/@cloudflare/workers-types": { - "version": "4.20240925.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240925.0.tgz", - "integrity": "sha512-KpqyRWvanEuXgBTKYFzRp4NsWOEcswxjsPRSre1zYQcODmc8PUrraVHQUmgvkJgv3FzB+vI9xm7J6oE4MmZHCA==", - "dev": true, - "license": "MIT OR Apache-2.0" - }, - "packages/core/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "packages/core/node_modules/wrangler": { - "version": "3.78.12", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.78.12.tgz", - "integrity": "sha512-a/xk/N04IvOGk9J+BLkiFg42GDyPS+0BiJimbrHsbX+CDr8Iqq3HNMEyQld+6zbmq01u/gmc8S7GKVR9vDx4+g==", - "dev": true, - "license": "MIT OR Apache-2.0", - "dependencies": { - "@cloudflare/kv-asset-handler": "0.3.4", - "@cloudflare/workers-shared": "0.5.4", - "@esbuild-plugins/node-globals-polyfill": "^0.2.3", - "@esbuild-plugins/node-modules-polyfill": "^0.2.2", - "blake3-wasm": "^2.1.5", - "chokidar": "^3.5.3", - "esbuild": "0.17.19", - "miniflare": "3.20240925.0", - "nanoid": "^3.3.3", - "path-to-regexp": "^6.3.0", - "resolve": "^1.22.8", - "resolve.exports": "^2.0.2", - "selfsigned": "^2.0.1", - "source-map": "^0.6.1", - "unenv": "npm:unenv-nightly@2.0.0-20240919-125358-9a64854", - "workerd": "1.20240925.0", - "xxhash-wasm": "^1.0.1" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" - }, - "engines": { - "node": ">=16.17.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@cloudflare/workers-types": "^4.20240925.0" - }, - "peerDependenciesMeta": { - "@cloudflare/workers-types": { - "optional": true - } - } - }, - "packages/eslint-config": { - "name": "@nestri/eslint-config", - "version": "0.0.0", - "devDependencies": { - "@types/eslint": "8.56.10", - "@types/node": "20.14.11", - "@typescript-eslint/eslint-plugin": "7.16.1", - "@typescript-eslint/parser": "7.16.1", - "@vercel/style-guide": "^5.2.0", - "eslint": "8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-turbo": "^2.0.0", - "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-qwik": "^1.8.0", - "prettier": "3.3.3", - "typescript": "5.4.5" - } - }, - "packages/eslint-config/node_modules/@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz", - "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/type-utils": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz", - "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/type-utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", - "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", - "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@vercel/style-guide/-/style-guide-5.2.0.tgz", - "integrity": "sha512-fNSKEaZvSkiBoF6XEefs8CcgAV9K9e+MbcsDZjUsktHycKdA0jvjAzQi1W/FzLS+Nr5zZ6oejCwq/97dHUKe0g==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@babel/core": "^7.22.11", - "@babel/eslint-parser": "^7.22.11", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "@typescript-eslint/parser": "^6.5.0", - "eslint-config-prettier": "^9.0.0", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-import-resolver-typescript": "^3.6.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jest": "^27.2.3", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-playwright": "^0.16.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-testing-library": "^6.0.1", - "eslint-plugin-tsdoc": "^0.2.17", - "eslint-plugin-unicorn": "^48.0.1", - "prettier-plugin-packagejson": "^2.4.5" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@next/eslint-plugin-next": ">=12.3.0 <15", - "eslint": ">=8.48.0 <9", - "prettier": ">=3.0.0 <4", - "typescript": ">=4.8.0 <6" - }, - "peerDependenciesMeta": { - "@next/eslint-plugin-next": { - "optional": true - }, - "eslint": { - "optional": true - }, - "prettier": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/@vercel/style-guide/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/eslint-config/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/eslint-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/eslint-config/node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/eslint-config/node_modules/eslint-import-resolver-alias": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz", - "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - }, - "peerDependencies": { - "eslint-plugin-import": ">=1.4.0" - } - }, - "packages/eslint-config/node_modules/eslint-import-resolver-typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", - "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", - "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-import/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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-jest": { - "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-jest/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-playwright": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.16.0.tgz", - "integrity": "sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=7", - "eslint-plugin-jest": ">=25" - }, - "peerDependenciesMeta": { - "eslint-plugin-jest": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/eslint-plugin-qwik": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-qwik/-/eslint-plugin-qwik-1.9.0.tgz", - "integrity": "sha512-9EsvIVwtpANSj/ICKMoR5aeabDPgPVcW58bxY8N7R/9oQs6piCm7XbFErxAeaGxmhuvpMZsc+7AN5DizDfDdrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsx-ast-utils": "^3.3.5" - }, - "engines": { - "node": ">=16.8.0 <18.0.0 || >=18.11" - }, - "peerDependencies": { - "eslint": "^8.57.0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-testing-library": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.3.0.tgz", - "integrity": "sha512-GYcEErTt6EGwE0bPDY+4aehfEBpB2gDBFKohir8jlATSUvzStEyzCx8QWB/14xeKc/AwyXkzScSzMHnFojkWrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-testing-library/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-unicorn": { - "version": "48.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz", - "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^3.8.0", - "clean-regexp": "^1.0.0", - "esquery": "^1.5.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.5.4", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.44.0" - } - }, - "packages/eslint-config/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "packages/eslint-config/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/eslint-config/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/eslint-config/node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "packages/eslint-config/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "license": "MIT" - }, - "packages/moq": { - "name": "@nestri/moq", - "version": "0.1.4", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "mp4box": "^0.5.2" - }, - "devDependencies": { - "@types/audioworklet": "^0.0.50", - "@types/dom-mediacapture-transform": "^0.1.6", - "@types/dom-webcodecs": "^0.1.8", - "@typescript-eslint/eslint-plugin": "^6.4.0", - "@typescript-eslint/parser": "^6.4.0", - "@typescript/lib-dom": "npm:@types/web@^0.0.115", - "eslint": "^8.47.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0", - "prettier": "^3.0.1", - "typescript": "^5.1.6" - } - }, - "packages/moq/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "packages/moq/node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "packages/moq/node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/moq/node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/moq/node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/moq/node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/moq/node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/moq/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/moq/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/moq/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "packages/moq/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/moq/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/moq/node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/moq/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/moq/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/typescript-config": { - "name": "@nestri/typescript-config", - "version": "0.0.0", - "license": "MIT" - }, - "packages/ui": { - "name": "@nestri/ui", - "version": "0.0.0", - "devDependencies": { - "@builder.io/qwik": "^1.8.0", - "@builder.io/qwik-city": "^1.8.0", - "@builder.io/qwik-react": "0.5.0", - "@fontsource/bricolage-grotesque": "^5.0.7", - "@fontsource/geist-sans": "^5.0.3", - "@modular-forms/qwik": "0.26.1", - "@nestri/core": "*", - "@nestri/eslint-config": "*", - "@nestri/typescript-config": "*", - "@types/eslint": "^8.56.5", - "@types/node": "^20.11.24", - "@types/nprogress": "^0.2.3", - "@types/react": "^18.2.28", - "@types/react-dom": "^18.2.13", - "autoprefixer": "^10.4.20", - "body-scroll-lock-upgrade": "^1.1.0", - "clsx": "^2.1.1", - "eslint": "^8.57.0", - "focus-trap": "^7.5.4", - "framer-motion": "^11.3.24", - "nprogress": "^0.2.0", - "postcss": "^8.4.41", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-wrap-balancer": "^1.1.1", - "tailwind-merge": "^2.4.0", - "tailwind-variants": "^0.2.1", - "tailwindcss": "^3.4.9", - "typescript": "^5.3.3", - "valibot": "^0.42.1" - } - }, - "packages/ui/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "packages/ui/node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "packages/ui/node_modules/@modular-forms/qwik": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@modular-forms/qwik/-/qwik-0.26.1.tgz", - "integrity": "sha512-8/ANrC719G09NAOrC6PYkNIhjfMDHaoYr0rm8KWvOUvISGUSV8uKz/T6111Wv9e8vHjIooqGVBtEL5ec+nHIZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "decode-formdata": ">=0.7.5 <1", - "valibot": ">=0.33.0 <1" - }, - "peerDependencies": { - "@builder.io/qwik": "^1.4.0", - "@builder.io/qwik-city": "^1.4.0" - } - }, - "packages/ui/node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/ui/node_modules/valibot": { - "version": "0.42.1", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.42.1.tgz", - "integrity": "sha512-3keXV29Ar5b//Hqi4MbSdV7lfVp6zuYLZuA9V1PvQUsXqogr+u5lvLPLk3A4f74VUXDnf/JfWMN6sB+koJ/FFw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">=5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - } - } -} diff --git a/packages/eslint-config/qwik.js b/packages/eslint-config/qwik.js index 3ee14854..85e7a9b6 100644 --- a/packages/eslint-config/qwik.js +++ b/packages/eslint-config/qwik.js @@ -43,6 +43,7 @@ module.exports = { "prefer-spread": "off", "no-case-declarations": "off", "no-console": "off", + "no-use-visibletask": "off", "@typescript-eslint/consistent-type-imports": "warn", "@typescript-eslint/no-unnecessary-condition": "warn", }, From c35349c5dc693f124c5455f96688dd903dad232f Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Thu, 31 Oct 2024 06:40:54 +0300 Subject: [PATCH 02/43] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20input=20client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/www/src/routes/input/index.tsx | 53 ++++++++ apps/www/src/routes/input/input.ts | 45 +++++++ .../routes/input/keyboard_input_handler.ts | 113 ++++++++++++++++++ .../src/routes/input/mouse_input_handler.ts | 81 +++++++++++++ apps/www/src/routes/play/[id]/index.tsx | 81 ++++++++++++- packages/eslint-config/qwik.js | 2 +- 6 files changed, 373 insertions(+), 2 deletions(-) create mode 100644 apps/www/src/routes/input/index.tsx create mode 100644 apps/www/src/routes/input/input.ts create mode 100644 apps/www/src/routes/input/keyboard_input_handler.ts create mode 100644 apps/www/src/routes/input/mouse_input_handler.ts diff --git a/apps/www/src/routes/input/index.tsx b/apps/www/src/routes/input/index.tsx new file mode 100644 index 00000000..de939fc6 --- /dev/null +++ b/apps/www/src/routes/input/index.tsx @@ -0,0 +1,53 @@ +import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik" +import { Mouse } from "./mouse_input_handler" +import { Keyboard } from "./keyboard_input_handler" + +export default component$(() => { + const canvas = useSignal() + // const connected = useSignal(false); + // const wsRef = useSignal(null); + + useVisibleTask$(() => { + const ws = new WebSocket("ws://127.0.0.1:8080/ws"); + // wsRef.value = ws + + ws.onopen = (ev) => { + console.log("ws opened") + //Send auth JWT here + // connected.value = true + } + + ws.onmessage = async (event) => { + if (event.data) { + console.log("msg recieved", event.data); + // connected.value = true + } + } + + ws.onerror = (err) => { + console.error("Error handling the websocket connection", err) + } + + ws.onclose = () => { + console.warn("Websocket connection closed") + } + + document.addEventListener("pointerlockchange", () => { + if (!canvas.value) return; + new Mouse({ ws, canvas: canvas.value }); + new Keyboard({ ws, canvas: canvas.value }); + }) + + }) + + return ( + { + if (canvas.value) { + canvas.value.requestPointerLock() + } + }} + /> + ) +}) \ No newline at end of file diff --git a/apps/www/src/routes/input/input.ts b/apps/www/src/routes/input/input.ts new file mode 100644 index 00000000..242f2038 --- /dev/null +++ b/apps/www/src/routes/input/input.ts @@ -0,0 +1,45 @@ +interface BaseInput { + timestamp?: number; // Add a timestamp for better context (optional) +} + +interface MouseMove extends BaseInput { + type: "MouseMove"; + x: number; + y: number; +} + +interface MouseWheel extends BaseInput { + type: "MouseWheel"; + x: number; + y: number; +} + +interface MouseKeyDown extends BaseInput { + type: "MouseKeyDown"; + key: number; +} + +interface MouseKeyUp extends BaseInput { + type: "MouseKeyUp"; + key: number; +} + +interface KeyDown extends BaseInput { + type: "KeyDown"; + key: number; +} + +interface KeyUp extends BaseInput { + type: "KeyUp"; + key: number; +} + + +export type Input = + | MouseMove + | MouseWheel + | MouseKeyDown + | MouseKeyUp + | KeyDown + | KeyUp; + diff --git a/apps/www/src/routes/input/keyboard_input_handler.ts b/apps/www/src/routes/input/keyboard_input_handler.ts new file mode 100644 index 00000000..480a84a8 --- /dev/null +++ b/apps/www/src/routes/input/keyboard_input_handler.ts @@ -0,0 +1,113 @@ +import { Input } from "./input" + +interface Props { + ws: WebSocket; + canvas: HTMLCanvasElement; +} +//FIXME: removeEventListener does not work, i dunno why + +export class Keyboard { + protected websocket: WebSocket; + protected canvas: HTMLCanvasElement; + protected connected!: boolean; + protected abortController: AbortController; + + // Store references to event listeners + private keydownListener: (e: KeyboardEvent) => void; + private keyupListener: (e: KeyboardEvent) => void; + + constructor({ ws, canvas }: Props) { + this.websocket = ws; + this.canvas = canvas; + this.abortController = new AbortController(); + this.keydownListener = this.createKeyboardListener("keydown", (e: any) => ({ type: "KeyDown", key: this.keyToVirtualKeyCode(e.code) })); + this.keyupListener = this.createKeyboardListener("keyup", (e: any) => ({ type: "KeyUp", key: this.keyToVirtualKeyCode(e.code) })); + this.#run() + } + + #run() { + //calls all the other functions + if (!document.pointerLockElement) { + if (this.connected) { + this.#stop() + } + return; + } + + if (document.pointerLockElement == this.canvas) { + this.connected = true + document.addEventListener("keydown", this.keydownListener, { signal: this.abortController.signal }); + document.addEventListener("keyup", this.keyupListener, { signal: this.abortController.signal }); + } else { + if (this.connected) { + this.#stop() + } + } + + } + #stop() { + document.removeEventListener("keydown", this.keydownListener); + document.removeEventListener("keyup", this.keyupListener); + this.abortController.abort(); + this.connected = false; + } + + // Helper function to create and return mouse listeners + private createKeyboardListener(type: string, dataCreator: (e: Event) => Partial): (e: Event) => void { + return (e: Event) => { + e.preventDefault(); + e.stopPropagation(); + const data = dataCreator(e as any); // type assertion because of the way dataCreator is used + this.websocket.send(JSON.stringify({ ...data, type } as Input)); + }; + } + + public dispose() { + document.exitPointerLock(); + this.#stop(); + this.abortController.abort(); + this.connected = false; + } + + private keyToVirtualKeyCode(code: string) { + + const keyToVirtualKeyCodeMap = new Map([ + // ASCII + ['KeyA', 0x41], ['KeyB', 0x42], ['KeyC', 0x43], ['KeyD', 0x44], ['KeyE', 0x45], + ['KeyF', 0x46], ['KeyG', 0x47], ['KeyH', 0x48], ['KeyI', 0x49], ['KeyJ', 0x4A], + ['KeyK', 0x4B], ['KeyL', 0x4C], ['KeyM', 0x4D], ['KeyN', 0x4E], ['KeyO', 0x4F], + ['KeyP', 0x50], ['KeyQ', 0x51], ['KeyR', 0x52], ['KeyS', 0x53], ['KeyT', 0x54], + ['KeyU', 0x55], ['KeyV', 0x56], ['KeyW', 0x57], ['KeyX', 0x58], ['KeyY', 0x59], + ['KeyZ', 0x5A], + + // Digits + ['Digit0', 0x30], ['Digit1', 0x31], ['Digit2', 0x32], ['Digit3', 0x33], ['Digit4', 0x34], + ['Digit5', 0x35], ['Digit6', 0x36], ['Digit7', 0x37], ['Digit8', 0x38], ['Digit9', 0x39], + + // Special + ['Escape', 0x1B], + ['Backspace', 0x08], + ['Tab', 0x09], + ['Enter', 0x0D], + ['ShiftLeft', 0xA0], + ['ShiftRight', 0xA1], + ['ControlLeft', 0xA2], + ['ControlRight', 0xA3], + ['AltLeft', 0xA4], + ['AltRight', 0xA5], + ['Space', 0x20], + ['PageUp', 0x21], + ['PageDown', 0x22], + ['End', 0x23], + ['Home', 0x24], + ['ArrowLeft', 0x25], + ['ArrowUp', 0x26], + ['ArrowRight', 0x27], + ['ArrowDown', 0x28], + ['Insert', 0x2D], + ['Delete', 0x2E], + ]); + + return keyToVirtualKeyCodeMap.get(code) || 0; // Default to 0 for unknown keys + } +} \ No newline at end of file diff --git a/apps/www/src/routes/input/mouse_input_handler.ts b/apps/www/src/routes/input/mouse_input_handler.ts new file mode 100644 index 00000000..3bfb8a9e --- /dev/null +++ b/apps/www/src/routes/input/mouse_input_handler.ts @@ -0,0 +1,81 @@ +import { Input } from "./input" + +interface Props { + ws: WebSocket; + canvas: HTMLCanvasElement; +} +//FIXME: removeEventListener does not work, i dunno why + +export class Mouse { + protected websocket: WebSocket; + protected canvas: HTMLCanvasElement; + protected connected!: boolean; + protected abortController: AbortController; + + // Store references to event listeners + private mousemoveListener: (e: MouseEvent) => void; + private mousedownListener: (e: MouseEvent) => void; + private mouseupListener: (e: MouseEvent) => void; + private mousewheelListener: (e: WheelEvent) => void; + + constructor({ ws, canvas }: Props) { + this.websocket = ws; + this.canvas = canvas; + this.abortController = new AbortController(); + this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ type: "MouseMove", x: e.movementX, y: e.movementY })); + this.mousedownListener = this.createMouseListener("mousedown", (e: any) => ({ type: "MouseKeyDown", key: e.button })); + this.mouseupListener = this.createMouseListener("mouseup", (e: any) => ({ type: "MouseKeyUp", key: e.button })); + this.mousewheelListener = this.createMouseListener("wheel", (e: any) => ({ type: "MouseWheel", x: e.deltaX, y: e.deltaY })); + + this.#run() + } + + #run() { + //calls all the other functions + if (!document.pointerLockElement) { + if (this.connected) { + this.#stop() + } + return; + } + + if (document.pointerLockElement == this.canvas) { + this.connected = true + this.canvas.addEventListener("mousemove", this.mousemoveListener, { signal: this.abortController.signal }); + this.canvas.addEventListener("mousedown", this.mousedownListener, { signal: this.abortController.signal }); + this.canvas.addEventListener("mouseup", this.mouseupListener, { signal: this.abortController.signal }); + this.canvas.addEventListener("wheel", this.mousewheelListener, { signal: this.abortController.signal }); + + } else { + if (this.connected) { + this.#stop() + } + } + + } + #stop() { + this.canvas.removeEventListener("mousemove", this.mousemoveListener); + this.canvas.removeEventListener("mousedown", this.mousedownListener); + this.canvas.removeEventListener("mouseup", this.mouseupListener); + this.canvas.removeEventListener("wheel", this.mousewheelListener); + this.abortController.abort(); + this.connected = false; + } + + // Helper function to create and return mouse listeners + private createMouseListener(type: string, dataCreator: (e: Event) => Partial): (e: Event) => void { + return (e: Event) => { + e.preventDefault(); + e.stopPropagation(); + const data = dataCreator(e as any); // type assertion because of the way dataCreator is used + this.websocket.send(JSON.stringify({ ...data, type } as Input)); + }; + } + + public dispose() { + document.exitPointerLock(); + this.#stop(); + this.abortController.abort(); + this.connected = false; + } +} \ No newline at end of file diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index c50d705e..adaa72e1 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -29,4 +29,83 @@ export default component$(() => { // }} class="aspect-video w-full rounded-md" /> ) -}) \ No newline at end of file +}) + +{/** + .spinningCircleInner_b6db20 { + transform: rotate(280deg); +} +.inner_b6db20 { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + contain: paint; +} */} + +{/* */} +// .loadingPopout_a8c724 { +// background-color: var(--background-secondary); +// display: flex; +// justify-content: center; +// padding: 8px; +// } + +// .circular_b6db20 { +// animation: spinner-spinning-circle-rotate_b6db20 2s linear infinite; +// height: 100%; +// width: 100%; +// } + +// 100% { +// transform: rotate(360deg); +// } + + +{/* .path3_b6db20 { + animation-delay: .23s; + stroke: var(--text-brand); +} +.path_b6db20 { + animation: spinner-spinning-circle-dash_b6db20 2s ease-in-out infinite; + stroke-dasharray: 1, 200; + stroke-dashoffset: 0; + fill: none; + stroke-width: 6; + stroke-miterlimit: 10; + stroke-linecap: round; + stroke: var(--brand-500); +} +circle[Attributes Style] { + cx: 50; + cy: 50; + r: 20; +} +user agent stylesheet +:not(svg) { + transform-origin: 0px 0px; +} */} + + + +// .path2_b6db20 { +// animation-delay: .15s; +// stroke: var(--text-brand); +// opacity: .6; +// } +// .path_b6db20 { +// animation: spinner-spinning-circle-dash_b6db20 2s ease-in-out infinite; +// stroke-dasharray: 1, 200; +// stroke-dashoffset: 0; +// fill: none; +// stroke-width: 6; +// stroke-miterlimit: 10; +// stroke-linecap: round; +// stroke: var(--brand-500); +// } +// circle[Attributes Style] { +// cx: 50; +// cy: 50; +// r: 20; \ No newline at end of file diff --git a/packages/eslint-config/qwik.js b/packages/eslint-config/qwik.js index 85e7a9b6..374e759a 100644 --- a/packages/eslint-config/qwik.js +++ b/packages/eslint-config/qwik.js @@ -43,7 +43,7 @@ module.exports = { "prefer-spread": "off", "no-case-declarations": "off", "no-console": "off", - "no-use-visibletask": "off", + "qwik/no-use-visible-task": "off", "@typescript-eslint/consistent-type-imports": "warn", "@typescript-eslint/no-unnecessary-condition": "warn", }, From be4d6f5cdc9f81346adb4776196fc1f1cbd4d221 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Thu, 31 Oct 2024 13:29:11 +0300 Subject: [PATCH 03/43] feat: Retry connection when the connection to the server drops --- apps/www/src/routes/input/index.tsx | 73 +++++++++++++++++------------ 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/apps/www/src/routes/input/index.tsx b/apps/www/src/routes/input/index.tsx index de939fc6..b18d8c8d 100644 --- a/apps/www/src/routes/input/index.tsx +++ b/apps/www/src/routes/input/index.tsx @@ -2,42 +2,57 @@ import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik" import { Mouse } from "./mouse_input_handler" import { Keyboard } from "./keyboard_input_handler" + export default component$(() => { - const canvas = useSignal() - // const connected = useSignal(false); - // const wsRef = useSignal(null); - - useVisibleTask$(() => { - const ws = new WebSocket("ws://127.0.0.1:8080/ws"); - // wsRef.value = ws - - ws.onopen = (ev) => { - console.log("ws opened") - //Send auth JWT here - // connected.value = true - } + const canvas = useSignal(); + const retryConnecting = useSignal(false) + const retryInterval = useSignal(null); - ws.onmessage = async (event) => { - if (event.data) { - console.log("msg recieved", event.data); - // connected.value = true - } - } + useVisibleTask$(({ track }) => { + track(() => retryConnecting.value); - ws.onerror = (err) => { - console.error("Error handling the websocket connection", err) - } + function attemptConnection() { + if (!canvas.value) return; // Ensure canvas is available + // const ws = connectWebSocket(retryConnecting); + const ws = new WebSocket("ws://127.0.0.1:8080/ws"); + + ws.onopen = (ev) => { + retryConnecting.value = false; + }; + + ws.onmessage = async (event) => { + if (event.data) { + console.log("msg recieved", event.data); + retryConnecting.value = false; + } + }; + + ws.onerror = (err) => { + console.error("[input]: We got an error while handling the connection", err); + retryConnecting.value = true; + }; + + ws.onclose = () => { + console.warn("[input]: We lost connection to the server"); + retryConnecting.value = true + }; - ws.onclose = () => { - console.warn("Websocket connection closed") + + document.addEventListener("pointerlockchange", () => { + if (!canvas.value) return; + new Mouse({ ws, canvas: canvas.value }); + new Keyboard({ ws, canvas: canvas.value }); + }) } - document.addEventListener("pointerlockchange", () => { - if (!canvas.value) return; - new Mouse({ ws, canvas: canvas.value }); - new Keyboard({ ws, canvas: canvas.value }); - }) + attemptConnection(); + + if (retryConnecting.value) { + console.log("[input]: Hang tight we are trying to reconnect to the server :)") + retryInterval.value = setInterval(attemptConnection, 5000); // Retry every 5 seconds + return () => { retryInterval.value && clearInterval(retryInterval.value) } + } }) return ( From 8e6d032a303d587d1c9695e87c22a86b4648a1df Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Thu, 31 Oct 2024 13:41:29 +0300 Subject: [PATCH 04/43] fix: Fix Qwik serialization errors for retryInterval --- apps/www/src/routes/input/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/www/src/routes/input/index.tsx b/apps/www/src/routes/input/index.tsx index b18d8c8d..67e20e52 100644 --- a/apps/www/src/routes/input/index.tsx +++ b/apps/www/src/routes/input/index.tsx @@ -1,4 +1,4 @@ -import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik" +import { $, component$, QRL, useSignal, useVisibleTask$ } from "@builder.io/qwik" import { Mouse } from "./mouse_input_handler" import { Keyboard } from "./keyboard_input_handler" @@ -6,7 +6,6 @@ import { Keyboard } from "./keyboard_input_handler" export default component$(() => { const canvas = useSignal(); const retryConnecting = useSignal(false) - const retryInterval = useSignal(null); useVisibleTask$(({ track }) => { track(() => retryConnecting.value); @@ -50,8 +49,8 @@ export default component$(() => { if (retryConnecting.value) { console.log("[input]: Hang tight we are trying to reconnect to the server :)") - retryInterval.value = setInterval(attemptConnection, 5000); // Retry every 5 seconds - return () => { retryInterval.value && clearInterval(retryInterval.value) } + const retryInterval = setInterval(attemptConnection, 5000); // Retry every 5 seconds + return () => { retryInterval && clearInterval(retryInterval) } } }) From 3c0d867f9f1664fde5162a67884e5d13823f4610 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Thu, 31 Oct 2024 16:41:51 +0300 Subject: [PATCH 05/43] feat: Add input into the `/play` route --- apps/www/package.json | 1 + apps/www/src/routes/input/index.tsx | 2 +- apps/www/src/routes/play/[id]/index.tsx | 75 +++++++++++++--- bun.lockb | Bin 769064 -> 769480 bytes packages/input/package.json | 9 ++ packages/input/src/index.ts | 2 + packages/input/src/keyboard.ts | 113 ++++++++++++++++++++++++ packages/input/src/mouse.ts | 81 +++++++++++++++++ packages/input/src/types.ts | 45 ++++++++++ packages/moq/contribute/broadcast.ts | 4 +- packages/moq/contribute/track.ts | 2 +- 11 files changed, 318 insertions(+), 16 deletions(-) create mode 100644 packages/input/package.json create mode 100644 packages/input/src/index.ts create mode 100644 packages/input/src/keyboard.ts create mode 100644 packages/input/src/mouse.ts create mode 100644 packages/input/src/types.ts diff --git a/apps/www/package.json b/apps/www/package.json index 246b92ba..659d3492 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -35,6 +35,7 @@ "@kixelated/moq": "^0.2.0", "@modular-forms/qwik": "^0.27.0", "@nestri/eslint-config": "*", + "@nestri/input": "*", "@nestri/moq": "*", "@nestri/typescript-config": "*", "@nestri/ui": "*", diff --git a/apps/www/src/routes/input/index.tsx b/apps/www/src/routes/input/index.tsx index 67e20e52..20507d50 100644 --- a/apps/www/src/routes/input/index.tsx +++ b/apps/www/src/routes/input/index.tsx @@ -13,7 +13,7 @@ export default component$(() => { function attemptConnection() { if (!canvas.value) return; // Ensure canvas is available // const ws = connectWebSocket(retryConnecting); - const ws = new WebSocket("ws://127.0.0.1:8080/ws"); + const ws = new WebSocket("ws://testing@dathorse-vms.duckdns.org:5901/mouse"); ws.onopen = (ev) => { retryConnecting.value = false; diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index adaa72e1..a04ac504 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -1,32 +1,83 @@ import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; import { useLocation } from "@builder.io/qwik-city"; +import { Mouse, Keyboard } from "@nestri/input" // Upstream MoQ lib does not work well with our Qwik Vite implementation import { Player } from "@nestri/moq/playback" export default component$(() => { const id = useLocation().params.id; - const element = useSignal(); + const canvas = useSignal(); const url = 'https://relay.fst.so' + const retryConnecting = useSignal(false) + + useVisibleTask$(({ track }) => { + track(() => retryConnecting.value); + + function attemptConnection() { + if (!canvas.value) return; // Ensure canvas is available + // const ws = connectWebSocket(retryConnecting); + const ws = new WebSocket("ws://[ip address]:8081/ws"); + + ws.onopen = (ev) => { + retryConnecting.value = false; + }; + + ws.onmessage = async (event) => { + if (event.data) { + // console.log("msg recieved", event.data); + retryConnecting.value = false; + } + }; + + ws.onerror = (err) => { + console.error("[input]: We got an error while handling the connection", err); + retryConnecting.value = true; + }; + + ws.onclose = () => { + console.warn("[input]: We lost connection to the server"); + retryConnecting.value = true + }; + + + document.addEventListener("pointerlockchange", () => { + if (!canvas.value) return; + new Mouse({ ws, canvas: canvas.value }); + new Keyboard({ ws, canvas: canvas.value }); + }) + } + + attemptConnection(); + + + if (retryConnecting.value) { + console.log("[input]: Hang tight we are trying to reconnect to the server :)") + const retryInterval = setInterval(attemptConnection, 5000); // Retry every 5 seconds + return () => { retryInterval && clearInterval(retryInterval) } + } + }) + + useVisibleTask$( async () => { - if(element.value){ - await Player.create({ url, fingerprint: undefined, canvas: element.value, namespace: id }); + if (canvas.value) { + await Player.create({ url, fingerprint: undefined, canvas: canvas.value, namespace: id }); } } ) return ( { - // if (element.value) { - // await element.value.requestFullscreen() - // // Do not use - unadjustedMovement: true - breaks input on linux - // element.value.requestPointerLock(); - // } - // }} + ref={canvas} + onClick$={async () => { + if (canvas.value) { + // await element.value.requestFullscreen() + // Do not use - unadjustedMovement: true - breaks input on linux + canvas.value.requestPointerLock(); + } + }} class="aspect-video w-full rounded-md" /> ) }) @@ -45,7 +96,7 @@ export default component$(() => { contain: paint; } */} -{/* */} +{/* */ } // .loadingPopout_a8c724 { // background-color: var(--background-secondary); // display: flex; diff --git a/bun.lockb b/bun.lockb index 7c718e6b7674648568274ae4f7b1c9a667f4376d..2c09a9e98ee378e28fd7952effaead5c2e1fc022 100755 GIT binary patch delta 121096 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%0A9#=3mUyiuB9eMv6yKCjLEA>H{Mag*RK# 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 CvXH3& diff --git a/package.json b/package.json index 2724106f..2581272a 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,7 @@ "@types/aws-lambda": "8.10.145", "prettier": "^3.2.5", "turbo": "^2.0.12", - "typescript": "^5.4.5", - "partykit": "0.0.111" + "typescript": "^5.4.5" }, "engines": { "node": ">=18" @@ -30,7 +29,6 @@ "workerd" ], "dependencies": { - "sst": "3.0.94", - "partysocket": "1.0.2" + "sst": "3.0.94" } -} +} \ No newline at end of file diff --git a/packages/input/src/index.ts b/packages/input/src/index.ts index 5c90d210..4ead3120 100644 --- a/packages/input/src/index.ts +++ b/packages/input/src/index.ts @@ -1,2 +1,3 @@ export * from "./keyboard" -export * from "./mouse" \ No newline at end of file +export * from "./mouse" +export * from "./webrtc-stream" \ No newline at end of file diff --git a/packages/input/src/keyboard.ts b/packages/input/src/keyboard.ts index 420aab00..1037d64d 100644 --- a/packages/input/src/keyboard.ts +++ b/packages/input/src/keyboard.ts @@ -1,14 +1,14 @@ import {type Input} from "./types" -import type PartySocket from "partysocket"; import {keyCodeToLinuxEventCode} from "./codes" +import { WebRTCStream } from "./webrtc-stream"; interface Props { - ws: PartySocket; + webrtc: WebRTCStream; canvas: HTMLCanvasElement; } export class Keyboard { - protected websocket: PartySocket; + protected wrtc: WebRTCStream; protected canvas: HTMLCanvasElement; protected connected!: boolean; @@ -16,8 +16,8 @@ export class Keyboard { private keydownListener: (e: KeyboardEvent) => void; private keyupListener: (e: KeyboardEvent) => void; - constructor({ws, canvas}: Props) { - this.websocket = ws; + constructor({webrtc, canvas}: Props) { + this.wrtc = webrtc; this.canvas = canvas; this.keydownListener = this.createKeyboardListener("keydown", (e: any) => ({ type: "KeyDown", @@ -67,7 +67,7 @@ export class Keyboard { return; const data = dataCreator(e as any); // type assertion because of the way dataCreator is used - this.websocket.send(JSON.stringify({...data, type} as Input)); + this.wrtc.sendData(JSON.stringify({...data, type} as Input)); }; } diff --git a/packages/input/src/mouse.ts b/packages/input/src/mouse.ts index 08fc2e27..305a4947 100644 --- a/packages/input/src/mouse.ts +++ b/packages/input/src/mouse.ts @@ -1,13 +1,13 @@ import { type Input } from "./types" -import type PartySocket from "partysocket"; import { mouseButtonToLinuxEventCode } from "./codes" +import { WebRTCStream } from "./webrtc-stream"; interface Props { - ws: PartySocket; + webrtc: WebRTCStream; canvas: HTMLCanvasElement; } export class Mouse { - protected websocket: PartySocket; + protected wrtc: WebRTCStream; protected canvas: HTMLCanvasElement; protected connected!: boolean; @@ -20,8 +20,8 @@ export class Mouse { private mouseupListener: (e: MouseEvent) => void; private mousewheelListener: (e: WheelEvent) => void; - constructor({ ws, canvas }: Props, absoluteTrick?: boolean) { - this.websocket = ws; + constructor({ webrtc, canvas }: Props, absoluteTrick?: boolean) { + this.wrtc = webrtc; this.canvas = canvas; if (!absoluteTrick) { this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ @@ -97,7 +97,7 @@ export class Mouse { e.preventDefault(); e.stopPropagation(); const data = dataCreator(e as any); // type assertion because of the way dataCreator is used - this.websocket.send(JSON.stringify({ ...data, type } as Input)); + this.wrtc.sendData(JSON.stringify({ ...data, type } as Input)); }; } diff --git a/apps/www/src/routes/play/webrtc-stream.ts b/packages/input/src/webrtc-stream.ts similarity index 55% rename from apps/www/src/routes/play/webrtc-stream.ts rename to packages/input/src/webrtc-stream.ts index c3aa7ba7..de9eee05 100644 --- a/apps/www/src/routes/play/webrtc-stream.ts +++ b/packages/input/src/webrtc-stream.ts @@ -2,6 +2,7 @@ export class WebRTCStream { private readonly _url: string; private _pc: RTCPeerConnection; private _mediaStream: MediaStream | undefined = undefined; + private _dataChannel: RTCDataChannel | undefined; constructor(serverURL: string) { this._url = serverURL; @@ -28,15 +29,20 @@ export class WebRTCStream { // Forces opus to stereo in Chromium browsers, because of course private forceOpusStereo(SDP: string): string { - // Look for "minptime=10;useinbandfec=1" and replace with "minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;" - return SDP.replace(/(minptime=10;useinbandfec=1)/, "$1;stereo=1;sprop-stereo=1;"); + // Look for "minptime=10;useinbandfec=1" and replace with "minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;" + return SDP.replace(/(minptime=10;useinbandfec=1)/, "$1;stereo=1;sprop-stereo=1;"); } public async connect(streamName: string) { + // Create Data Channel + this._dataChannel = this._pc.createDataChannel("input"); + this._setupDataChannelEvents(); + const offer = await this._pc.createOffer(); offer.sdp = this.forceOpusStereo(offer.sdp!); await this._pc.setLocalDescription(offer); + const response = await fetch(`${this._url}/api/whep/${streamName}`, { method: "POST", body: offer.sdp, @@ -45,14 +51,28 @@ export class WebRTCStream { } }); - const answer = await response.text(); - await this._pc.setRemoteDescription({ - sdp: answer, - type: "answer", - }); + const answer = await response.json() as RTCSessionDescriptionInit; + await this._pc.setRemoteDescription(answer); } public getMediaStream() { return this._mediaStream; } + + private _setupDataChannelEvents() { + if (!this._dataChannel) return; + + this._dataChannel.onclose = () => console.log('sendChannel has closed') + this._dataChannel.onopen = () => console.log('sendChannel has opened') + this._dataChannel.onmessage = e => console.log(`Message from DataChannel '${this._dataChannel?.label}' payload '${e.data}'`) + } + + // Optional: Method to send arbitrary data over the data channel + public sendData(message: string) { + if (this._dataChannel && this._dataChannel.readyState === "open") { + this._dataChannel.send(message); + } else { + console.log("Data channel not open or not established."); + } + } } diff --git a/packages/party/.gitignore b/packages/party/.gitignore deleted file mode 100644 index 18375284..00000000 --- a/packages/party/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.partykit \ No newline at end of file diff --git a/packages/party/index.ts b/packages/party/index.ts deleted file mode 100644 index 8b327df3..00000000 --- a/packages/party/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type * as Party from "partykit/server"; - -export default class Server implements Party.Server { - constructor(readonly room: Party.Room) {} - - onConnect(conn: Party.Connection, ctx: Party.ConnectionContext) { - // A websocket just connected! - console.log( - `Connected: - id: ${conn.id} - room: ${this.room.id} - url: ${new URL(ctx.request.url).pathname}` - ); - - // let's send a message to the connection - conn.send("hello from server"); - } - - onMessage(message: string, sender: Party.Connection) { - // let's log the message - console.log(`connection ${sender.id} sent message: ${message}`); - //TODO: If it is of type input... broadcast to server only! - // as well as broadcast it to all the other connections in the room... - this.room.broadcast( - message, - // ...except for the connection it came from - [sender.id] - ); - } -} - -Server satisfies Party.Worker; diff --git a/packages/party/package.json b/packages/party/package.json deleted file mode 100644 index f4c961b9..00000000 --- a/packages/party/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@nestri/party", - "private": true, - "scripts": { - "dev": "bun partykit dev" - } -} \ No newline at end of file diff --git a/packages/relay/dev/Cargo.toml b/packages/relay/dev/Cargo.toml new file mode 100644 index 00000000..3659f92b --- /dev/null +++ b/packages/relay/dev/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "dev" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "nestri-test-server" +path = "src/main.rs" + +[dependencies] +webrtc = "0.11.0" +tokio = { version = "1.41.1", features = ["full"] } +reqwest = { version = "0.12", features = ["json"] } +serde = { version = "1.0.215", features = ["derive"]} +serde_json = "1.0.133" + diff --git a/packages/relay/dev/Containerfile b/packages/relay/dev/Containerfile new file mode 100644 index 00000000..9f7bb9c0 --- /dev/null +++ b/packages/relay/dev/Containerfile @@ -0,0 +1,11 @@ +FROM archlinux:latest + +RUN pacman -Syu --noconfirm + +RUN pacman -Su --noconfirm \ + gstreamer gst-plugins-base gst-plugins-good gst-plugin-rswebrtc + +RUN pacman -Syu --noconfirm \ + mesa mesa-utils xorg-xwayland vulkan-intel vpl-gpu-rt intel-media-driver gst-plugin-va gst-plugins-bad gst-plugin-fmp4 gst-plugin-qsv gst-plugin-pipewire + +CMD [ "bash","-c", "gst-launch-1.0 videotestsrc ! openh264enc ! whip0. audiotestsrc ! opusenc ! whip0. whipclientsink name=whip0 signaller::whip-endpoint=http://localhost:8088/api/whip/test" ] diff --git a/packages/relay/dev/server.sh b/packages/relay/dev/server.sh new file mode 100755 index 00000000..f99ac392 --- /dev/null +++ b/packages/relay/dev/server.sh @@ -0,0 +1,17 @@ +#! /bin/bash -e + +# sudo apt install build-essential -y + +# To run tests, run the relay first - go run main.go. +# Run the docker container next - docker run --rm --init -d --device /dev/dri --network=host test-server +# Then run the nestri-test-server - cd packages/relay/dev cargo run +# Then run the frontend site, and navigate to http://localhost:5713/play/test + +# Expected behavior, see some random messages on the browser's console tab +# And if you input works correctly, it should be logged to the console on the server-side of things + +# docker build -t test-server -f Containerfile . + +# docker run --rm --init -d --device /dev/dri --network=host test-server + +# echo -e "Navigate to http://localhost:5713/play/test" \ No newline at end of file diff --git a/packages/relay/dev/src/main.rs b/packages/relay/dev/src/main.rs new file mode 100644 index 00000000..84156062 --- /dev/null +++ b/packages/relay/dev/src/main.rs @@ -0,0 +1,11 @@ +mod room; + +#[tokio::main] +async fn main() -> std::io::Result<()> { + let room = "test"; + let base_url = "http://localhost:8088"; + let mut room_handler = room::Room::new(room, base_url).await?; + room_handler.run().await?; + + Ok(()) +} diff --git a/packages/relay/dev/src/room.rs b/packages/relay/dev/src/room.rs new file mode 100644 index 00000000..77671840 --- /dev/null +++ b/packages/relay/dev/src/room.rs @@ -0,0 +1,292 @@ +use reqwest; +use std::collections::HashSet; +use std::io; +use std::sync::Arc; +use tokio::sync::mpsc; +use tokio::sync::Mutex; +use tokio::time::Duration; +use webrtc::api::interceptor_registry::register_default_interceptors; +// use std::collections::HashSet; +use serde::{Deserialize, Serialize}; +use serde_json::from_str; +use webrtc::api::media_engine::MediaEngine; +use webrtc::api::APIBuilder; +use webrtc::data_channel::data_channel_message::DataChannelMessage; +use webrtc::ice_transport::ice_server::RTCIceServer; +use webrtc::interceptor::registry::Registry; +use webrtc::peer_connection::configuration::RTCConfiguration; +use webrtc::peer_connection::math_rand_alpha; +use webrtc::peer_connection::peer_connection_state::RTCPeerConnectionState; +use webrtc::peer_connection::sdp::session_description::RTCSessionDescription; + +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "type")] +enum InputMessage { + #[serde(rename = "mousemove")] + MouseMove { x: i32, y: i32 }, + + #[serde(rename = "mousemoveabs")] + MouseMoveAbs { x: i32, y: i32 }, + + #[serde(rename = "wheel")] + Wheel { x: f64, y: f64 }, + + #[serde(rename = "mousedown")] + MouseDown { key: i32 }, + // Add other variants as needed + #[serde(rename = "mouseup")] + MouseUp { key: i32 }, + + #[serde(rename = "keydown")] + KeyDown { key: i32 }, + + #[serde(rename = "keyup")] + KeyUp { key: i32 }, +} + +pub struct Room { + peer_connection: Arc, + data_channel: Arc, + done_tx: mpsc::Sender<()>, + done_rx: mpsc::Receiver<()>, + base_url: String, + stream_name: String, + // pipeline: Arc>, +} + +impl Room { + pub async fn new( + stream_name: &str, + base_url: &str, + // pipeline: Arc>, + ) -> io::Result { + // Create a MediaEngine object to configure the supported codec + let mut m = MediaEngine::default(); + + // Register default codecs + let _ = m.register_default_codecs().map_err(map_to_io_error)?; + + let mut registry = Registry::new(); + + // Use the default set of Interceptors + registry = register_default_interceptors(registry, &mut m).map_err(map_to_io_error)?; + + // Create the API object with the MediaEngine + let api = APIBuilder::new() + .with_media_engine(m) + .with_interceptor_registry(registry) + .build(); + + // Prepare the configuration + let config = RTCConfiguration { + ice_servers: vec![RTCIceServer { + urls: vec!["stun:stun.l.google.com:19302".to_owned()], + ..Default::default() + }], + ..Default::default() + }; + + // Create a new RTCPeerConnection + let peer_connection = Arc::new( + api.new_peer_connection(config) + .await + .map_err(map_to_io_error)?, + ); + + // Create a datachannel with label 'data' + let data_channel = peer_connection + .create_data_channel("input", None) + .await + .map_err(map_to_io_error)?; + + let (done_tx, done_rx) = mpsc::channel::<()>(1); + + let done_tx_clone = done_tx.clone(); + // Peer connection state change handler + peer_connection.on_peer_connection_state_change(Box::new( + move |s: RTCPeerConnectionState| { + println!("Peer Connection State has changed: {s}"); + + if s == RTCPeerConnectionState::Failed { + println!("Peer Connection has gone to failed exiting"); + let _ = done_tx_clone.try_send(()); + } + + Box::pin(async {}) + }, + )); + + Ok(Self { + peer_connection, + // pipeline, + data_channel, + done_tx, + done_rx, + base_url: base_url.to_string(), + stream_name: stream_name.to_string(), + }) + } + + pub async fn run(&mut self) -> io::Result<()> { + // Create an async channel for sending events to the pipeline + let (event_tx, mut event_rx) = mpsc::channel(10); + + // A shared state to track currently pressed keys + let pressed_keys = Arc::new(tokio::sync::Mutex::new(HashSet::new())); + + // Spawn a task to process events for the pipeline + let pipeline_task = { + // let pipeline = Arc::clone(self.pipeline); + // let pipeline_clone = self.pipeline.clone(); + tokio::spawn(async move { + while let Some(event) = event_rx.recv().await { + // let pipeline = pipeline_clone.lock().await; + // pipeline.send_event(event); + println!("Invoked an event: {}", event) + } + }) + }; + + let data_channel = self.data_channel.clone(); + //TODO: Handle heartbeats here + let d1 = Arc::clone(&self.data_channel); + data_channel.on_open(Box::new(move || { + println!("Data channel '{}'-'{}' open. Random messages will now be sent to any connected DataChannels every 5 seconds", d1.label(), d1.id()); + + let d2 = Arc::clone(&d1); + Box::pin(async move { + let mut result = std::io::Result::::Ok(0); + while result.is_ok() { + let timeout = tokio::time::sleep(Duration::from_secs(5)); + tokio::pin!(timeout); + + tokio::select! { + _ = timeout.as_mut() =>{ + let message = math_rand_alpha(15); + println!("Sending '{message}'"); + result = d2.send_text(message).await.map_err(map_to_io_error); + } + }; + } + }) + })); + + // Data channel message handler + let d_label = data_channel.label().to_owned(); + data_channel.on_message(Box::new(move |msg: DataChannelMessage| { + let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); + println!("Message from DataChannel '{d_label}': '{msg_str}'"); + + let event_tx = event_tx.clone(); + let pressed_keys = Arc::clone(&pressed_keys); + + tokio::spawn(async move { + if let Ok(input_msg) = from_str::(&msg_str) { + if let Some(event) = handle_input_message(input_msg, &pressed_keys).await { + event_tx.send(event).await.unwrap(); + } + } + }); + + Box::pin(async {}) + })); + + // Create an offer to send to the browser + let offer = self + .peer_connection + .create_offer(None) + .await + .map_err(map_to_io_error)?; + + // Create channel that is blocked until ICE Gathering is complete + let mut gather_complete = self.peer_connection.gathering_complete_promise().await; + + // Sets the LocalDescription, and starts our UDP listeners + self.peer_connection + .set_local_description(offer) + .await + .map_err(map_to_io_error)?; + + // Block until ICE Gathering is complete, disabling trickle ICE + // we do this because we only can exchange one signaling message + // in a production application you should exchange ICE Candidates via OnICECandidate + let _ = gather_complete.recv().await; + + if let Some(local_description) = self.peer_connection.local_description().await { + let url = format!("{}/api/whep/{}", self.base_url, self.stream_name); + let response = reqwest::Client::new() + .post(&url) + .header("Content-Type", "application/sdp") + .body(local_description.sdp.clone()) // clone if you don't want to move offer.sdp + .send() + .await + .map_err(map_to_io_error)?; + + let answer = response + .json::() + .await + .map_err(map_to_io_error)?; + + self.peer_connection + .set_remote_description(answer) + .await + .map_err(map_to_io_error)?; + } else { + println!("generate local_description failed!"); + }; + + println!("Press ctrl-c to stop"); + + tokio::select! { + _ = self.done_rx.recv() => { + println!("received done signal!"); + } + _ = tokio::signal::ctrl_c() => { + println!(); + } + }; + self.peer_connection + .close() + .await + .map_err(map_to_io_error)?; + + //FIXME: Ctr + C is not working... i suspect it has something to do with this guy -- Do not forget to fix packages/server/room.rs as well + + pipeline_task.await?; + Ok(()) + } +} + +fn map_to_io_error(e: E) -> io::Error { + io::Error::new(io::ErrorKind::Other, format!("{}", e)) +} + +async fn handle_input_message( + input_msg: InputMessage, + pressed_keys: &Arc>>, +) -> Option { + match input_msg { + InputMessage::MouseMove { x, y } => Some("MouseMoved".to_string()), + InputMessage::MouseMoveAbs { x, y } => Some("MouseMoveAbsolute".to_string()), + InputMessage::KeyDown { key } => { + let mut keys = pressed_keys.lock().await; + // If the key is already pressed, return to prevent key lockup + if keys.contains(&key) { + return None; + } + keys.insert(key); + + Some("KeyDown".to_string()) + } + InputMessage::KeyUp { key } => { + let mut keys = pressed_keys.lock().await; + // Remove the key from the pressed state when released + keys.remove(&key); + + Some("KeyUp".to_string()) + } + InputMessage::Wheel { x, y } => Some("Wheel".to_string()), + InputMessage::MouseDown { key } => Some("MouseDown".to_string()), + InputMessage::MouseUp { key } => Some("MouseUp".to_string()), + } +} diff --git a/packages/relay/go.mod b/packages/relay/go.mod index 3513fcd5..cbbf476f 100644 --- a/packages/relay/go.mod +++ b/packages/relay/go.mod @@ -3,26 +3,28 @@ module relay go 1.23 require ( - github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/websocket v1.5.3 // indirect + github.com/google/uuid v1.6.0 + github.com/pion/interceptor v0.1.37 + github.com/pion/webrtc/v4 v4.0.2 +) + +require ( github.com/pion/datachannel v1.5.9 // indirect github.com/pion/dtls/v3 v3.0.4 // indirect github.com/pion/ice/v4 v4.0.2 // indirect - github.com/pion/interceptor v0.1.37 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/mdns/v2 v2.0.7 // indirect github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.14 // indirect github.com/pion/rtp v1.8.9 // indirect - github.com/pion/sctp v1.8.33 // indirect + github.com/pion/sctp v1.8.34 // indirect github.com/pion/sdp/v3 v3.0.9 // indirect github.com/pion/srtp/v3 v3.0.4 // indirect github.com/pion/stun/v3 v3.0.0 // indirect github.com/pion/transport/v3 v3.0.7 // indirect github.com/pion/turn/v4 v4.0.0 // indirect - github.com/pion/webrtc/v4 v4.0.2 // indirect - github.com/wlynxg/anet v0.0.3 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/sys v0.26.0 // indirect + github.com/wlynxg/anet v0.0.5 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect ) diff --git a/packages/relay/go.sum b/packages/relay/go.sum index 16b48af4..e760267f 100644 --- a/packages/relay/go.sum +++ b/packages/relay/go.sum @@ -1,9 +1,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA= github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE= github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= @@ -22,8 +21,8 @@ github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk= github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw= -github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM= +github.com/pion/sctp v1.8.34 h1:rCuD3m53i0oGxCSp7FLQKvqVx0Nf5AUAHhMRXTTQjBc= +github.com/pion/sctp v1.8.34/go.mod h1:yWkCClkXlzVW7BXfI2PjrUGBwUI0CjXJBkhLt+sdo4U= github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M= @@ -36,6 +35,7 @@ github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM= github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA= github.com/pion/webrtc/v4 v4.0.2 h1:fBwm5/hqSUybrCWl0DDBSTDrpbkcgkqpeLmXw9CsBQA= github.com/pion/webrtc/v4 v4.0.2/go.mod h1:moylBT2A4dNoEaYBCdV1nThM3TLwRHzWszIG+eSPaqQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -44,15 +44,17 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/wlynxg/anet v0.0.3 h1:PvR53psxFXstc12jelG6f1Lv4MWqE0tI76/hHGjh9rg= -github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/packages/relay/internal/common.go b/packages/relay/internal/common.go index 21c398f0..5113387d 100644 --- a/packages/relay/internal/common.go +++ b/packages/relay/internal/common.go @@ -1,43 +1,12 @@ package relay import ( - "log" - "github.com/pion/interceptor" "github.com/pion/webrtc/v4" + "log" ) -type Stream struct { - PeerConnection *webrtc.PeerConnection - AudioTrack webrtc.TrackLocal - VideoTrack webrtc.TrackLocal -} - -type Viewer struct { - UUID string - PeerConnection *webrtc.PeerConnection -} - -func (vw *Viewer) AddTrack(trackLocal *webrtc.TrackLocal) error { - rtpSender, err := vw.PeerConnection.AddTrack(*trackLocal) - if err != nil { - return err - } - - go func() { - rtcpBuffer := make([]byte, 1400) - for { - if _, _, rtcpErr := rtpSender.Read(rtcpBuffer); rtcpErr != nil { - return - } - } - }() - - return nil -} - -var StreamMap map[string]*Stream //< stream name -> stream -var ViewerMap map[string]map[string]*Viewer //< stream name -> viewers by their UUID +var Rooms = make(map[string]*Room) //< Room name -> Room var globalWebRTCAPI *webrtc.API var globalWebRTCConfig = webrtc.Configuration{ @@ -47,12 +16,8 @@ var globalWebRTCConfig = webrtc.Configuration{ } func InitWebRTCAPI() error { - // Make our maps - StreamMap = make(map[string]*Stream) - ViewerMap = make(map[string]map[string]*Viewer) - var err error - flags := GetRelayFlags() + flags := GetFlags() // Media engine mediaEngine := &webrtc.MediaEngine{} diff --git a/packages/relay/internal/flags.go b/packages/relay/internal/flags.go index 129ac376..c50b4a39 100644 --- a/packages/relay/internal/flags.go +++ b/packages/relay/internal/flags.go @@ -9,9 +9,9 @@ import ( "github.com/pion/webrtc/v4" ) -var globalFlags *RelayFlags +var globalFlags *Flags -type RelayFlags struct { +type Flags struct { Verbose bool EndpointPort int WebRTCUDPStart int @@ -19,7 +19,7 @@ type RelayFlags struct { STUNServer string } -func (flags *RelayFlags) DebugLog() { +func (flags *Flags) DebugLog() { log.Println("Relay Flags:") log.Println("> Verbose: ", flags.Verbose) log.Println("> Endpoint Port: ", flags.EndpointPort) @@ -54,9 +54,9 @@ func getEnvAsString(name string, defaultVal string) string { return valueStr } -func InitRelayFlags() { +func InitFlags() { // Create Flags struct - globalFlags = &RelayFlags{} + globalFlags = &Flags{} // Get flags flag.BoolVar(&globalFlags.Verbose, "verbose", getEnvAsBool("VERBOSE", false), "Verbose mode") flag.IntVar(&globalFlags.EndpointPort, "endpointPort", getEnvAsInt("ENDPOINT_PORT", 8088), "HTTP endpoint port") @@ -74,6 +74,6 @@ func InitRelayFlags() { } } -func GetRelayFlags() *RelayFlags { +func GetFlags() *Flags { return globalFlags } diff --git a/packages/relay/internal/http.go b/packages/relay/internal/http.go index 8d75321e..43236d28 100644 --- a/packages/relay/internal/http.go +++ b/packages/relay/internal/http.go @@ -1,17 +1,9 @@ package relay import ( - "encoding/json" - "errors" - "fmt" - "io" "log" "net/http" "strconv" - "strings" - - "github.com/google/uuid" - "github.com/pion/webrtc/v4" ) var httpMux *http.ServeMux @@ -22,12 +14,11 @@ func InitHTTPEndpoint() { // Endpoints themselves httpMux.Handle("/", http.NotFoundHandler()) - httpMux.HandleFunc("/api/room/{roomName}", corsAnyHandler(websocketHandler)) - httpMux.HandleFunc("/api/whip/{streamName}", corsAnyHandler(whipHandler)) - httpMux.HandleFunc("/api/whep/{streamName}", corsAnyHandler(whepHandler)) + httpMux.HandleFunc("/api/whip/{roomName}", corsAnyHandler(whipHandler)) + httpMux.HandleFunc("/api/whep/{roomName}", corsAnyHandler(whepHandler)) // Get our serving port - port := GetRelayFlags().EndpointPort + port := GetFlags().EndpointPort // Log and start the endpoint server log.Println("Starting HTTP endpoint server on :", strconv.Itoa(port)) @@ -37,295 +28,41 @@ func InitHTTPEndpoint() { Addr: ":" + strconv.Itoa(port), }).ListenAndServe()) }() -} - -// WHIP - WebRTC HTTP Ingress Protocol -// This is the handler for the /api/whip/{streamName} endpoint -func whipHandler(w http.ResponseWriter, r *http.Request) { - // Get stream name - streamName := r.PathValue("streamName") - if len(streamName) <= 0 { - logHTTPError(w, "no stream name given", http.StatusBadRequest) - return - } - - // Get body - body, err := io.ReadAll(r.Body) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - // Get SDP offer from body - sdpOffer := string(body) - if sdpOffer == "" { - // If stream exists, just return OK (force stream close?) - if _, ok := StreamMap[streamName]; ok { - w.WriteHeader(http.StatusOK) - return - } else { - logHTTPError(w, "SDP offer not set", http.StatusBadRequest) - return - } - } - - // Verify there's no existing stream with same name - if _, ok := StreamMap[streamName]; ok { - logHTTPError(w, "stream name already in use", http.StatusBadRequest) - return - } - - // Callback for closing PeerConnection - onPCClose := func() { - if GetRelayFlags().Verbose { - log.Println("Closed PeerConnection for stream: ", streamName) - } - if _, ok := StreamMap[streamName]; ok { - delete(StreamMap, streamName) - } - } - - // Create a new stream - if GetRelayFlags().Verbose { - log.Println("Creating new stream: ", streamName) - } - stream := &Stream{} - stream.PeerConnection, err = CreatePeerConnection(onPCClose) - if err != nil { - logHTTPError(w, err.Error(), http.StatusInternalServerError) - return - } - - // Modify SDP offer to remove opus "sprop-maxcapturerate=24000" (fixes opus bad quality issue, present in GStreamer) - sdpOffer = strings.Replace(sdpOffer, ";sprop-maxcapturerate=24000", "", -1) - stream.PeerConnection.OnTrack(func(remoteTrack *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) { - var localTrack *webrtc.TrackLocalStaticRTP - if remoteTrack.Kind() == webrtc.RTPCodecTypeVideo { - localTrack, err = webrtc.NewTrackLocalStaticRTP(remoteTrack.Codec().RTPCodecCapability, "video", fmt.Sprint("nestri-", streamName)) - if err != nil { - log.Println("Failed to create local video track for stream: ", streamName, " - reason: ", err) - return - } - stream.VideoTrack = localTrack - } else if remoteTrack.Kind() == webrtc.RTPCodecTypeAudio { - localTrack, err = webrtc.NewTrackLocalStaticRTP(remoteTrack.Codec().RTPCodecCapability, "audio", fmt.Sprint("nestri-", streamName)) - if err != nil { - log.Println("Failed to create local audio track for stream: ", streamName, " - reason: ", err) - return - } - stream.AudioTrack = localTrack - } - - // TODO: With custom (non-WHEP) viewer connections, notify them of new stream to set their tracks - - rtpBuffer := make([]byte, 1400) - for { - read, _, err := remoteTrack.Read(rtpBuffer) - if err != nil { - // EOF is expected when stopping stream - if !errors.Is(err, io.EOF) { - log.Println("RTP read error from stream: ", streamName, " - ", err) - } - break - } - - _, err = localTrack.Write(rtpBuffer[:read]) - if err != nil && !errors.Is(err, io.ErrClosedPipe) { - log.Println("RTP write error from stream: ", streamName, " - ", err) - break - } - } - // TODO: Cleanup track from viewer for stream restart - }) - - // Set new remote description - err = stream.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ - Type: webrtc.SDPTypeOffer, - SDP: sdpOffer, - }) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - // Wait for ICE Gathering to complete - gatherComplete := webrtc.GatheringCompletePromise(stream.PeerConnection) - - // Create Answer and set local description - answer, err := stream.PeerConnection.CreateAnswer(nil) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - err = stream.PeerConnection.SetLocalDescription(answer) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - // Wait for ICE Gathering to complete - <-gatherComplete - - // Return SDP answer - w.Header().Set("Content-Type", "application/sdp") - w.Header().Set("Location", fmt.Sprint("/api/whip/", streamName)) - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(stream.PeerConnection.LocalDescription().SDP)) - if err != nil { - log.Println(err) - return - } - - // Save to our stream map - StreamMap[streamName] = stream -} - -// WHEP - WebRTC HTTP Egress Protocol -// This is the handler for the /api/whep/{streamName} endpoint -func whepHandler(w http.ResponseWriter, r *http.Request) { - // Get stream name - streamName := r.PathValue("streamName") - if len(streamName) <= 0 { - logHTTPError(w, "no stream name given", http.StatusBadRequest) - return - } - - // Make sure stream exists - stream, ok := StreamMap[streamName] - if !ok { - logHTTPError(w, "no stream with given name online", http.StatusNotFound) - return - } - - // Get body - body, err := io.ReadAll(r.Body) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - // Get SDP offer from body - sdpOffer := string(body) - if sdpOffer == "" { - logHTTPError(w, "SDP offer not set", http.StatusBadRequest) - return - } - - // Generate UUID for viewer - viewerUUID := uuid.New().String() - - // Callback for closing PeerConnection - onPCClose := func() { - if GetRelayFlags().Verbose { - log.Println("Closed PeerConnection for viewer: ", viewerUUID, " - beloging to stream: ", streamName) - } - if _, ok := ViewerMap[streamName]; ok { - if _, vOk := ViewerMap[viewerUUID]; vOk { - delete(ViewerMap[streamName], viewerUUID) - } - } - } - - // Create new viewer - if GetRelayFlags().Verbose { - log.Println("New viewer for stream: ", streamName) - } - viewer := &Viewer{ - UUID: viewerUUID, - } - viewer.PeerConnection, err = CreatePeerConnection(onPCClose) - if err != nil { - logHTTPError(w, err.Error(), http.StatusInternalServerError) - return - } - - // Add stream tracks for viewer - if stream.AudioTrack != nil { - if err = viewer.AddTrack(&stream.AudioTrack); err != nil { - logHTTPError(w, "failed to add audio track to viewer", http.StatusInternalServerError) - return - } - } else if GetRelayFlags().Verbose { - log.Println("nil audio track for stream: ", streamName) - } - if stream.VideoTrack != nil { - if err = viewer.AddTrack(&stream.VideoTrack); err != nil { - logHTTPError(w, "failed to add video track to viewer", http.StatusInternalServerError) - return - } - } else if GetRelayFlags().Verbose { - log.Println("nil video track for stream: ", streamName) - } - - // Set new remote description - err = viewer.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ - Type: webrtc.SDPTypeOffer, - SDP: sdpOffer, - }) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - // Wait for ICE Gathering to complete - gatherComplete := webrtc.GatheringCompletePromise(viewer.PeerConnection) - - // Create Answer and set local description - answer, err := viewer.PeerConnection.CreateAnswer(nil) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - err = viewer.PeerConnection.SetLocalDescription(answer) - if err != nil { - logHTTPError(w, err.Error(), http.StatusBadRequest) - return - } - - // Wait for ICE Gathering to complete - <-gatherComplete - - // Return SDP answer - w.Header().Set("Content-Type", "application/sdp") - w.Header().Set("Location", fmt.Sprint("/api/whep/", streamName)) - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(viewer.PeerConnection.LocalDescription().SDP)) - if err != nil { - log.Println(err) - return - } + // go func() { + // for roomName := range Rooms { + // go Rooms[roomName].listenToParticipants() + // } + // }() } // logHTTPError logs (if verbose) and sends an error code to requester func logHTTPError(w http.ResponseWriter, err string, code int) { - if GetRelayFlags().Verbose { + if GetFlags().Verbose { log.Println(err) } http.Error(w, err, code) } -// httpError sends a web response with an error message -func httpError(w http.ResponseWriter, statusCode int, message string) { - w.WriteHeader(statusCode) - _ = json.NewEncoder(w).Encode(map[string]string{"error": message}) -} - -// respondWithJSON writes JSON to the response body -func respondWithJSON(w http.ResponseWriter, statusCode int, payload interface{}) { - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(statusCode) - _ = json.NewEncoder(w).Encode(payload) -} - -// respondWithText writes text to the response body -func respondWithText(w http.ResponseWriter, statusCode int, payload string) { - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(statusCode) - _, _ = w.Write([]byte(payload)) -} +// // httpError sends a web response with an error message +// func httpError(w http.ResponseWriter, statusCode int, message string) { +// w.WriteHeader(statusCode) +// _ = json.NewEncoder(w).Encode(map[string]string{"error": message}) +// } + +// // respondWithJSON writes JSON to the response body +// func respondWithJSON(w http.ResponseWriter, statusCode int, payload interface{}) { +// w.Header().Set("Content-Type", "application/json") +// w.WriteHeader(statusCode) +// _ = json.NewEncoder(w).Encode(payload) +// } + +// // respondWithText writes text to the response body +// func respondWithText(w http.ResponseWriter, statusCode int, payload string) { +// w.Header().Set("Content-Type", "text/plain") +// w.WriteHeader(statusCode) +// _, _ = w.Write([]byte(payload)) +// } // corsAnyHandler allows any origin to access the endpoint func corsAnyHandler(next func(w http.ResponseWriter, r *http.Request)) http.HandlerFunc { diff --git a/packages/relay/internal/participant.go b/packages/relay/internal/participant.go new file mode 100644 index 00000000..648a2442 --- /dev/null +++ b/packages/relay/internal/participant.go @@ -0,0 +1,38 @@ +package relay + +import ( + "github.com/google/uuid" + "github.com/pion/webrtc/v4" +) + +type Participant struct { + ID uuid.UUID //< Internal IDs are useful to keeping unique internal track and not have conflicts later + Name string + PeerConnection *webrtc.PeerConnection + DataChannel *webrtc.DataChannel +} + +func NewParticipant(participantName string) *Participant { + return &Participant{ + ID: uuid.New(), + Name: participantName, + } +} + +func (vw *Participant) addTrack(trackLocal *webrtc.TrackLocal) error { + rtpSender, err := vw.PeerConnection.AddTrack(*trackLocal) + if err != nil { + return err + } + + go func() { + rtcpBuffer := make([]byte, 1400) + for { + if _, _, rtcpErr := rtpSender.Read(rtcpBuffer); rtcpErr != nil { + return + } + } + }() + + return nil +} diff --git a/packages/relay/internal/room.go b/packages/relay/internal/room.go new file mode 100644 index 00000000..262316ae --- /dev/null +++ b/packages/relay/internal/room.go @@ -0,0 +1,65 @@ +package relay + +import ( + "github.com/google/uuid" + "github.com/pion/webrtc/v4" + "log" + "sync" +) + +type Room struct { + ID uuid.UUID //< Internal IDs are useful to keeping unique internal track + Name string + PeerConnection *webrtc.PeerConnection + AudioTrack webrtc.TrackLocal + VideoTrack webrtc.TrackLocal + Participants map[uuid.UUID]*Participant + ParticipantsMutex sync.Mutex +} + +func NewRoom(name string) *Room { + return &Room{ + ID: uuid.New(), + Name: name, + Participants: make(map[uuid.UUID]*Participant), + } +} + +// Adds a Participant to a Room +func (r *Room) addParticipant(participant *Participant) { + r.ParticipantsMutex.Lock() + r.Participants[participant.ID] = participant + r.ParticipantsMutex.Unlock() +} + +// Removes a Participant from a Room by participant's ID +func (r *Room) removeParticipantByID(pID uuid.UUID) { + r.ParticipantsMutex.Lock() + delete(r.Participants, pID) + r.ParticipantsMutex.Unlock() +} + +// Removes a Participant from a Room by participant's name +func (r *Room) removeParticipantByName(pName string) { + r.ParticipantsMutex.Lock() + for id, p := range r.Participants { + if p.Name == pName { + delete(r.Participants, id) + break + } + } + r.ParticipantsMutex.Unlock() +} + +// Broadcasts a message to Room's Participant's - excluding one given ID of +func (r *Room) broadcastMessage(msg webrtc.DataChannelMessage, excludeID uuid.UUID) { + for d, participant := range r.Participants { + if participant.DataChannel != nil { + if d != excludeID { // Don't send back to the sender + if err := participant.DataChannel.SendText(string(msg.Data)); err != nil { + log.Printf("Error broadcasting to %s: %v\n", participant.Name, err) + } + } + } + } +} diff --git a/packages/relay/internal/websocket.go b/packages/relay/internal/websocket.go deleted file mode 100644 index 4a13583e..00000000 --- a/packages/relay/internal/websocket.go +++ /dev/null @@ -1,169 +0,0 @@ -package relay - -import ( - "encoding/json" - "log" - "net/http" - "sync" - - "github.com/google/uuid" - "github.com/gorilla/websocket" -) - -// Room represents a chat room -type Room struct { - participants map[*Participant]bool - broadcast chan string - mutex sync.RWMutex - name string -} - -// Message represents a message sent by a participant -type Message struct { - Type string `json:"type"` - Data string `json:"data"` -} - -// Participant represents a participant in a chat room -type Participant struct { - ws *websocket.Conn - send chan string - room *Room - name string -} - -var upgrader = websocket.Upgrader{ - ReadBufferSize: 1024, - WriteBufferSize: 1024, - CheckOrigin: func(r *http.Request) bool { - return true - }, -} - -var rooms = make(map[string]*Room) -var mutex sync.RWMutex - -func websocketHandler(w http.ResponseWriter, r *http.Request) { - roomName := r.PathValue("roomName") - if len(roomName) <= 0 { - logHTTPError(w, "no stream name given", http.StatusBadRequest) - return - } - - participantName := r.URL.Query().Get("name") - if participantName == "" { - participantName = uuid.New().String() - } - - log.Printf("> New participant %s joining room %s\n", participantName, roomName) - - mutex.Lock() - room, ok := rooms[roomName] - if !ok { - room = &Room{ - participants: make(map[*Participant]bool), - broadcast: make(chan string), - name: roomName, - } - rooms[roomName] = room - log.Printf("> Created new room %s\n", roomName) - } - mutex.Unlock() - - ws, err := upgrader.Upgrade(w, r, nil) - if err != nil { - log.Println(err) - return - } - - participant := &Participant{ - ws: ws, - send: make(chan string), - room: room, - name: participantName, - } - - room.mutex.Lock() - room.participants[participant] = true - room.mutex.Unlock() - - log.Printf("> Participant %s joined room %s\n", participantName, roomName) - - go participant.writePump() - go participant.readPump() - go room.broadcastPump() - -} - -func (p *Participant) writePump() { - for message := range p.send { - err := p.ws.WriteMessage(websocket.TextMessage, []byte(message)) - if err != nil { - log.Println(err) - p.room.removeParticipant(p) - return - } - } -} - -func (p *Participant) readPump() { - for { - _, message, err := p.ws.ReadMessage() - if err != nil { - log.Println(err) - p.room.removeParticipant(p) - return - } - - log.Printf("> Participant %s sent message to room %s >>>> %s\n", p.name, p.room.name, string(message)) - - var msg Message - err = json.Unmarshal(message, &msg) - if err != nil { - log.Println(err) - p.room.broadcast <- string(message) - continue - } - - switch msg.Type { - case "input": - p.room.sendMessageToParticipant("server", string(message)) - case "docker": - p.room.sendMessageToParticipant("master", string(message)) - default: - p.room.broadcast <- string(message) - } - } -} - -func (r *Room) broadcastPump() { - for message := range r.broadcast { - log.Printf("> Broadcasting message to room %s: %s\n", r.name, message) - r.mutex.RLock() - for participant := range r.participants { - participant.send <- message - } - r.mutex.RUnlock() - } -} - -func (r *Room) removeParticipant(p *Participant) { - r.mutex.Lock() - delete(r.participants, p) - r.mutex.Unlock() - close(p.send) - log.Printf("> Participant %s left room %s\n", p.name, r.name) -} - -func (r *Room) sendMessageToParticipant(name string, message string) { - r.mutex.RLock() - for participant := range r.participants { - if participant.name == name { - participant.send <- message - log.Printf("Sent message to participant %s in room %s: %s\n", name, r.name, message) - return - } - } - r.mutex.RUnlock() - log.Printf("Participant %s not found in room %s\n", name, r.name) -} diff --git a/packages/relay/internal/whep.go b/packages/relay/internal/whep.go new file mode 100644 index 00000000..ccde0cdf --- /dev/null +++ b/packages/relay/internal/whep.go @@ -0,0 +1,173 @@ +package relay + +import ( + "encoding/json" + "fmt" + "io" + "log" + "net/http" + + "github.com/google/uuid" + "github.com/pion/webrtc/v4" +) + +// WHEP - WebRTC HTTP Egress Protocol +// This is the handler for the /api/whep/{roomName} endpoint +func whepHandler(w http.ResponseWriter, r *http.Request) { + // Get room name + roomName := r.PathValue("roomName") + if len(roomName) <= 0 { + logHTTPError(w, "no room name given", http.StatusBadRequest) + return + } + + // Make sure room exists + room, ok := Rooms[roomName] + if !ok { + logHTTPError(w, "no room with given name online", http.StatusNotFound) + return + } + + // Get body + body, err := io.ReadAll(r.Body) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Get SDP offer from body + sdpOffer := string(body) + if sdpOffer == "" { + logHTTPError(w, "SDP offer not set", http.StatusBadRequest) + return + } + + participantName := r.URL.Query().Get("name") + if participantName == "" { + participantName = uuid.New().String() + } + + // Callback for closing PeerConnection + onPCClose := func() { + if GetFlags().Verbose { + log.Println("Closed PeerConnection for participant: ", participantName, " - belonging to room: ", roomName) + } + room.removeParticipantByName(participantName) + } + + // Create new participant + if GetFlags().Verbose { + log.Println("New participant for room: ", roomName) + } + participant := NewParticipant(participantName) + + participant.PeerConnection, err = CreatePeerConnection(onPCClose) + if err != nil { + logHTTPError(w, err.Error(), http.StatusInternalServerError) + return + } + + participant.PeerConnection.OnDataChannel(func(d *webrtc.DataChannel) { + if GetFlags().Verbose { + log.Printf("New DataChannel '%s'-'%d'\n", d.Label(), d.ID()) + } + + // Register channel opening handling + d.OnOpen(func() { + if GetFlags().Verbose { + log.Printf("Data channel '%s'-'%d' open\n", d.Label(), d.ID()) + } + room.addParticipant(participant) + }) + + // Register text message handling + d.OnMessage(func(msg webrtc.DataChannelMessage) { + room.broadcastMessage(msg, participant.ID) // Exclude the sender + }) + + // Register channel closing handling + d.OnClose(func() { + if GetFlags().Verbose { + log.Printf("Data channel '%s'-'%d' closed\n", d.Label(), d.ID()) + } + room.removeParticipantByID(participant.ID) + }) + + participant.DataChannel = d + }) + + // Add room tracks for participant + if room.AudioTrack != nil { + if err = participant.addTrack(&room.AudioTrack); err != nil { + logHTTPError(w, "failed to add audio track to participant", http.StatusInternalServerError) + return + } + } else if GetFlags().Verbose { + log.Println("nil audio track for room: ", roomName) + } + if room.VideoTrack != nil { + if err = participant.addTrack(&room.VideoTrack); err != nil { + logHTTPError(w, "failed to add video track to participant", http.StatusInternalServerError) + return + } + } else if GetFlags().Verbose { + log.Println("nil video track for room: ", roomName) + } + + // Set new remote description + err = participant.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ + Type: webrtc.SDPTypeOffer, + SDP: sdpOffer, + }) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + gatherComplete := webrtc.GatheringCompletePromise(participant.PeerConnection) + + // Create Answer and set local description + answer, err := participant.PeerConnection.CreateAnswer(nil) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + err = participant.PeerConnection.SetLocalDescription(answer) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + <-gatherComplete + + localDesc := participant.PeerConnection.LocalDescription() + + // Create a struct to hold the description in a JSON-friendly format + descJSON := struct { + Type string `json:"type"` + Sdp string `json:"sdp"` + }{ + Type: localDesc.Type.String(), + Sdp: localDesc.SDP, + } + + jsonDesc, err := json.Marshal(descJSON) + if err != nil { + log.Println(err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + // Return SDP answer + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Location", fmt.Sprint("/api/whep/", roomName)) + w.WriteHeader(http.StatusCreated) + _, err = w.Write(jsonDesc) + if err != nil { + log.Println(err) + return + } +} diff --git a/packages/relay/internal/whip.go b/packages/relay/internal/whip.go new file mode 100644 index 00000000..74493aa8 --- /dev/null +++ b/packages/relay/internal/whip.go @@ -0,0 +1,161 @@ +package relay + +import ( + "errors" + "fmt" + "github.com/pion/webrtc/v4" + "io" + "log" + "net/http" + "strings" +) + +// WHIP - WebRTC HTTP Ingress Protocol +// This is the handler for the /api/whip/{roomName} endpoint +func whipHandler(w http.ResponseWriter, r *http.Request) { + // Get room name + roomName := r.PathValue("roomName") + if len(roomName) <= 0 { + logHTTPError(w, "no room name given", http.StatusBadRequest) + return + } + + // Get body + body, err := io.ReadAll(r.Body) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Get SDP offer from body + sdpOffer := string(body) + if sdpOffer == "" { + // If room exists, just return OK (force room close?) + if _, ok := Rooms[roomName]; ok { + w.WriteHeader(http.StatusOK) + return + } else { + logHTTPError(w, "SDP offer not set", http.StatusBadRequest) + return + } + } + + // Verify there's no existing room with same name + if _, ok := Rooms[roomName]; ok { + logHTTPError(w, "room name already in use", http.StatusBadRequest) + return + } + + // Callback for closing PeerConnection + onPCClose := func() { + if GetFlags().Verbose { + log.Println("Closed PeerConnection for room: ", roomName) + } + delete(Rooms, roomName) + } + + // Create a new room + if GetFlags().Verbose { + log.Println("Creating new room: ", roomName) + } + + var room *Room + if _, ok := Rooms[roomName]; !ok { + room = NewRoom(roomName) + Rooms[roomName] = room + if GetFlags().Verbose { + log.Printf("> Created new room %s\n", roomName) + } + } else { + logHTTPError(w, "Room with that name already exists", http.StatusBadRequest) + return + } + + room.PeerConnection, err = CreatePeerConnection(onPCClose) + if err != nil { + logHTTPError(w, err.Error(), http.StatusInternalServerError) + return + } + + // Modify SDP offer to remove opus "sprop-maxcapturerate=24000" (fixes opus bad quality issue, present in GStreamer) + sdpOffer = strings.Replace(sdpOffer, ";sprop-maxcapturerate=24000", "", -1) + + room.PeerConnection.OnTrack(func(remoteTrack *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) { + var localTrack *webrtc.TrackLocalStaticRTP + if remoteTrack.Kind() == webrtc.RTPCodecTypeVideo { + localTrack, err = webrtc.NewTrackLocalStaticRTP(remoteTrack.Codec().RTPCodecCapability, "video", fmt.Sprint("nestri-", roomName)) + if err != nil { + log.Println("Failed to create local video track for room: ", roomName, " - reason: ", err) + return + } + room.VideoTrack = localTrack + } else if remoteTrack.Kind() == webrtc.RTPCodecTypeAudio { + localTrack, err = webrtc.NewTrackLocalStaticRTP(remoteTrack.Codec().RTPCodecCapability, "audio", fmt.Sprint("nestri-", roomName)) + if err != nil { + log.Println("Failed to create local audio track for room: ", roomName, " - reason: ", err) + return + } + room.AudioTrack = localTrack + } + + // TODO: With custom (non-WHEP) viewer connections, notify them of new room to set their tracks + + rtpBuffer := make([]byte, 1400) + for { + read, _, err := remoteTrack.Read(rtpBuffer) + if err != nil { + // EOF is expected when stopping room + if !errors.Is(err, io.EOF) { + log.Println("RTP read error from room: ", roomName, " - ", err) + } + break + } + + _, err = localTrack.Write(rtpBuffer[:read]) + if err != nil && !errors.Is(err, io.ErrClosedPipe) { + log.Println("RTP write error from room: ", roomName, " - ", err) + break + } + } + // TODO: Cleanup track from participant for room restart + }) + + // Set new remote description + err = room.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ + Type: webrtc.SDPTypeOffer, + SDP: sdpOffer, + }) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + gatherComplete := webrtc.GatheringCompletePromise(room.PeerConnection) + + // Create Answer and set local description + answer, err := room.PeerConnection.CreateAnswer(nil) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + err = room.PeerConnection.SetLocalDescription(answer) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + <-gatherComplete + + // Return SDP answer + w.Header().Set("Content-Type", "application/sdp") + w.Header().Set("Location", fmt.Sprint("/api/whip/", roomName)) + w.WriteHeader(http.StatusCreated) + _, err = w.Write([]byte(room.PeerConnection.LocalDescription().SDP)) + if err != nil { + log.Println(err) + return + } +} diff --git a/packages/relay/main.go b/packages/relay/main.go index f72afd08..45951b00 100644 --- a/packages/relay/main.go +++ b/packages/relay/main.go @@ -14,8 +14,8 @@ func main() { signal.Notify(stopCh, os.Interrupt, syscall.SIGTERM) // Get flags and log them - relay.InitRelayFlags() - relay.GetRelayFlags().DebugLog() + relay.InitFlags() + relay.GetFlags().DebugLog() // Init WebRTC API err = relay.InitWebRTCAPI() diff --git a/packages/server/Cargo.toml b/packages/server/Cargo.toml index 49a6d7fd..720fb265 100644 --- a/packages/server/Cargo.toml +++ b/packages/server/Cargo.toml @@ -8,18 +8,19 @@ name = "nestri-server" path = "src/main.rs" [dependencies] -gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", version = "0.24.0" } +gst.workspace = true moq-gst = { git = "https://github.com/wanjohiryan/moq-gst", branch = "main" } -tokio = { version = "1.41.0", features = ["full"] } +tokio-tungstenite = { version = "0.24.0", features = ["native-tls"] } serde = {version = "1.0.214", features = ["derive"] } +tokio = { version = "1.41.0", features = ["full"] } +clap = { version = "4.5.20", features = ["env"] } tracing-subscriber = "0.3" futures-util = "0.3.31" serde_json = "1.0.132" -actix-web = "4.9.0" tracing = "0.1.40" -actix-ws = "0.3.0" +webrtc = "0.11.0" +reqwest = { version = "0.12", features = ["json"] } regex = "1.11.1" -clap = { version = "4.5.20", features = ["env"] } rand = "0.8.5" url = "2.5.3" -tokio-tungstenite = { version = "0.24.0", features = ["native-tls"] } +rustls = { version = "0.23.17", features = ["ring"] } diff --git a/packages/server/src/args.rs b/packages/server/src/args.rs index a2a7f462..353f921e 100644 --- a/packages/server/src/args.rs +++ b/packages/server/src/args.rs @@ -11,6 +11,7 @@ pub struct Args { pub device: device_args::DeviceArgs, pub encoding: encoding_args::EncodingArgs, } + impl Args { pub fn new() -> Self { let matches = Command::new("nestri-server") diff --git a/packages/server/src/main.rs b/packages/server/src/main.rs index 7b59e7e2..4a406808 100644 --- a/packages/server/src/main.rs +++ b/packages/server/src/main.rs @@ -2,43 +2,10 @@ mod args; mod enc_helper; mod gpu; -use std::collections::HashSet; -use std::sync::{Arc}; -use tokio_tungstenite::{connect_async, tungstenite::protocol::Message}; -use url::Url; - +use std::sync::Arc; use gst::prelude::*; -use serde::{Deserialize, Serialize}; -use std::time::{Duration, Instant}; -use futures_util::{SinkExt, StreamExt}; -use serde_json::from_str; -use tokio::sync::mpsc; use crate::args::{encoding_args, output_args}; - -#[derive(Serialize, Deserialize, Debug)] -#[serde(tag = "type")] -enum InputMessage { - #[serde(rename = "mousemove")] - MouseMove { x: i32, y: i32 }, - - #[serde(rename = "mousemoveabs")] - MouseMoveAbs { x: i32, y: i32 }, - - #[serde(rename = "wheel")] - Wheel { x: f64, y: f64 }, - - #[serde(rename = "mousedown")] - MouseDown { key: i32 }, - // Add other variants as needed - #[serde(rename = "mouseup")] - MouseUp { key: i32 }, - - #[serde(rename = "keydown")] - KeyDown { key: i32 }, - - #[serde(rename = "keyup")] - KeyUp { key: i32 }, -} +mod room; // Handles gathering GPU information and selecting the most suitable GPU fn handle_gpus(args: &args::Args) -> Option { @@ -169,6 +136,9 @@ async fn main() -> std::io::Result<()> { args.debug_print(); } + rustls::crypto::ring::default_provider().install_default() + .expect("Failed to install ring crypto provider"); + let _ = gst::init(); let _ = gstmoq::plugin_register_static(); @@ -231,19 +201,19 @@ async fn main() -> std::io::Result<()> { ! queue2 max-size-time=1000000 ! audioconvert \ ! {} bitrate={}000 \ ! pipend.", - if args.encoding.audio.capture_method == encoding_args::AudioCaptureMethod::PulseAudio { - "pulsesrc" - } else if args.encoding.audio.capture_method == encoding_args::AudioCaptureMethod::PipeWire { - "pipewiresrc" - } else { - "alsasrc" - }, - audio_encoder, - match &args.encoding.audio.rate_control { - encoding_args::RateControl::CBR(cbr) => cbr.target_bitrate, - encoding_args::RateControl::VBR(vbr) => vbr.target_bitrate, - _ => 128, - } + if args.encoding.audio.capture_method == encoding_args::AudioCaptureMethod::PulseAudio { + "pulsesrc" + } else if args.encoding.audio.capture_method == encoding_args::AudioCaptureMethod::PipeWire { + "pipewiresrc" + } else { + "alsasrc" + }, + audio_encoder, + match &args.encoding.audio.rate_control { + encoding_args::RateControl::CBR(cbr) => cbr.target_bitrate, + encoding_args::RateControl::VBR(vbr) => vbr.target_bitrate, + _ => 128, + } ).to_string(); // Construct the pipeline string @@ -280,10 +250,6 @@ async fn main() -> std::io::Result<()> { let _ = pipeline.set_state(gst::State::Playing); let pipeline_clone = Arc::new(tokio::sync::Mutex::new(pipeline.clone())); - // let app_state = web::Data::new(AppState { - // pipeline: Arc::new(Mutex::new(pipeline.clone())), - // }); - let pipeline_thread = pipeline.clone(); std::thread::spawn(move || { @@ -318,196 +284,18 @@ async fn main() -> std::io::Result<()> { let _ = pipeline.set_state(gst::State::Null); }); - //TODO: Get this from the CLI - let server = "server"; - let url_string = format!("{}/parties/main/{}?_pk={}", args.app.input_server, args.app.room, server); - - let mut socket = None; - let start_time = Instant::now(); - let retry_duration = Duration::from_secs(30); - - while socket.is_none() && start_time.elapsed() < retry_duration { - match Url::parse(&url_string) { - Ok(url) => { - match connect_async(url.as_str()).await { - Ok((ws_stream, _)) => { - println!("[websocket]: Connected to the server"); - socket = Some(ws_stream); - } - Err(e) => { - eprintln!("[websocket]: Error connecting: {}", e); - tokio::time::sleep(Duration::from_secs(1)).await; - } - } - } - Err(e) => { - eprintln!("Invalid URL: {}", e); - break; // Exit if the URL is invalid - } - } - } - - // Create an async channel for sending events to the pipeline - let (event_tx, mut event_rx) = mpsc::channel(10); - - // A shared state to track currently pressed keys - let pressed_keys = Arc::new(tokio::sync::Mutex::new(HashSet::new())); - - // Spawn a task to process events for the pipeline - let pipeline_task = { - let pipeline = Arc::clone(&pipeline_clone); - tokio::spawn(async move { - while let Some(event) = event_rx.recv().await { - let pipeline = pipeline.lock().await; - pipeline.send_event(event); - } - }) - }; - - if let Some(socket) = socket { - let (mut ws_sink, mut ws_stream) = socket.split(); - - // Start the heartbeat task - let heartbeat_interval = Duration::from_secs(10); // Send a Ping every 10 seconds - let heartbeat_timeout = Duration::from_secs(20); // Consider the connection dead if no Pong within 20 seconds - - println!("Spawning heartbeat task"); - let heartbeat_task = tokio::spawn(async move { - let mut interval = tokio::time::interval(heartbeat_interval); - loop { - interval.tick().await; - - match tokio::time::timeout(heartbeat_timeout, ws_sink.send(Message::Ping(Vec::new()))).await { - Ok(Ok(_)) => {} - Ok(Err(e)) => { - eprintln!("[heartbeat]: Failed to send Ping: {}", e); - break; - } - Err(_) => { - eprintln!("[heartbeat]: Pong not received within timeout"); - break; - } - } - } - println!("[heartbeat]: Exiting heartbeat task"); - }); - - while let Some(msg) = ws_stream.next().await { - match msg { - Ok(Message::Text(txt)) => { - let event_tx = event_tx.clone(); - let pressed_keys = Arc::clone(&pressed_keys); - - // Spawn a task to handle the input message - tokio::spawn(async move { - if let Ok(input_msg) = from_str::(&txt) { - if let Some(event) = handle_input_message(input_msg, &pressed_keys).await { - event_tx.send(event).await.unwrap(); - } - } - }); - } - Ok(Message::Ping(_)) => { - // Since we do our heartbeat logic above, no need to respond? - //ws_sink.send(Message::Pong(bytes)).await.unwrap(); - } - Ok(Message::Pong(_)) => { - // Spammy if kept on - //println!("[websocket]: Received Pong"); - } - Ok(Message::Close(reason)) => { - println!("WebSocket closed: {:?}", reason); - break; - } - Err(e) => { - eprintln!("Error reading WebSocket message: {}", e); - } - _ => {} - } - } - - pipeline_task.await?; - - // Abort on exit to cleanup - heartbeat_task.abort(); - } else { - eprintln!("[websocket]: Could not connect to the server within 30 seconds."); + // Get a room + let mut relay_url = "".to_string(); + if let output_args::OutputOption::WHIP(whipargs) = &args.output { + relay_url = format!( + " + {}/api/whep/{} + ", + whipargs.endpoint, args.app.room + ); } + let mut room_handler = room::Room::new(relay_url, pipeline_clone).await?; + room_handler.run().await?; Ok(()) } - -async fn handle_input_message( - input_msg: InputMessage, - pressed_keys: &Arc>>, -) -> Option { - match input_msg { - InputMessage::MouseMove { x, y } => { - let structure = gst::Structure::builder("MouseMoveRelative") - .field("pointer_x", x as f64) - .field("pointer_y", y as f64) - .build(); - - Some(gst::event::CustomUpstream::new(structure)) - } - InputMessage::MouseMoveAbs { x, y } => { - let structure = gst::Structure::builder("MouseMoveAbsolute") - .field("pointer_x", x as f64) - .field("pointer_y", y as f64) - .build(); - - Some(gst::event::CustomUpstream::new(structure)) - } - InputMessage::KeyDown { key } => { - let mut keys = pressed_keys.lock().await; - // If the key is already pressed, return to prevent key lockup - if keys.contains(&key) { - return None; - } - keys.insert(key); - - let structure = gst::Structure::builder("KeyboardKey") - .field("key", key as u32) - .field("pressed", true) - .build(); - - Some(gst::event::CustomUpstream::new(structure)) - } - InputMessage::KeyUp { key } => { - let mut keys = pressed_keys.lock().await; - // Remove the key from the pressed state when released - keys.remove(&key); - - let structure = gst::Structure::builder("KeyboardKey") - .field("key", key as u32) - .field("pressed", false) - .build(); - - Some(gst::event::CustomUpstream::new(structure)) - } - InputMessage::Wheel { x, y } => { - let structure = gst::Structure::builder("MouseAxis") - .field("x", x as f64) - .field("y", y as f64) - .build(); - - Some(gst::event::CustomUpstream::new(structure)) - } - InputMessage::MouseDown { key } => { - let structure = gst::Structure::builder("MouseButton") - .field("button", key as u32) - .field("pressed", true) - .build(); - - Some(gst::event::CustomUpstream::new(structure)) - } - InputMessage::MouseUp { key } => { - let structure = gst::Structure::builder("MouseButton") - .field("button", key as u32) - .field("pressed", false) - .build(); - - Some(gst::event::CustomUpstream::new(structure)) - } - } -} diff --git a/packages/server/src/room.rs b/packages/server/src/room.rs new file mode 100644 index 00000000..3c70c3bd --- /dev/null +++ b/packages/server/src/room.rs @@ -0,0 +1,335 @@ +use gst::prelude::*; +use reqwest; +use std::collections::HashSet; +use std::io; +use std::sync::Arc; +use tokio::sync::mpsc; +use tokio::sync::Mutex; +use tokio::time::Duration; +use webrtc::api::interceptor_registry::register_default_interceptors; +// use std::collections::HashSet; +use serde::{Deserialize, Serialize}; +use serde_json::from_str; +use webrtc::api::media_engine::MediaEngine; +use webrtc::api::APIBuilder; +use webrtc::data_channel::data_channel_message::DataChannelMessage; +use webrtc::ice_transport::ice_server::RTCIceServer; +use webrtc::interceptor::registry::Registry; +use webrtc::peer_connection::configuration::RTCConfiguration; +use webrtc::peer_connection::math_rand_alpha; +use webrtc::peer_connection::peer_connection_state::RTCPeerConnectionState; +use webrtc::peer_connection::sdp::session_description::RTCSessionDescription; + +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "type")] +enum InputMessage { + #[serde(rename = "mousemove")] + MouseMove { x: i32, y: i32 }, + + #[serde(rename = "mousemoveabs")] + MouseMoveAbs { x: i32, y: i32 }, + + #[serde(rename = "wheel")] + Wheel { x: f64, y: f64 }, + + #[serde(rename = "mousedown")] + MouseDown { key: i32 }, + // Add other variants as needed + #[serde(rename = "mouseup")] + MouseUp { key: i32 }, + + #[serde(rename = "keydown")] + KeyDown { key: i32 }, + + #[serde(rename = "keyup")] + KeyUp { key: i32 }, +} + +pub struct Room { + peer_connection: Arc, + data_channel: Arc, + done_tx: mpsc::Sender<()>, + done_rx: mpsc::Receiver<()>, + relay_url: String, + pipeline: Arc>, +} + +impl Room { + pub async fn new( + relay_url: String, + pipeline: Arc>, + ) -> io::Result { + // Create a MediaEngine object to configure the supported codec + let mut m = MediaEngine::default(); + + // Register default codecs + let _ = m.register_default_codecs().map_err(map_to_io_error)?; + + let mut registry = Registry::new(); + + // Use the default set of Interceptors + registry = register_default_interceptors(registry, &mut m).map_err(map_to_io_error)?; + + // Create the API object with the MediaEngine + let api = APIBuilder::new() + .with_media_engine(m) + .with_interceptor_registry(registry) + .build(); + + // Prepare the configuration + let config = RTCConfiguration { + ice_servers: vec![RTCIceServer { + urls: vec!["stun:stun.l.google.com:19302".to_owned()], + ..Default::default() + }], + ..Default::default() + }; + + // Create a new RTCPeerConnection + let peer_connection = Arc::new( + api.new_peer_connection(config) + .await + .map_err(map_to_io_error)?, + ); + + // Create a datachannel with label 'data' + let data_channel = peer_connection + .create_data_channel("input", None) + .await + .map_err(map_to_io_error)?; + + let (done_tx, done_rx) = mpsc::channel::<()>(1); + + let done_tx_clone = done_tx.clone(); + // Peer connection state change handler + peer_connection.on_peer_connection_state_change(Box::new( + move |s: RTCPeerConnectionState| { + println!("Peer Connection State has changed: {s}"); + + if s == RTCPeerConnectionState::Failed { + println!("Peer Connection has gone to failed exiting"); + let _ = done_tx_clone.try_send(()); + } + + Box::pin(async {}) + }, + )); + + Ok(Self { + peer_connection, + pipeline, + data_channel, + done_tx, + done_rx, + relay_url, + }) + } + + pub async fn run(&mut self) -> io::Result<()> { + // Create an async channel for sending events to the pipeline + let (event_tx, mut event_rx) = mpsc::channel(10); + + // A shared state to track currently pressed keys + let pressed_keys = Arc::new(tokio::sync::Mutex::new(HashSet::new())); + + // Spawn a task to process events for the pipeline + let pipeline_task = { + // let pipeline = Arc::clone(self.pipeline); + let pipeline_clone = self.pipeline.clone(); + tokio::spawn(async move { + while let Some(event) = event_rx.recv().await { + let pipeline = pipeline_clone.lock().await; + pipeline.send_event(event); + } + }) + }; + + let data_channel = self.data_channel.clone(); + //TODO: Handle heartbeats here + // let d1 = Arc::clone(&self.data_channel); + // data_channel.on_open(Box::new(move || { + // println!("Data channel '{}'-'{}' open. Random messages will now be sent to any connected DataChannels every 5 seconds", d1.label(), d1.id()); + + // let d2 = Arc::clone(&d1); + // Box::pin(async move { + // let mut result = std::io::Result::::Ok(0); + // while result.is_ok() { + // let timeout = tokio::time::sleep(Duration::from_secs(5)); + // tokio::pin!(timeout); + + // tokio::select! { + // _ = timeout.as_mut() =>{ + // let message = math_rand_alpha(15); + // println!("Sending '{message}'"); + // result = d2.send_text(message).await.map_err(map_to_io_error); + // } + // }; + // } + // }) + // })); + + // Data channel message handler + let d_label = data_channel.label().to_owned(); + data_channel.on_message(Box::new(move |msg: DataChannelMessage| { + let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); + println!("Message from DataChannel '{d_label}': '{msg_str}'"); + + let event_tx = event_tx.clone(); + let pressed_keys = Arc::clone(&pressed_keys); + + tokio::spawn(async move { + if let Ok(input_msg) = from_str::(&msg_str) { + if let Some(event) = handle_input_message(input_msg, &pressed_keys).await { + event_tx.send(event).await.unwrap(); + } + } + }); + + Box::pin(async {}) + })); + + // Create an offer to send to the browser + let offer = self + .peer_connection + .create_offer(None) + .await + .map_err(map_to_io_error)?; + + // Create channel that is blocked until ICE Gathering is complete + let mut gather_complete = self.peer_connection.gathering_complete_promise().await; + + // Sets the LocalDescription, and starts our UDP listeners + self.peer_connection + .set_local_description(offer) + .await + .map_err(map_to_io_error)?; + + // Block until ICE Gathering is complete, disabling trickle ICE + // we do this because we only can exchange one signaling message + // in a production application you should exchange ICE Candidates via OnICECandidate + let _ = gather_complete.recv().await; + + if let Some(local_description) = self.peer_connection.local_description().await { + let url = format!("{}",self.relay_url); + let response = reqwest::Client::new() + .post(&url) + .header("Content-Type", "application/sdp") + .body(local_description.sdp.clone()) // clone if you don't want to move offer.sdp + .send() + .await + .map_err(map_to_io_error)?; + + let answer = response + .json::() + .await + .map_err(map_to_io_error)?; + + self.peer_connection + .set_remote_description(answer) + .await + .map_err(map_to_io_error)?; + } else { + println!("generate local_description failed!"); + }; + + println!("Press ctrl-c to stop"); + + tokio::select! { + _ = self.done_rx.recv() => { + println!("received done signal!"); + } + _ = tokio::signal::ctrl_c() => { + println!(); + } + }; + + self.peer_connection + .close() + .await + .map_err(map_to_io_error)?; + + //FIXME: Ctr + C is not working... i suspect it has something to do with this guy -- Do not forget to fix packages/server/room.rs as well + + pipeline_task.await?; + Ok(()) + } +} + +fn map_to_io_error(e: E) -> io::Error { + io::Error::new(io::ErrorKind::Other, format!("{}", e)) +} + +async fn handle_input_message( + input_msg: InputMessage, + pressed_keys: &Arc>>, +) -> Option { + match input_msg { + InputMessage::MouseMove { x, y } => { + let structure = gst::Structure::builder("MouseMoveRelative") + .field("pointer_x", x as f64) + .field("pointer_y", y as f64) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::MouseMoveAbs { x, y } => { + let structure = gst::Structure::builder("MouseMoveAbsolute") + .field("pointer_x", x as f64) + .field("pointer_y", y as f64) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::KeyDown { key } => { + let mut keys = pressed_keys.lock().await; + // If the key is already pressed, return to prevent key lockup + if keys.contains(&key) { + return None; + } + keys.insert(key); + + let structure = gst::Structure::builder("KeyboardKey") + .field("key", key as u32) + .field("pressed", true) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::KeyUp { key } => { + let mut keys = pressed_keys.lock().await; + // Remove the key from the pressed state when released + keys.remove(&key); + + let structure = gst::Structure::builder("KeyboardKey") + .field("key", key as u32) + .field("pressed", false) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::Wheel { x, y } => { + let structure = gst::Structure::builder("MouseAxis") + .field("x", x as f64) + .field("y", y as f64) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::MouseDown { key } => { + let structure = gst::Structure::builder("MouseButton") + .field("button", key as u32) + .field("pressed", true) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::MouseUp { key } => { + let structure = gst::Structure::builder("MouseButton") + .field("button", key as u32) + .field("pressed", false) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + } +} diff --git a/partykit.json b/partykit.json deleted file mode 100644 index fc552732..00000000 --- a/partykit.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://www.partykit.io/schema.json", - "name": "nestri-party", - "main": "packages/party/index.ts", - "compatibilityDate": "2024-11-14" -} From ed9b48de432432845b20d9900b73f4ded6e9bb98 Mon Sep 17 00:00:00 2001 From: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Date: Fri, 22 Nov 2024 23:30:15 +0200 Subject: [PATCH 36/43] =?UTF-8?q?=F0=9F=90=9B=20fix:=20Fixes=20to=20server?= =?UTF-8?q?=20deadlocking,=20fixes=20and=20improvements=20to=20container?= =?UTF-8?q?=20files=20(#136)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: DatCaptainHorse --- Cargo.toml | 2 +- Containerfile.relay | 2 +- Containerfile.runner | 121 ++++++++----- apps/www/src/root.tsx | 2 +- apps/www/src/routes/play/[id]/index.tsx | 5 +- packages/relay/internal/common.go | 17 ++ packages/scripts/envs.sh | 12 ++ packages/server/src/args.rs | 60 +------ packages/server/src/args/app_args.rs | 11 +- packages/server/src/args/output_args.rs | 58 ------ packages/server/src/enc_helper.rs | 20 +++ packages/server/src/main.rs | 226 ++++++++++++++++-------- packages/server/src/room.rs | 204 +++++++-------------- packages/ui/globals.css | 5 + packages/ui/src/nav-bar.tsx | 2 +- 15 files changed, 368 insertions(+), 379 deletions(-) create mode 100644 packages/scripts/envs.sh delete mode 100644 packages/server/src/args/output_args.rs diff --git a/Cargo.toml b/Cargo.toml index c2e11031..81dd2c67 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = [ +members = [ "packages/server", "packages/relay/dev" ] diff --git a/Containerfile.relay b/Containerfile.relay index 7fda0ba7..ee36a64e 100644 --- a/Containerfile.relay +++ b/Containerfile.relay @@ -1,6 +1,6 @@ FROM docker.io/golang:1.23-alpine AS go-build WORKDIR /builder -COPY packages/webrtc-relay/ /builder/ +COPY packages/relay/ /builder/ RUN go build FROM docker.io/golang:1.23-alpine diff --git a/Containerfile.runner b/Containerfile.runner index cf37f689..0b7c28d7 100644 --- a/Containerfile.runner +++ b/Containerfile.runner @@ -14,7 +14,7 @@ RUN pacman -Syu --noconfirm meson pkgconf cmake git gcc make rustup \ # Setup stable rust toolchain # RUN rustup default stable # Clone nestri source # -RUN git clone -b feat/rooms https://github.com/nestriness/nestri.git +RUN git clone -b feat/stream https://github.com/nestriness/nestri.git # Build nestri # RUN cd nestri/packages/server/ && \ @@ -48,55 +48,53 @@ RUN mkdir plugin && \ #****************************************************************************** FROM ${BASE_IMAGE} AS runtime -## Overridable Runtime Parameters ## +## Nestri Env Variables ## ENV NESTRI_PARAMS="" +ENV RESOLUTION="1280x720" + +## Install Graphics, Media, and Audio packages ## +RUN pacman -Syu --noconfirm --needed \ + # Graphics packages + sudo mesa mesa-utils xorg-xwayland labwc wlr-randr mangohud \ + # Vulkan drivers + vulkan-intel vulkan-radeon nvidia-utils \ + # Media encoding packages + vpl-gpu-rt intel-media-driver libva-utils \ + # GStreamer plugins + gstreamer gst-plugins-base gst-plugins-good \ + gst-plugin-va gst-plugins-bad gst-plugin-fmp4 \ + gst-plugin-qsv gst-plugin-pipewire gst-plugin-rswebrtc \ + # Audio packages + pipewire pipewire-pulse pipewire-alsa wireplumber \ + # Other requirements + supervisor \ + # Custom + umu-launcher && \ + # Clean up pacman cache and unnecessary files + pacman -Scc --noconfirm && \ + rm -rf /var/cache/pacman/pkg/* /tmp/* /var/tmp/* && \ + # Optionally clean documentation, man pages, and locales + find /usr/share/locale -mindepth 1 -maxdepth 1 ! -name "en*" -exec rm -rf {} + && \ + rm -rf /usr/share/doc /usr/share/man /usr/share/info -## Graphics ## -# Grab display packages (mesa, wayland things) # -RUN pacman -Syu --noconfirm sudo mesa mesa-utils xorg-xwayland cage -# Vulkan drivers # -# Intel -RUN pacman -Syu --noconfirm vulkan-intel -# AMD/ATI -RUN pacman -Syu --noconfirm vulkan-radeon -# NVIDIA -RUN pacman -Syu --noconfirm nvidia-utils - -## Media / Encoding ## -# Grab GPU encoding packages # -# Intel (modern VPL + VA-API) -RUN pacman -Syu --noconfirm vpl-gpu-rt intel-media-driver -# AMD/ATI (VA-API) -RUN pacman -Syu --noconfirm libva-mesa-driver -# NVIDIA (proprietary) -RUN pacman -Syu --noconfirm nvidia-utils -# Extras (debugging) -RUN pacman -Syu --noconfirm libva-utils - -# Grab gstreamer packages # -RUN pacman -Syu --noconfirm gstreamer gst-plugins-base gst-plugins-good \ - gst-plugin-va gst-plugins-bad gst-plugin-fmp4 gst-plugin-qsv gst-plugin-pipewire gst-plugin-rswebrtc - -## Audio ## -# Grab audio packages # -RUN pacman -Syu --noconfirm pipewire pipewire-pulse pipewire-alsa wireplumber ## User ## # Create and setup user # ENV USER="nestri" \ - USER_ID=1234 \ + UID=99 \ + GID=100 \ USER_PASSWORD="nestri1234" \ USER_HOME="/home/nestri" RUN mkdir -p ${USER_HOME} && \ - useradd -d ${USER_HOME} -u ${USER_ID} -s /bin/bash ${USER} && \ + useradd -d ${USER_HOME} -u ${UID} -s /bin/bash ${USER} && \ chown -R ${USER} ${USER_HOME} && \ echo "${USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \ echo "${USER}:${USER_PASSWORD}" | chpasswd # Run directory # -RUN mkdir -p /run/user/${USER_ID} && \ - chown ${USER}:${USER} /run/user/${USER_ID} +RUN mkdir -p /run/user/${UID} && \ + chown ${USER}:${USER} /run/user/${UID} # Home config directory # RUN mkdir -p ${USER_HOME}/.config && \ @@ -118,9 +116,10 @@ COPY --from=gstwayland-builder /builder/plugin/lib/gstreamer-1.0/libgstwayland* COPY --from=gstwayland-builder /builder/plugin/lib/pkgconfig/gstwayland* /usr/lib/pkgconfig/ COPY --from=gstwayland-builder /builder/plugin/lib/pkgconfig/libgstwayland* /usr/lib/pkgconfig/ +## Copy scripts ## +COPY packages/scripts/ /etc/nestri/ + ## Startup ## -# Grab supervisor package # -RUN pacman -Syu --noconfirm supervisor # Setup supervisor # RUN <<-EOF echo -e " @@ -134,15 +133,26 @@ logfile=/tmp/supervisord.log user=root command=dbus-daemon --system --nofork --nopidfile logfile=/tmp/dbus.log +autoerestart=true autostart=true startretries=3 priority=1 +[program:seatd] +user=root +command=seatd +logfile=/tmp/seatd.log +autoerestart=true +autostart=true +startretries=3 +priority=2 + [program:pipewire] user=nestri command=dbus-launch pipewire -environment=XDG_RUNTIME_DIR=\"/run/user/${USER_ID}\",HOME=\"${USER_HOME}\" +environment=XDG_RUNTIME_DIR=\"/run/user/${UID}\",HOME=\"${USER_HOME}\" logfile=/tmp/pipewire.log +autoerestart=true autostart=true startretries=3 priority=10 @@ -150,8 +160,9 @@ priority=10 [program:pipewire-pulse] user=nestri command=dbus-launch pipewire-pulse -environment=XDG_RUNTIME_DIR=\"/run/user/${USER_ID}\",HOME=\"${USER_HOME}\" +environment=XDG_RUNTIME_DIR=\"/run/user/${UID}\",HOME=\"${USER_HOME}\" logfile=/tmp/pipewire-pulse.log +autoerestart=true autostart=true startretries=3 priority=20 @@ -159,8 +170,9 @@ priority=20 [program:wireplumber] user=nestri command=dbus-launch wireplumber -environment=XDG_RUNTIME_DIR=\"/run/user/${USER_ID}\",HOME=\"${USER_HOME}\" +environment=XDG_RUNTIME_DIR=\"/run/user/${UID}\",HOME=\"${USER_HOME}\" logfile=/tmp/wireplumber.log +autoerestart=true autostart=true startretries=3 priority=30 @@ -168,11 +180,32 @@ priority=30 [program:nestri-server] user=nestri command=sh -c 'nestri-server \$NESTRI_PARAMS' -environment=XDG_RUNTIME_DIR=\"/run/user/${USER_ID}\",HOME=\"${USER_HOME}\" +environment=XDG_RUNTIME_DIR=\"/run/user/${UID}\",HOME=\"${USER_HOME}\" logfile=/tmp/nestri-server.log +autoerestart=true autostart=true startretries=3 -priority=100 +priority=50 + +[program:labwc] +user=nestri +command=sh -c 'sleep 4 && rm -rf /tmp/.X11-unix && mkdir -p /tmp/.X11-unix && chown nestri:nestri /tmp/.X11-unix && labwc' +environment=XDG_RUNTIME_DIR=\"/run/user/${UID}\",HOME=\"${USER_HOME}\",WAYLAND_DISPLAY=\"wayland-1\",WLR_BACKENDS=\"wayland\",WLR_RENDERER=\"vulkan\" +logfile=/tmp/labwc.log +autoerestart=true +autostart=true +startretries=5 +priority=60 + +[program:wlrrandr] +user=nestri +command=sh -c 'sleep 6 && wlr-randr --output WL-1 --custom-mode \$RESOLUTION && read -n 1' +environment=XDG_RUNTIME_DIR=\"/run/user/${UID}\",HOME=\"${USER_HOME}\",WAYLAND_DISPLAY=\"wayland-0\" +logfile=/tmp/wlrrandr.log +autoerestart=true +autostart=true +startretries=10 +priority=70 " | tee /etc/supervisord.conf EOF @@ -182,8 +215,4 @@ RUN sed -z -i 's/{[[:space:]]*name = node\/suspend-node\.lua,[[:space:]]*type = # Remove "hooks.node.suspend" want RUN sed -i '/wants = \[/{s/hooks\.node\.suspend\s*//; s/,\s*\]/]/}' /usr/share/wireplumber/wireplumber.conf -# Make sure couple directories are present # -RUN mkdir -p /tmp/.X11-unix && \ - chown nestri:nestri /tmp/.X11-unix - ENTRYPOINT ["supervisord", "-c", "/etc/supervisord.conf"] diff --git a/apps/www/src/root.tsx b/apps/www/src/root.tsx index b9f71f3a..b7851bae 100644 --- a/apps/www/src/root.tsx +++ b/apps/www/src/root.tsx @@ -34,7 +34,7 @@ export default component$(() => { {/* {!isDev && } */} diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index d1b398e6..1ad63067 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -17,7 +17,7 @@ export default component$(() => { video = document.createElement("video"); video.id = "stream-video-player"; video.style.visibility = "hidden"; - const webrtc = new WebRTCStream("http://localhost:8088"); // or http://localhost:8088 + const webrtc = new WebRTCStream("https://nestri-relay.brumbas.se"); // or http://localhost:8088 webrtc.connect(id).then(() => { const mediaStream = webrtc.getMediaStream(); console.log("Setting mediastream"); @@ -92,9 +92,8 @@ export default component$(() => { canvas.value.requestPointerLock(); } }} - //TODO: Fix the canvas issues //TODO: go full screen, then lock on "landscape" screen-orientation on mobile - class="aspect-video h-screen w-auto" /> + class="aspect-video h-full w-full object-contain max-h-screen"/> ) }) diff --git a/packages/relay/internal/common.go b/packages/relay/internal/common.go index 5113387d..ec5ed31a 100644 --- a/packages/relay/internal/common.go +++ b/packages/relay/internal/common.go @@ -28,6 +28,23 @@ func InitWebRTCAPI() error { return err } + // Add H.265 for special cases + videoRTCPFeedback := []webrtc.RTCPFeedback{{"goog-remb", ""}, {"ccm", "fir"}, {"nack", ""}, {"nack", "pli"}} + for _, codec := range []webrtc.RTPCodecParameters{ + { + RTPCodecCapability: webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeH265, ClockRate: 90000, RTCPFeedback: videoRTCPFeedback}, + PayloadType: 48, + }, + { + RTPCodecCapability: webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeRTX, ClockRate: 90000, SDPFmtpLine: "apt=48"}, + PayloadType: 49, + }, + } { + if err := mediaEngine.RegisterCodec(codec, webrtc.RTPCodecTypeVideo); err != nil { + return err + } + } + // Interceptor registry interceptorRegistry := &interceptor.Registry{} diff --git a/packages/scripts/envs.sh b/packages/scripts/envs.sh new file mode 100644 index 00000000..b9d08af5 --- /dev/null +++ b/packages/scripts/envs.sh @@ -0,0 +1,12 @@ +#!/bin/bash -e + +export XDG_RUNTIME_DIR=/run/user/${UID}/ +export WAYLAND_DISPLAY=wayland-0 +export DISPLAY=:0 +export $(dbus-launch) + +# Fixes freezing issue +export PROTON_NO_FSYNC=1 + +# Our preferred prefix +export WINEPREFIX=${USER_HOME}/.nestripfx/ diff --git a/packages/server/src/args.rs b/packages/server/src/args.rs index 353f921e..84b6dc93 100644 --- a/packages/server/src/args.rs +++ b/packages/server/src/args.rs @@ -1,13 +1,11 @@ use clap::{Arg, Command}; pub mod app_args; -pub mod output_args; pub mod device_args; pub mod encoding_args; pub struct Args { pub app: app_args::AppArgs, - pub output: output_args::OutputOption, pub device: device_args::DeviceArgs, pub encoding: encoding_args::EncodingArgs, } @@ -39,6 +37,13 @@ impl Args { .help("Debug latency by showing time on feed") .default_value("false"), ) + .arg( + Arg::new("relay-url") + .short('u') + .long("relay-url") + .env("RELAY_URL") + .help("Nestri relay URL") + ) .arg( Arg::new("resolution") .short('r') @@ -55,13 +60,6 @@ impl Args { .help("Display/stream framerate") .default_value("60"), ) - .arg( - Arg::new("input-server") - .long("input-server") - .env("INPUT_SERVER") - .help("Input server address") - .default_value("ws://localhost:1999"), - ) .arg( Arg::new("room") .long("room") @@ -106,7 +104,7 @@ impl Args { .short('c') .long("video-codec") .env("VIDEO_CODEC") - .help("Preferred video codec ('h264', 'av1')") + .help("Preferred video codec ('h264', 'h265', 'av1')") .default_value("h264"), ) .arg( @@ -202,51 +200,10 @@ impl Args { .help("Maximum bitrate in kbps") .default_value("192"), ) - .arg( - Arg::new("output") - .short('o') - .long("output") - .env("OUTPUT") - .help("Output type (e.g. 'moq', 'whip')") - .default_value("whip"), - ) - .arg( - Arg::new("moq-relay") - .short('m') - .long("moq-relay") - .env("MOQ_RELAY") - .help("MoQ relay URL") - .default_value("https://relay.dathorse.com:8443"), - ) - .arg( - Arg::new("moq-path") - .short('p') - .long("moq-path") - .env("MOQ_PATH") - .help("MoQ relay path/namespace/broadcast") - .default_value("teststream"), - ) - .arg( - Arg::new("whip-endpoint") - .short('w') - .long("whip-endpoint") - .env("WHIP_ENDPOINT") - .help("WebRTC WHIP endpoint") - .default_value("https://relay.dathorse.com/whip"), - ) - .arg( - Arg::new("whip-auth-token") - .short('y') - .long("whip-auth-token") - .env("WHIP_AUTH_TOKEN") - .help("WebRTC WHIP auth token") - .default_value(""), - ) .get_matches(); Self { app: app_args::AppArgs::from_matches(&matches), - output: output_args::OutputOption::from_matches(&matches), device: device_args::DeviceArgs::from_matches(&matches), encoding: encoding_args::EncodingArgs::from_matches(&matches), } @@ -254,7 +211,6 @@ impl Args { pub fn debug_print(&self) { self.app.debug_print(); - self.output.debug_print(); self.device.debug_print(); self.encoding.debug_print(); } diff --git a/packages/server/src/args/app_args.rs b/packages/server/src/args/app_args.rs index eb371686..479d537b 100644 --- a/packages/server/src/args/app_args.rs +++ b/packages/server/src/args/app_args.rs @@ -11,8 +11,8 @@ pub struct AppArgs { /// Virtual display framerate pub framerate: u32, - /// Input server address - pub input_server: String, + /// Nestri relay url + pub relay_url: String, /// Nestri room name/identifier pub room: String, } @@ -38,10 +38,7 @@ impl AppArgs { .unwrap() .parse::() .unwrap(), - input_server: matches - .get_one::("input-server") - .unwrap_or(&"".to_string()) - .clone(), + relay_url: matches.get_one::("relay-url").unwrap().clone(), // Generate random room name if not provided room: matches.get_one::("room") .unwrap_or(&rand::random::().to_string()) @@ -56,7 +53,7 @@ impl AppArgs { println!("> debug_latency: {}", self.debug_latency); println!("> resolution: {}x{}", self.resolution.0, self.resolution.1); println!("> framerate: {}", self.framerate); - println!("> input server: {}", self.input_server); + println!("> relay_url: {}", self.relay_url); println!("> room: {}", self.room); } } diff --git a/packages/server/src/args/output_args.rs b/packages/server/src/args/output_args.rs deleted file mode 100644 index 85c2a424..00000000 --- a/packages/server/src/args/output_args.rs +++ /dev/null @@ -1,58 +0,0 @@ -pub struct MoQOutputArgs { - /// Relay server URL (e.g. "https://relay.example.com") - pub relay_url: String, -} -impl MoQOutputArgs { - pub fn from_matches(matches: &clap::ArgMatches) -> Self { - Self { - relay_url: matches.get_one::("moq-relay").unwrap().clone(), - } - } -} - -pub struct WebRTCWHIPOutputArgs { - /// WHIP endpoint - pub endpoint: String, - /// WHIP auth token - pub auth_token: String, -} -impl WebRTCWHIPOutputArgs { - pub fn from_matches(matches: &clap::ArgMatches) -> Self { - Self { - endpoint: matches.get_one::("whip-endpoint").unwrap().clone(), - auth_token: matches.get_one::("whip-auth-token").unwrap().clone(), - } - } -} - -pub enum OutputOption { - /// MoQ (Media over QUIC) output - MoQ(MoQOutputArgs), - /// WebRTC WHIP output - WHIP(WebRTCWHIPOutputArgs), -} -impl OutputOption { - pub fn from_matches(matches: &clap::ArgMatches) -> Self { - match matches.get_one::("output").unwrap().as_str() { - "moq" => OutputOption::MoQ(MoQOutputArgs::from_matches(matches)), - "whip" => OutputOption::WHIP(WebRTCWHIPOutputArgs::from_matches(matches)), - // Default to WHIP - _ => OutputOption::WHIP(WebRTCWHIPOutputArgs::from_matches(matches)), - } - } - - pub fn debug_print(&self) { - println!("OutputArgs:"); - match self { - OutputOption::MoQ(args) => { - println!("> MoQ:"); - println!("-> relay_url: {}", args.relay_url); - } - OutputOption::WHIP(args) => { - println!("> WHIP:"); - println!("-> endpoint: {}", args.endpoint); - println!("-> auth_token: {}", args.auth_token); - } - } - } -} diff --git a/packages/server/src/enc_helper.rs b/packages/server/src/enc_helper.rs index 51bbbb49..02e0d753 100644 --- a/packages/server/src/enc_helper.rs +++ b/packages/server/src/enc_helper.rs @@ -3,6 +3,7 @@ use gst::prelude::{GstObjectExt, ObjectExt}; #[derive(Debug, Eq, PartialEq, Clone)] pub enum VideoCodec { H264, + H265, AV1, UNKNOWN, } @@ -10,6 +11,7 @@ impl VideoCodec { pub fn to_str(&self) -> &'static str { match self { VideoCodec::H264 => "H.264", + VideoCodec::H265 => "H.265", VideoCodec::AV1 => "AV1", VideoCodec::UNKNOWN => "Unknown", } @@ -20,6 +22,10 @@ impl VideoCodec { "h264" => VideoCodec::H264, "h.264" => VideoCodec::H264, "avc" => VideoCodec::H264, + "h265" => VideoCodec::H265, + "h.265" => VideoCodec::H265, + "hevc" => VideoCodec::H265, + "hev1" => VideoCodec::H265, "av1" => VideoCodec::AV1, _ => VideoCodec::UNKNOWN, } @@ -310,6 +316,12 @@ pub fn encoder_low_latency_params(encoder: &VideoEncoderInfo) -> VideoEncoderInf encoder_optz.set_parameter("preset", "p1"); encoder_optz.set_parameter("tune", "ultra-low-latency"); } + // same goes for nvcudah265enc + VideoCodec::H265 => { + encoder_optz.set_parameter("multi-pass", "disabled"); + encoder_optz.set_parameter("preset", "p1"); + encoder_optz.set_parameter("tune", "ultra-low-latency"); + } // nvav1enc only supports older presets VideoCodec::AV1 => { encoder_optz.set_parameter("preset", "low-latency-hp"); @@ -324,6 +336,10 @@ pub fn encoder_low_latency_params(encoder: &VideoEncoderInfo) -> VideoEncoderInf VideoCodec::H264 => { encoder_optz.set_parameter("usage", "ultra-low-latency"); } + // Same goes for H.265 + VideoCodec::H265 => { + encoder_optz.set_parameter("usage", "ultra-low-latency"); + } VideoCodec::AV1 => { encoder_optz.set_parameter("usage", "low-latency"); } @@ -396,6 +412,8 @@ pub fn get_compatible_encoders() -> Vec { // Match codec by looking for "264" or "av1" in encoder name let codec = if encoder.contains("264") { VideoCodec::H264 + } else if encoder.contains("265") { + VideoCodec::H265 } else if encoder.contains("av1") { VideoCodec::AV1 } else { @@ -409,6 +427,8 @@ pub fn get_compatible_encoders() -> Vec { if is_encoder_supported(&low_power_encoder) { let codec = if low_power_encoder.contains("264") { VideoCodec::H264 + } else if low_power_encoder.contains("265") { + VideoCodec::H265 } else if low_power_encoder.contains("av1") { VideoCodec::AV1 } else { diff --git a/packages/server/src/main.rs b/packages/server/src/main.rs index 4a406808..af8f53e9 100644 --- a/packages/server/src/main.rs +++ b/packages/server/src/main.rs @@ -2,9 +2,12 @@ mod args; mod enc_helper; mod gpu; +use std::error::Error; use std::sync::Arc; +use gst::Pipeline; use gst::prelude::*; -use crate::args::{encoding_args, output_args}; +use tokio::sync::{mpsc, Mutex}; +use crate::args::{encoding_args}; mod room; // Handles gathering GPU information and selecting the most suitable GPU @@ -115,13 +118,9 @@ fn handle_encoder_video_settings(args: &args::Args, video_encoder: &enc_helper:: // Handles picking audio encoder // TODO: Expand enc_helper with audio types, for now just AAC or opus -fn handle_encoder_audio(args: &args::Args, output_option: &output_args::OutputOption) -> String { +fn handle_encoder_audio(args: &args::Args) -> String { let audio_encoder = if args.encoding.audio.encoder.is_empty() { - if let output_args::OutputOption::MoQ(_) = output_option { - "faac".to_string() - } else { - "opusenc".to_string() - } + "opusenc".to_string() } else { args.encoding.audio.encoder.clone() }; @@ -130,7 +129,7 @@ fn handle_encoder_audio(args: &args::Args, output_option: &output_args::OutputOp } #[tokio::main] -async fn main() -> std::io::Result<()> { +async fn main() -> Result<(), Box> { let args = args::Args::new(); if args.app.verbose { args.debug_print(); @@ -161,27 +160,16 @@ async fn main() -> std::io::Result<()> { video_encoder = handle_encoder_video_settings(&args, &video_encoder); // Handle audio encoder selection - let audio_encoder = handle_encoder_audio(&args, &args.output); + let audio_encoder = handle_encoder_audio(&args); // Get output option - let mut output_pipeline: String = "".to_string(); - if let output_args::OutputOption::MoQ(moqargs) = &args.output { - output_pipeline = format!( - " - ! isofmp4mux chunk-duration=1 fragment-duration=1 name=pipend \ - ! moqsink url={} broadcast={} - ", - moqargs.relay_url, args.app.room - ); - } else if let output_args::OutputOption::WHIP(whipargs) = &args.output { - output_pipeline = format!( - " - ! whipclientsink name=pipend signaller::whip-endpoint=\"{}/api/whip/{}\" signaller::auth-token=\"{}\" congestion-control=disabled - ", - whipargs.endpoint, args.app.room, whipargs.auth_token - ); - } + let output_pipeline = format!( + " + ! whipclientsink name=pipend signaller::whip-endpoint=\"{}/api/whip/{}\" congestion-control=disabled + ", + args.app.relay_url, args.app.room + ); // Debug-latency let mut debug_feed = ""; @@ -241,61 +229,159 @@ async fn main() -> std::io::Result<()> { println!("Constructed pipeline string: {}", pipeline_str); } - // Create the pipeline - let pipeline = gst::parse::launch(pipeline_str.as_str()) - .unwrap() - .downcast::() - .unwrap(); + // Set up a channel for communication with the pipeline + let (event_tx, event_rx) = mpsc::channel(50); + let event_rx = Arc::new(Mutex::new(event_rx)); - let _ = pipeline.set_state(gst::State::Playing); - let pipeline_clone = Arc::new(tokio::sync::Mutex::new(pipeline.clone())); + // Get a room + let room_url = format!( + " + {}/api/whep/{} + ", + args.app.relay_url, args.app.room + ); - let pipeline_thread = pipeline.clone(); + let (pipe_shared_state_tx, pipe_shared_state_rx) = tokio::sync::watch::channel(false); - std::thread::spawn(move || { - let bus = pipeline_thread - .bus() - .expect("Pipeline without bus. Shouldn't happen!"); + // Run both pipeline and websocket tasks concurrently + let result = tokio::try_join!( + run_pipeline(pipeline_str, event_rx, pipe_shared_state_tx), + run_room(room_url, event_tx, pipe_shared_state_rx), + ); - for msg in bus.iter_timed(gst::ClockTime::NONE) { - use gst::MessageView; + match result { + Ok(_) => println!("Both tasks completed successfully."), + Err(e) => { + eprintln!("One of the tasks failed: {} - exiting", e); + // Exit immediately + std::process::exit(1); + } + } - match msg.view() { - MessageView::Eos(..) => { - println!("EOS"); - break; - } - MessageView::Error(err) => { - let _ = pipeline_thread.set_state(gst::State::Null); - eprintln!( - "Got error from {}: {} ({})", - msg.src() - .map(|s| String::from(s.path_string())) - .unwrap_or_else(|| "None".into()), - err.error(), - err.debug().unwrap_or_else(|| "".into()), - ); - break; + Ok(()) +} + +async fn run_room( + relay_url: String, + event_tx: mpsc::Sender, + mut pipe_state: tokio::sync::watch::Receiver, +) -> Result<(), Box> { + // Run loop, with recovery on error + loop { + // Wait until the pipeline is running + while !*pipe_state.borrow() { + pipe_state.changed().await?; + } + + let relay_url = relay_url.clone(); + let event_tx = event_tx.clone(); + let mut room = room::Room::new(relay_url, event_tx).await?; + + tokio::select! { + res = room.run() => { + if let Err(e) = res { + eprintln!("Room task failed: {} - restarting connection", e); + // Wait a bit before retrying + tokio::time::sleep(std::time::Duration::from_secs(2)).await; + continue; } - _ => (), + break Err("Room task ended unexpectedly".into()); + } + _ = pipe_state.changed() => { + // Restart room if pipeline restarts + eprintln!("Pipeline state changed, restarting room."); + continue; } } + } +} - let _ = pipeline.set_state(gst::State::Null); - }); +async fn run_pipeline( + pipeline_str: String, + event_rx: Arc>>, + pipe_state: tokio::sync::watch::Sender, +) -> Result<(), Box> { + loop { + // Create the pipeline + let pipeline = gst::parse::launch(&pipeline_str)? + .downcast::() + .map_err(|_| "Failed to downcast pipeline")?; + pipeline.set_state(gst::State::Playing)?; - // Get a room - let mut relay_url = "".to_string(); - if let output_args::OutputOption::WHIP(whipargs) = &args.output { - relay_url = format!( - " - {}/api/whep/{} - ", - whipargs.endpoint, args.app.room - ); + // Signal the pipeline is rolling after a delay + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + pipe_state.send(true)?; + + let pipeline = Arc::new(Mutex::new(pipeline)); + + // Spawn the event handling task + let (error_tx, mut error_rx) = mpsc::channel(1); + let pipeline_clone = pipeline.clone(); + tokio::spawn(async move { + if let Err(e) = handle_pipeline_errors(pipeline_clone, error_tx).await { + eprintln!("Error handling pipeline errors: {}", e); + } + }); + + // Spawn the pipeline event task + let pipeline_event_task = spawn_pipeline_event_task(pipeline.clone(), event_rx.clone()); + + // Wait for an error or the event task to complete + tokio::select! { + res = pipeline_event_task => { + if let Err(e) = res { + eprintln!("Pipeline event task failed: {}", e); + } + break Err("Pipeline event task ended unexpectedly".into()); + } + Some(_) = error_rx.recv() => { + eprintln!("Pipeline error occurred. Restarting..."); + // Wait a bit before retrying + tokio::time::sleep(std::time::Duration::from_secs(2)).await; + continue; + } + } } - let mut room_handler = room::Room::new(relay_url, pipeline_clone).await?; - room_handler.run().await?; +} +async fn handle_pipeline_errors( + pipeline: Arc>, + error_tx: mpsc::Sender<()>, +) -> Result<(), Box> { + let bus = pipeline.lock().await.bus().expect("Pipeline without bus. Shouldn't happen!"); + for msg in bus.iter_timed(gst::ClockTime::NONE) { + use gst::MessageView; + match msg.view() { + MessageView::Eos(..) => { + println!("Pipeline reached EOS."); + break; + } + MessageView::Error(err) => { + let _ = pipeline.lock().await.set_state(gst::State::Null); + eprintln!( + "Pipeline error: {} ({})", + err.error(), + err.debug().unwrap_or_else(|| "".into()) + ); + let _ = error_tx.send(()).await; + break; + } + _ => (), + } + } + Ok(()) +} + +async fn spawn_pipeline_event_task( + pipeline: Arc>, + event_rx: Arc>>, +) -> Result<(), Box> { + while let Some(event) = event_rx.lock().await.recv().await { + let pipeline = pipeline.lock().await; + if !pipeline.send_event(event) { + // No need to spam this message, it's normal for some events to be dropped + //eprintln!("Failed to send event to the pipeline."); + } + } Ok(()) } diff --git a/packages/server/src/room.rs b/packages/server/src/room.rs index 3c70c3bd..87c1fc90 100644 --- a/packages/server/src/room.rs +++ b/packages/server/src/room.rs @@ -1,22 +1,15 @@ -use gst::prelude::*; use reqwest; +use serde::{Deserialize, Serialize}; +use serde_json::from_str; use std::collections::HashSet; -use std::io; +use std::error::Error; use std::sync::Arc; use tokio::sync::mpsc; use tokio::sync::Mutex; -use tokio::time::Duration; -use webrtc::api::interceptor_registry::register_default_interceptors; -// use std::collections::HashSet; -use serde::{Deserialize, Serialize}; -use serde_json::from_str; -use webrtc::api::media_engine::MediaEngine; use webrtc::api::APIBuilder; use webrtc::data_channel::data_channel_message::DataChannelMessage; use webrtc::ice_transport::ice_server::RTCIceServer; -use webrtc::interceptor::registry::Registry; use webrtc::peer_connection::configuration::RTCConfiguration; -use webrtc::peer_connection::math_rand_alpha; use webrtc::peer_connection::peer_connection_state::RTCPeerConnectionState; use webrtc::peer_connection::sdp::session_description::RTCSessionDescription; @@ -48,33 +41,17 @@ enum InputMessage { pub struct Room { peer_connection: Arc, data_channel: Arc, - done_tx: mpsc::Sender<()>, - done_rx: mpsc::Receiver<()>, relay_url: String, - pipeline: Arc>, + event_tx: mpsc::Sender, } impl Room { pub async fn new( relay_url: String, - pipeline: Arc>, - ) -> io::Result { - // Create a MediaEngine object to configure the supported codec - let mut m = MediaEngine::default(); - - // Register default codecs - let _ = m.register_default_codecs().map_err(map_to_io_error)?; - - let mut registry = Registry::new(); - - // Use the default set of Interceptors - registry = register_default_interceptors(registry, &mut m).map_err(map_to_io_error)?; - + event_tx: mpsc::Sender, + ) -> Result> { // Create the API object with the MediaEngine - let api = APIBuilder::new() - .with_media_engine(m) - .with_interceptor_registry(registry) - .build(); + let api = APIBuilder::new().build(); // Prepare the configuration let config = RTCConfiguration { @@ -88,112 +65,76 @@ impl Room { // Create a new RTCPeerConnection let peer_connection = Arc::new( api.new_peer_connection(config) - .await - .map_err(map_to_io_error)?, + .await? ); - // Create a datachannel with label 'data' + // Create a datachannel with label 'input' let data_channel = peer_connection .create_data_channel("input", None) - .await - .map_err(map_to_io_error)?; - - let (done_tx, done_rx) = mpsc::channel::<()>(1); - - let done_tx_clone = done_tx.clone(); - // Peer connection state change handler - peer_connection.on_peer_connection_state_change(Box::new( - move |s: RTCPeerConnectionState| { - println!("Peer Connection State has changed: {s}"); - - if s == RTCPeerConnectionState::Failed { - println!("Peer Connection has gone to failed exiting"); - let _ = done_tx_clone.try_send(()); - } - - Box::pin(async {}) - }, - )); + .await?; Ok(Self { peer_connection, - pipeline, data_channel, - done_tx, - done_rx, relay_url, + event_tx, }) } - pub async fn run(&mut self) -> io::Result<()> { - // Create an async channel for sending events to the pipeline - let (event_tx, mut event_rx) = mpsc::channel(10); + pub async fn run(&mut self) -> Result<(), Box> { + let data_channel = self.data_channel.clone(); // A shared state to track currently pressed keys - let pressed_keys = Arc::new(tokio::sync::Mutex::new(HashSet::new())); - - // Spawn a task to process events for the pipeline - let pipeline_task = { - // let pipeline = Arc::clone(self.pipeline); - let pipeline_clone = self.pipeline.clone(); - tokio::spawn(async move { - while let Some(event) = event_rx.recv().await { - let pipeline = pipeline_clone.lock().await; - pipeline.send_event(event); - } - }) - }; + let pressed_keys = Arc::new(Mutex::new(HashSet::new())); + let event_tx = self.event_tx.clone(); - let data_channel = self.data_channel.clone(); - //TODO: Handle heartbeats here - // let d1 = Arc::clone(&self.data_channel); - // data_channel.on_open(Box::new(move || { - // println!("Data channel '{}'-'{}' open. Random messages will now be sent to any connected DataChannels every 5 seconds", d1.label(), d1.id()); - - // let d2 = Arc::clone(&d1); - // Box::pin(async move { - // let mut result = std::io::Result::::Ok(0); - // while result.is_ok() { - // let timeout = tokio::time::sleep(Duration::from_secs(5)); - // tokio::pin!(timeout); - - // tokio::select! { - // _ = timeout.as_mut() =>{ - // let message = math_rand_alpha(15); - // println!("Sending '{message}'"); - // result = d2.send_text(message).await.map_err(map_to_io_error); - // } - // }; - // } - // }) - // })); + // PeerConnection state change tracker + let (pc_sndr, mut pc_recv) = mpsc::channel(1); + + // Peer connection state change handler + self.peer_connection.on_peer_connection_state_change(Box::new( + move |s: RTCPeerConnectionState| { + let pc_sndr = pc_sndr.clone(); + Box::pin(async move { + println!("PeerConnection State has changed: {s}"); + + if s == RTCPeerConnectionState::Failed + || s == RTCPeerConnectionState::Disconnected + || s == RTCPeerConnectionState::Closed { + // Notify pc_state that the peer connection has closed + if let Err(e) = pc_sndr.send(s).await { + eprintln!("Failed to send PeerConnection state: {}", e); + } + } + }) + }, + )); // Data channel message handler - let d_label = data_channel.label().to_owned(); data_channel.on_message(Box::new(move |msg: DataChannelMessage| { - let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); - println!("Message from DataChannel '{d_label}': '{msg_str}'"); - - let event_tx = event_tx.clone(); - let pressed_keys = Arc::clone(&pressed_keys); - - tokio::spawn(async move { - if let Ok(input_msg) = from_str::(&msg_str) { - if let Some(event) = handle_input_message(input_msg, &pressed_keys).await { - event_tx.send(event).await.unwrap(); + let pressed_keys = pressed_keys.clone(); + Box::pin({ + let event_tx = event_tx.clone(); + async move { + if msg.is_string { + let msg_str = String::from_utf8(msg.data.to_vec()).unwrap(); + if let Ok(input_msg) = from_str::(&msg_str) { + if let Some(event) = handle_input_message(input_msg, &pressed_keys).await { + if let Err(e) = event_tx.send(event).await { + eprintln!("Failed to send event: {}", e); + } + } + } } } - }); - - Box::pin(async {}) + }) })); // Create an offer to send to the browser let offer = self .peer_connection .create_offer(None) - .await - .map_err(map_to_io_error)?; + .await?; // Create channel that is blocked until ICE Gathering is complete let mut gather_complete = self.peer_connection.gathering_complete_promise().await; @@ -201,8 +142,7 @@ impl Room { // Sets the LocalDescription, and starts our UDP listeners self.peer_connection .set_local_description(offer) - .await - .map_err(map_to_io_error)?; + .await?; // Block until ICE Gathering is complete, disabling trickle ICE // we do this because we only can exchange one signaling message @@ -210,58 +150,44 @@ impl Room { let _ = gather_complete.recv().await; if let Some(local_description) = self.peer_connection.local_description().await { - let url = format!("{}",self.relay_url); + let url = format!("{}", self.relay_url); let response = reqwest::Client::new() .post(&url) .header("Content-Type", "application/sdp") .body(local_description.sdp.clone()) // clone if you don't want to move offer.sdp .send() - .await - .map_err(map_to_io_error)?; + .await?; let answer = response .json::() - .await - .map_err(map_to_io_error)?; + .await?; self.peer_connection .set_remote_description(answer) - .await - .map_err(map_to_io_error)?; + .await?; } else { println!("generate local_description failed!"); }; - println!("Press ctrl-c to stop"); - + // Block until closed or error tokio::select! { - _ = self.done_rx.recv() => { - println!("received done signal!"); + _ = pc_recv.recv() => { + println!("Peer connection closed with state: {:?}", self.peer_connection.connection_state()); } - _ = tokio::signal::ctrl_c() => { - println!(); - } - }; + } - self.peer_connection - .close() - .await - .map_err(map_to_io_error)?; + // Make double-sure to close the peer connection + if let Err(e) = self.peer_connection.close().await { + eprintln!("Failed to close peer connection: {}", e); + } - //FIXME: Ctr + C is not working... i suspect it has something to do with this guy -- Do not forget to fix packages/server/room.rs as well - - pipeline_task.await?; Ok(()) } } -fn map_to_io_error(e: E) -> io::Error { - io::Error::new(io::ErrorKind::Other, format!("{}", e)) -} - async fn handle_input_message( input_msg: InputMessage, - pressed_keys: &Arc>>, + pressed_keys: &Arc>>, ) -> Option { match input_msg { InputMessage::MouseMove { x, y } => { diff --git a/packages/ui/globals.css b/packages/ui/globals.css index dd583bea..055610bb 100644 --- a/packages/ui/globals.css +++ b/packages/ui/globals.css @@ -5,6 +5,11 @@ @layer base { + html { + width: 100%; + height: 100%; + } + html, html * { scrollbar-color: theme("colors.gray.700") theme("colors.gray.300"); diff --git a/packages/ui/src/nav-bar.tsx b/packages/ui/src/nav-bar.tsx index 52d94806..6bcb1452 100644 --- a/packages/ui/src/nav-bar.tsx +++ b/packages/ui/src/nav-bar.tsx @@ -29,7 +29,7 @@ export const NavBar = component$(() => { ); return ( -

0B?zW-WUG&qD%sM7=s{^D2DM{f|4( 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 oe)MNWHq void; + private keyupListener: (e: KeyboardEvent) => void; + + constructor({ ws, canvas }: Props) { + this.websocket = ws; + this.canvas = canvas; + this.abortController = new AbortController(); + this.keydownListener = this.createKeyboardListener("keydown", (e: any) => ({ type: "KeyDown", key: this.keyToVirtualKeyCode(e.code) })); + this.keyupListener = this.createKeyboardListener("keyup", (e: any) => ({ type: "KeyUp", key: this.keyToVirtualKeyCode(e.code) })); + this.run() + } + + private run() { + //calls all the other functions + if (!document.pointerLockElement) { + if (this.connected) { + this.stop() + } + return; + } + + if (document.pointerLockElement == this.canvas) { + this.connected = true + document.addEventListener("keydown", this.keydownListener, { signal: this.abortController.signal }); + document.addEventListener("keyup", this.keyupListener, { signal: this.abortController.signal }); + } else { + if (this.connected) { + this.stop() + } + } + + } + private stop() { + document.removeEventListener("keydown", this.keydownListener); + document.removeEventListener("keyup", this.keyupListener); + this.abortController.abort(); + this.connected = false; + } + + // Helper function to create and return mouse listeners + private createKeyboardListener(type: string, dataCreator: (e: Event) => Partial): (e: Event) => void { + return (e: Event) => { + e.preventDefault(); + e.stopPropagation(); + const data = dataCreator(e as any); // type assertion because of the way dataCreator is used + this.websocket.send(JSON.stringify({ ...data, type } as Input)); + }; + } + + public dispose() { + document.exitPointerLock(); + this.stop(); + this.abortController.abort(); + this.connected = false; + } + + private keyToVirtualKeyCode(code: string) { + + const keyToVirtualKeyCodeMap = new Map([ + // ASCII + ['KeyA', 0x41], ['KeyB', 0x42], ['KeyC', 0x43], ['KeyD', 0x44], ['KeyE', 0x45], + ['KeyF', 0x46], ['KeyG', 0x47], ['KeyH', 0x48], ['KeyI', 0x49], ['KeyJ', 0x4A], + ['KeyK', 0x4B], ['KeyL', 0x4C], ['KeyM', 0x4D], ['KeyN', 0x4E], ['KeyO', 0x4F], + ['KeyP', 0x50], ['KeyQ', 0x51], ['KeyR', 0x52], ['KeyS', 0x53], ['KeyT', 0x54], + ['KeyU', 0x55], ['KeyV', 0x56], ['KeyW', 0x57], ['KeyX', 0x58], ['KeyY', 0x59], + ['KeyZ', 0x5A], + + // Digits + ['Digit0', 0x30], ['Digit1', 0x31], ['Digit2', 0x32], ['Digit3', 0x33], ['Digit4', 0x34], + ['Digit5', 0x35], ['Digit6', 0x36], ['Digit7', 0x37], ['Digit8', 0x38], ['Digit9', 0x39], + + // Special + ['Escape', 0x1B], + ['Backspace', 0x08], + ['Tab', 0x09], + ['Enter', 0x0D], + ['ShiftLeft', 0xA0], + ['ShiftRight', 0xA1], + ['ControlLeft', 0xA2], + ['ControlRight', 0xA3], + ['AltLeft', 0xA4], + ['AltRight', 0xA5], + ['Space', 0x20], + ['PageUp', 0x21], + ['PageDown', 0x22], + ['End', 0x23], + ['Home', 0x24], + ['ArrowLeft', 0x25], + ['ArrowUp', 0x26], + ['ArrowRight', 0x27], + ['ArrowDown', 0x28], + ['Insert', 0x2D], + ['Delete', 0x2E], + ]); + + return keyToVirtualKeyCodeMap.get(code) || 0; // Default to 0 for unknown keys + } +} \ No newline at end of file diff --git a/packages/input/src/mouse.ts b/packages/input/src/mouse.ts new file mode 100644 index 00000000..94830633 --- /dev/null +++ b/packages/input/src/mouse.ts @@ -0,0 +1,81 @@ +import { type Input } from "./types" + +interface Props { + ws: WebSocket; + canvas: HTMLCanvasElement; +} +//FIXME: removeEventListener does not work, i dunno why + +export class Mouse { + protected websocket: WebSocket; + protected canvas: HTMLCanvasElement; + protected connected!: boolean; + protected abortController: AbortController; + + // Store references to event listeners + private mousemoveListener: (e: MouseEvent) => void; + private mousedownListener: (e: MouseEvent) => void; + private mouseupListener: (e: MouseEvent) => void; + private mousewheelListener: (e: WheelEvent) => void; + + constructor({ ws, canvas }: Props) { + this.websocket = ws; + this.canvas = canvas; + this.abortController = new AbortController(); + this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ type: "MouseMove", x: e.movementX, y: e.movementY })); + this.mousedownListener = this.createMouseListener("mousedown", (e: any) => ({ type: "MouseKeyDown", key: e.button })); + this.mouseupListener = this.createMouseListener("mouseup", (e: any) => ({ type: "MouseKeyUp", key: e.button })); + this.mousewheelListener = this.createMouseListener("wheel", (e: any) => ({ type: "MouseWheel", x: e.deltaX, y: e.deltaY })); + + this.run() + } + + private run() { + //calls all the other functions + if (!document.pointerLockElement) { + if (this.connected) { + this.stop() + } + return; + } + + if (document.pointerLockElement == this.canvas) { + this.connected = true + this.canvas.addEventListener("mousemove", this.mousemoveListener, { signal: this.abortController.signal }); + this.canvas.addEventListener("mousedown", this.mousedownListener, { signal: this.abortController.signal }); + this.canvas.addEventListener("mouseup", this.mouseupListener, { signal: this.abortController.signal }); + this.canvas.addEventListener("wheel", this.mousewheelListener, { signal: this.abortController.signal }); + + } else { + if (this.connected) { + this.stop() + } + } + + } + private stop() { + this.canvas.removeEventListener("mousemove", this.mousemoveListener); + this.canvas.removeEventListener("mousedown", this.mousedownListener); + this.canvas.removeEventListener("mouseup", this.mouseupListener); + this.canvas.removeEventListener("wheel", this.mousewheelListener); + this.abortController.abort(); + this.connected = false; + } + + // Helper function to create and return mouse listeners + private createMouseListener(type: string, dataCreator: (e: Event) => Partial): (e: Event) => void { + return (e: Event) => { + e.preventDefault(); + e.stopPropagation(); + const data = dataCreator(e as any); // type assertion because of the way dataCreator is used + this.websocket.send(JSON.stringify({ ...data, type } as Input)); + }; + } + + public dispose() { + document.exitPointerLock(); + this.stop(); + this.abortController.abort(); + this.connected = false; + } +} \ No newline at end of file diff --git a/packages/input/src/types.ts b/packages/input/src/types.ts new file mode 100644 index 00000000..242f2038 --- /dev/null +++ b/packages/input/src/types.ts @@ -0,0 +1,45 @@ +interface BaseInput { + timestamp?: number; // Add a timestamp for better context (optional) +} + +interface MouseMove extends BaseInput { + type: "MouseMove"; + x: number; + y: number; +} + +interface MouseWheel extends BaseInput { + type: "MouseWheel"; + x: number; + y: number; +} + +interface MouseKeyDown extends BaseInput { + type: "MouseKeyDown"; + key: number; +} + +interface MouseKeyUp extends BaseInput { + type: "MouseKeyUp"; + key: number; +} + +interface KeyDown extends BaseInput { + type: "KeyDown"; + key: number; +} + +interface KeyUp extends BaseInput { + type: "KeyUp"; + key: number; +} + + +export type Input = + | MouseMove + | MouseWheel + | MouseKeyDown + | MouseKeyUp + | KeyDown + | KeyUp; + diff --git a/packages/moq/contribute/broadcast.ts b/packages/moq/contribute/broadcast.ts index 2f8224fb..3f6e062c 100644 --- a/packages/moq/contribute/broadcast.ts +++ b/packages/moq/contribute/broadcast.ts @@ -113,7 +113,7 @@ export class Broadcast { // Run an async task to serve each subscription. this.#serveSubscribe(subscriber).catch((e) => { const err = asError(e) - console.warn("failed to serve subscribe", err) + // console.warn("failed to serve subscribe", err) }) } } @@ -183,7 +183,7 @@ export class Broadcast { // Serve the segment and log any errors that occur. this.#serveSegment(subscriber, segment).catch((e) => { const err = asError(e) - console.warn("failed to serve segment", err) + // console.warn("failed to serve segment", err) }) } } diff --git a/packages/moq/contribute/track.ts b/packages/moq/contribute/track.ts index cec70d81..d5c985e9 100644 --- a/packages/moq/contribute/track.ts +++ b/packages/moq/contribute/track.ts @@ -101,7 +101,7 @@ export class Track { if ((writer.desiredSize || 0) > 0) { await writer.write(chunk) } else { - console.warn("dropping chunk", writer.desiredSize) + // console.warn("dropping chunk", writer.desiredSize) } writer.releaseLock() From e5dc85340f4694e0a92b8adad30189877997bba6 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Thu, 31 Oct 2024 16:42:09 +0300 Subject: [PATCH 06/43] fix: Delete `/input` route --- apps/www/src/routes/input/index.tsx | 67 ----------- apps/www/src/routes/input/input.ts | 45 ------- .../routes/input/keyboard_input_handler.ts | 113 ------------------ .../src/routes/input/mouse_input_handler.ts | 81 ------------- 4 files changed, 306 deletions(-) delete mode 100644 apps/www/src/routes/input/index.tsx delete mode 100644 apps/www/src/routes/input/input.ts delete mode 100644 apps/www/src/routes/input/keyboard_input_handler.ts delete mode 100644 apps/www/src/routes/input/mouse_input_handler.ts diff --git a/apps/www/src/routes/input/index.tsx b/apps/www/src/routes/input/index.tsx deleted file mode 100644 index 20507d50..00000000 --- a/apps/www/src/routes/input/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { $, component$, QRL, useSignal, useVisibleTask$ } from "@builder.io/qwik" -import { Mouse } from "./mouse_input_handler" -import { Keyboard } from "./keyboard_input_handler" - - -export default component$(() => { - const canvas = useSignal(); - const retryConnecting = useSignal(false) - - useVisibleTask$(({ track }) => { - track(() => retryConnecting.value); - - function attemptConnection() { - if (!canvas.value) return; // Ensure canvas is available - // const ws = connectWebSocket(retryConnecting); - const ws = new WebSocket("ws://testing@dathorse-vms.duckdns.org:5901/mouse"); - - ws.onopen = (ev) => { - retryConnecting.value = false; - }; - - ws.onmessage = async (event) => { - if (event.data) { - console.log("msg recieved", event.data); - retryConnecting.value = false; - } - }; - - ws.onerror = (err) => { - console.error("[input]: We got an error while handling the connection", err); - retryConnecting.value = true; - }; - - ws.onclose = () => { - console.warn("[input]: We lost connection to the server"); - retryConnecting.value = true - }; - - - document.addEventListener("pointerlockchange", () => { - if (!canvas.value) return; - new Mouse({ ws, canvas: canvas.value }); - new Keyboard({ ws, canvas: canvas.value }); - }) - } - - attemptConnection(); - - - if (retryConnecting.value) { - console.log("[input]: Hang tight we are trying to reconnect to the server :)") - const retryInterval = setInterval(attemptConnection, 5000); // Retry every 5 seconds - return () => { retryInterval && clearInterval(retryInterval) } - } - }) - - return ( - { - if (canvas.value) { - canvas.value.requestPointerLock() - } - }} - /> - ) -}) \ No newline at end of file diff --git a/apps/www/src/routes/input/input.ts b/apps/www/src/routes/input/input.ts deleted file mode 100644 index 242f2038..00000000 --- a/apps/www/src/routes/input/input.ts +++ /dev/null @@ -1,45 +0,0 @@ -interface BaseInput { - timestamp?: number; // Add a timestamp for better context (optional) -} - -interface MouseMove extends BaseInput { - type: "MouseMove"; - x: number; - y: number; -} - -interface MouseWheel extends BaseInput { - type: "MouseWheel"; - x: number; - y: number; -} - -interface MouseKeyDown extends BaseInput { - type: "MouseKeyDown"; - key: number; -} - -interface MouseKeyUp extends BaseInput { - type: "MouseKeyUp"; - key: number; -} - -interface KeyDown extends BaseInput { - type: "KeyDown"; - key: number; -} - -interface KeyUp extends BaseInput { - type: "KeyUp"; - key: number; -} - - -export type Input = - | MouseMove - | MouseWheel - | MouseKeyDown - | MouseKeyUp - | KeyDown - | KeyUp; - diff --git a/apps/www/src/routes/input/keyboard_input_handler.ts b/apps/www/src/routes/input/keyboard_input_handler.ts deleted file mode 100644 index 480a84a8..00000000 --- a/apps/www/src/routes/input/keyboard_input_handler.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Input } from "./input" - -interface Props { - ws: WebSocket; - canvas: HTMLCanvasElement; -} -//FIXME: removeEventListener does not work, i dunno why - -export class Keyboard { - protected websocket: WebSocket; - protected canvas: HTMLCanvasElement; - protected connected!: boolean; - protected abortController: AbortController; - - // Store references to event listeners - private keydownListener: (e: KeyboardEvent) => void; - private keyupListener: (e: KeyboardEvent) => void; - - constructor({ ws, canvas }: Props) { - this.websocket = ws; - this.canvas = canvas; - this.abortController = new AbortController(); - this.keydownListener = this.createKeyboardListener("keydown", (e: any) => ({ type: "KeyDown", key: this.keyToVirtualKeyCode(e.code) })); - this.keyupListener = this.createKeyboardListener("keyup", (e: any) => ({ type: "KeyUp", key: this.keyToVirtualKeyCode(e.code) })); - this.#run() - } - - #run() { - //calls all the other functions - if (!document.pointerLockElement) { - if (this.connected) { - this.#stop() - } - return; - } - - if (document.pointerLockElement == this.canvas) { - this.connected = true - document.addEventListener("keydown", this.keydownListener, { signal: this.abortController.signal }); - document.addEventListener("keyup", this.keyupListener, { signal: this.abortController.signal }); - } else { - if (this.connected) { - this.#stop() - } - } - - } - #stop() { - document.removeEventListener("keydown", this.keydownListener); - document.removeEventListener("keyup", this.keyupListener); - this.abortController.abort(); - this.connected = false; - } - - // Helper function to create and return mouse listeners - private createKeyboardListener(type: string, dataCreator: (e: Event) => Partial): (e: Event) => void { - return (e: Event) => { - e.preventDefault(); - e.stopPropagation(); - const data = dataCreator(e as any); // type assertion because of the way dataCreator is used - this.websocket.send(JSON.stringify({ ...data, type } as Input)); - }; - } - - public dispose() { - document.exitPointerLock(); - this.#stop(); - this.abortController.abort(); - this.connected = false; - } - - private keyToVirtualKeyCode(code: string) { - - const keyToVirtualKeyCodeMap = new Map([ - // ASCII - ['KeyA', 0x41], ['KeyB', 0x42], ['KeyC', 0x43], ['KeyD', 0x44], ['KeyE', 0x45], - ['KeyF', 0x46], ['KeyG', 0x47], ['KeyH', 0x48], ['KeyI', 0x49], ['KeyJ', 0x4A], - ['KeyK', 0x4B], ['KeyL', 0x4C], ['KeyM', 0x4D], ['KeyN', 0x4E], ['KeyO', 0x4F], - ['KeyP', 0x50], ['KeyQ', 0x51], ['KeyR', 0x52], ['KeyS', 0x53], ['KeyT', 0x54], - ['KeyU', 0x55], ['KeyV', 0x56], ['KeyW', 0x57], ['KeyX', 0x58], ['KeyY', 0x59], - ['KeyZ', 0x5A], - - // Digits - ['Digit0', 0x30], ['Digit1', 0x31], ['Digit2', 0x32], ['Digit3', 0x33], ['Digit4', 0x34], - ['Digit5', 0x35], ['Digit6', 0x36], ['Digit7', 0x37], ['Digit8', 0x38], ['Digit9', 0x39], - - // Special - ['Escape', 0x1B], - ['Backspace', 0x08], - ['Tab', 0x09], - ['Enter', 0x0D], - ['ShiftLeft', 0xA0], - ['ShiftRight', 0xA1], - ['ControlLeft', 0xA2], - ['ControlRight', 0xA3], - ['AltLeft', 0xA4], - ['AltRight', 0xA5], - ['Space', 0x20], - ['PageUp', 0x21], - ['PageDown', 0x22], - ['End', 0x23], - ['Home', 0x24], - ['ArrowLeft', 0x25], - ['ArrowUp', 0x26], - ['ArrowRight', 0x27], - ['ArrowDown', 0x28], - ['Insert', 0x2D], - ['Delete', 0x2E], - ]); - - return keyToVirtualKeyCodeMap.get(code) || 0; // Default to 0 for unknown keys - } -} \ No newline at end of file diff --git a/apps/www/src/routes/input/mouse_input_handler.ts b/apps/www/src/routes/input/mouse_input_handler.ts deleted file mode 100644 index 3bfb8a9e..00000000 --- a/apps/www/src/routes/input/mouse_input_handler.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Input } from "./input" - -interface Props { - ws: WebSocket; - canvas: HTMLCanvasElement; -} -//FIXME: removeEventListener does not work, i dunno why - -export class Mouse { - protected websocket: WebSocket; - protected canvas: HTMLCanvasElement; - protected connected!: boolean; - protected abortController: AbortController; - - // Store references to event listeners - private mousemoveListener: (e: MouseEvent) => void; - private mousedownListener: (e: MouseEvent) => void; - private mouseupListener: (e: MouseEvent) => void; - private mousewheelListener: (e: WheelEvent) => void; - - constructor({ ws, canvas }: Props) { - this.websocket = ws; - this.canvas = canvas; - this.abortController = new AbortController(); - this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ type: "MouseMove", x: e.movementX, y: e.movementY })); - this.mousedownListener = this.createMouseListener("mousedown", (e: any) => ({ type: "MouseKeyDown", key: e.button })); - this.mouseupListener = this.createMouseListener("mouseup", (e: any) => ({ type: "MouseKeyUp", key: e.button })); - this.mousewheelListener = this.createMouseListener("wheel", (e: any) => ({ type: "MouseWheel", x: e.deltaX, y: e.deltaY })); - - this.#run() - } - - #run() { - //calls all the other functions - if (!document.pointerLockElement) { - if (this.connected) { - this.#stop() - } - return; - } - - if (document.pointerLockElement == this.canvas) { - this.connected = true - this.canvas.addEventListener("mousemove", this.mousemoveListener, { signal: this.abortController.signal }); - this.canvas.addEventListener("mousedown", this.mousedownListener, { signal: this.abortController.signal }); - this.canvas.addEventListener("mouseup", this.mouseupListener, { signal: this.abortController.signal }); - this.canvas.addEventListener("wheel", this.mousewheelListener, { signal: this.abortController.signal }); - - } else { - if (this.connected) { - this.#stop() - } - } - - } - #stop() { - this.canvas.removeEventListener("mousemove", this.mousemoveListener); - this.canvas.removeEventListener("mousedown", this.mousedownListener); - this.canvas.removeEventListener("mouseup", this.mouseupListener); - this.canvas.removeEventListener("wheel", this.mousewheelListener); - this.abortController.abort(); - this.connected = false; - } - - // Helper function to create and return mouse listeners - private createMouseListener(type: string, dataCreator: (e: Event) => Partial): (e: Event) => void { - return (e: Event) => { - e.preventDefault(); - e.stopPropagation(); - const data = dataCreator(e as any); // type assertion because of the way dataCreator is used - this.websocket.send(JSON.stringify({ ...data, type } as Input)); - }; - } - - public dispose() { - document.exitPointerLock(); - this.#stop(); - this.abortController.abort(); - this.connected = false; - } -} \ No newline at end of file From 6a7a1edcb2ed88fe52e222f9176f61a50fe1d8e8 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Fri, 1 Nov 2024 07:14:08 +0300 Subject: [PATCH 07/43] fix: Dethrottlenthe input --- apps/www/src/routes/play/[id]/index.tsx | 108 +++++++++++---------- apps/www/src/routes/play/[id]/websocket.ts | 102 +++++++++++++++++++ packages/input/src/keyboard.ts | 6 +- packages/input/src/mouse.ts | 2 +- packages/moq/playback/worker/index.ts | 5 +- 5 files changed, 168 insertions(+), 55 deletions(-) create mode 100644 apps/www/src/routes/play/[id]/websocket.ts diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index a04ac504..58ee1259 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -1,7 +1,6 @@ import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; import { useLocation } from "@builder.io/qwik-city"; -import { Mouse, Keyboard } from "@nestri/input" - +import { WS } from "./websocket" // Upstream MoQ lib does not work well with our Qwik Vite implementation import { Player } from "@nestri/moq/playback" @@ -10,53 +9,11 @@ export default component$(() => { const canvas = useSignal(); const url = 'https://relay.fst.so' - const retryConnecting = useSignal(false) - useVisibleTask$(({ track }) => { - track(() => retryConnecting.value); - - function attemptConnection() { - if (!canvas.value) return; // Ensure canvas is available - // const ws = connectWebSocket(retryConnecting); - const ws = new WebSocket("ws://[ip address]:8081/ws"); - - ws.onopen = (ev) => { - retryConnecting.value = false; - }; - - ws.onmessage = async (event) => { - if (event.data) { - // console.log("msg recieved", event.data); - retryConnecting.value = false; - } - }; - - ws.onerror = (err) => { - console.error("[input]: We got an error while handling the connection", err); - retryConnecting.value = true; - }; - - ws.onclose = () => { - console.warn("[input]: We lost connection to the server"); - retryConnecting.value = true - }; - - - document.addEventListener("pointerlockchange", () => { - if (!canvas.value) return; - new Mouse({ ws, canvas: canvas.value }); - new Keyboard({ ws, canvas: canvas.value }); - }) - } - - attemptConnection(); - - - if (retryConnecting.value) { - console.log("[input]: Hang tight we are trying to reconnect to the server :)") - const retryInterval = setInterval(attemptConnection, 5000); // Retry every 5 seconds - return () => { retryInterval && clearInterval(retryInterval) } - } + track(() => canvas.value); + + if (!canvas.value) return; // Ensure canvas is available/87.100.239.153 + new WS({ canvas: canvas.value, url: "ws://localhost:8081/ws" }); }) @@ -159,4 +116,57 @@ user agent stylesheet // circle[Attributes Style] { // cx: 50; // cy: 50; -// r: 20; \ No newline at end of file +// r: 20; + + +// function throttle(func, limit) { +// let inThrottle; +// return function(...args) { +// if (!inThrottle) { +// func.apply(this, args); +// inThrottle = true; +// setTimeout(() => inThrottle = false, limit); +// } +// } +// } + +// // Use it like this: +// const throttledMouseMove = throttle((x, y) => { +// websocket.send(JSON.stringify({ +// type: 'mousemove', +// x: x, +// y: y +// })); +// }, 16); // ~60fps + +// use std::time::Instant; + +// // Add these to your AppState +// struct AppState { +// pipeline: Arc>, +// last_mouse_move: Arc>, // Add this +// } + +// // Then in your MouseMove handler: +// InputMessage::MouseMove { x, y } => { +// let mut last_move = state.last_mouse_move.lock().unwrap(); +// let now = Instant::now(); + +// // Only process if coordinates are different or enough time has passed +// if (last_move.0 != x || last_move.1 != y) && +// (now.duration_since(last_move.2).as_millis() > 16) { // ~60fps + +// println!("Mouse moved to x: {}, y: {}", x, y); + +// let structure = gst::Structure::builder("MouseMoveRelative") +// .field("pointer_x", x as f64) +// .field("pointer_y", y as f64) +// .build(); + +// let event = gst::event::CustomUpstream::new(structure); +// pipeline.send_event(event); + +// // Update last position and time +// *last_move = (x, y, now); +// } +// } \ No newline at end of file diff --git a/apps/www/src/routes/play/[id]/websocket.ts b/apps/www/src/routes/play/[id]/websocket.ts new file mode 100644 index 00000000..34f2b78b --- /dev/null +++ b/apps/www/src/routes/play/[id]/websocket.ts @@ -0,0 +1,102 @@ +import { Mouse, Keyboard } from "@nestri/input" + +type Props = { + url: string; + canvas: HTMLCanvasElement; +} +export class WS { + private retryConnecting: boolean; + private websocket: WebSocket; + private canvas: HTMLCanvasElement; + private retryInterval: NodeJS.Timeout | undefined; + private url: string; + private pointerLockListener: (() => void) | undefined; + private mouse: Mouse | undefined; + private keyboard: Keyboard | undefined; + + constructor({ url, canvas }: Props) { + this.url = url; + this.retryConnecting = false; + this.websocket = new WebSocket(url); + this.canvas = canvas; + + this.initializeWebSocket(); + } + + private initializeWebSocket() { + this.websocket.onopen = () => { + this.retryConnecting = false; + this.run(); + console.log("[input]: WebSocket connection opened"); + }; + + this.websocket.onmessage = (evt) => { + this.retryConnecting = false; + console.log("[input]: Received a WebSocket message", evt.data); + }; + + this.websocket.onclose = () => { + this.retryConnecting = true; + console.log("[input]: WebSocket connection closed, retrying"); + this.retry(); + }; + + this.websocket.onerror = (err) => { + this.retryConnecting = true; + console.log("[input]: WebSocket connection errored out", err); + this.retry(); + }; + } + + private run() { + if (!this.retryConnecting) { + //Clear any retry intervals + this.retryInterval && clearInterval(this.retryInterval); + + // Add pointer lock change listener only once + if (!this.pointerLockListener) { + this.pointerLockListener = () => { + if (!this.canvas) return; + this.initializeInput(); + // if (document.pointerLockElement == this.canvas) { + // this.canvasLocked = true + // } else { + // this.canvasLocked = false + // } + }; + + document.addEventListener("pointerlockchange", this.pointerLockListener); + } + } else { + this.retry(); + } + } + + private retry() { + this.retryInterval && clearInterval(this.retryInterval); + + if (this.retryConnecting) { + console.log("[input]: Hang tight, we are trying to reconnect to the server :)"); + this.retryInterval = setInterval(() => { + this.websocket = new WebSocket(this.url); + this.initializeWebSocket(); + }, 5000); // Retry every 5 seconds + } + } + + // Optional: Clean up method to remove listeners + private cleanup() { + if (this.pointerLockListener) { + document.removeEventListener("pointerlockchange", this.pointerLockListener); + this.pointerLockListener = undefined; + } + } + + private initializeInput() { + if (this.canvas) { + this.mouse = new Mouse({ ws: this.websocket, canvas: this.canvas }); + this.keyboard = new Keyboard({ ws: this.websocket, canvas: this.canvas }); + } + } + +} \ No newline at end of file diff --git a/packages/input/src/keyboard.ts b/packages/input/src/keyboard.ts index c294a6ab..a75cee11 100644 --- a/packages/input/src/keyboard.ts +++ b/packages/input/src/keyboard.ts @@ -5,7 +5,7 @@ interface Props { canvas: HTMLCanvasElement; } //FIXME: removeEventListener does not work, i dunno why - +//FIXME: For some reason, multiple eventlisteners are being attached, causing a multitude of keys being evoked export class Keyboard { protected websocket: WebSocket; protected canvas: HTMLCanvasElement; @@ -46,8 +46,8 @@ export class Keyboard { } private stop() { - document.removeEventListener("keydown", this.keydownListener); - document.removeEventListener("keyup", this.keyupListener); + this.canvas.removeEventListener("keydown", this.keydownListener); + this.canvas.removeEventListener("keyup", this.keyupListener); this.abortController.abort(); this.connected = false; } diff --git a/packages/input/src/mouse.ts b/packages/input/src/mouse.ts index 94830633..4134b1cd 100644 --- a/packages/input/src/mouse.ts +++ b/packages/input/src/mouse.ts @@ -34,7 +34,7 @@ export class Mouse { //calls all the other functions if (!document.pointerLockElement) { if (this.connected) { - this.stop() + this.stop() } return; } diff --git a/packages/moq/playback/worker/index.ts b/packages/moq/playback/worker/index.ts index 1275b3f5..774f38ee 100644 --- a/packages/moq/playback/worker/index.ts +++ b/packages/moq/playback/worker/index.ts @@ -29,7 +29,8 @@ class Worker { // TODO buffer the init segmnet so we don't hold the stream open. this.#onInit(msg.init) } else if (msg.segment) { - this.#onSegment(msg.segment).catch(console.warn) + //the ()=>{} prevents unwanted console warn and error messages + this.#onSegment(msg.segment).catch(()=>{}) //.catch(console.warn) } else { throw new Error(`unknown message: + ${JSON.stringify(msg)}`) } @@ -109,7 +110,7 @@ self.addEventListener("message", (msg) => { worker.on(msg) } catch (e) { const err = asError(e) - console.warn("worker error:", err) + // console.warn("worker error:", err) } }) From 8142e79ec327e2d2fd9fe1562c351ab49831436a Mon Sep 17 00:00:00 2001 From: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Date: Sun, 3 Nov 2024 09:38:38 +0200 Subject: [PATCH 08/43] =?UTF-8?q?=F0=9F=90=9B=20fix(www):=20Fix=20input=20?= =?UTF-8?q?handling=20(#124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed event listener oddities, working input detach/attach on pointer lock change, formatting and adding proper key+mouse codes for Linux and moving them into separate file. Co-authored-by: Kristian Ollikainen --- apps/www/src/routes/play/[id]/websocket.ts | 23 +++-- packages/input/src/codes.ts | 113 +++++++++++++++++++++ packages/input/src/keyboard.ts | 73 ++++--------- packages/input/src/mouse.ts | 48 +++++---- 4 files changed, 179 insertions(+), 78 deletions(-) create mode 100644 packages/input/src/codes.ts diff --git a/apps/www/src/routes/play/[id]/websocket.ts b/apps/www/src/routes/play/[id]/websocket.ts index 34f2b78b..22a28329 100644 --- a/apps/www/src/routes/play/[id]/websocket.ts +++ b/apps/www/src/routes/play/[id]/websocket.ts @@ -26,6 +26,7 @@ export class WS { private initializeWebSocket() { this.websocket.onopen = () => { this.retryConnecting = false; + this.cleanupInput(); this.run(); console.log("[input]: WebSocket connection opened"); }; @@ -57,12 +58,10 @@ export class WS { if (!this.pointerLockListener) { this.pointerLockListener = () => { if (!this.canvas) return; - this.initializeInput(); - // if (document.pointerLockElement == this.canvas) { - // this.canvasLocked = true - // } else { - // this.canvasLocked = false - // } + if (document.pointerLockElement) + this.initializeInput(); + else + this.cleanupInput(); }; document.addEventListener("pointerlockchange", this.pointerLockListener); @@ -93,10 +92,20 @@ export class WS { } private initializeInput() { - if (this.canvas) { + if (this.canvas && !this.mouse && !this.keyboard) { this.mouse = new Mouse({ ws: this.websocket, canvas: this.canvas }); this.keyboard = new Keyboard({ ws: this.websocket, canvas: this.canvas }); } } + private cleanupInput() { + if (this.mouse) { + this.mouse.dispose(); + this.mouse = undefined; + } + if (this.keyboard) { + this.keyboard.dispose(); + this.keyboard = undefined; + } + } } \ No newline at end of file diff --git a/packages/input/src/codes.ts b/packages/input/src/codes.ts new file mode 100644 index 00000000..c3e5a8d7 --- /dev/null +++ b/packages/input/src/codes.ts @@ -0,0 +1,113 @@ +export const keyCodeToLinuxEventCode: { [key: string]: number } = { + 'KeyA': 30, + 'KeyB': 48, + 'KeyC': 46, + 'KeyD': 32, + 'KeyE': 18, + 'KeyF': 33, + 'KeyG': 34, + 'KeyH': 35, + 'KeyI': 23, + 'KeyJ': 36, + 'KeyK': 37, + 'KeyL': 38, + 'KeyM': 50, + 'KeyN': 49, + 'KeyO': 24, + 'KeyP': 25, + 'KeyQ': 16, + 'KeyR': 19, + 'KeyS': 31, + 'KeyT': 20, + 'KeyU': 22, + 'KeyV': 47, + 'KeyW': 17, + 'KeyX': 45, + 'KeyY': 21, + 'KeyZ': 44, + 'Digit1': 2, + 'Digit2': 3, + 'Digit3': 4, + 'Digit4': 5, + 'Digit5': 6, + 'Digit6': 7, + 'Digit7': 8, + 'Digit8': 9, + 'Digit9': 10, + 'Digit0': 11, + 'Enter': 28, + 'Escape': 1, + 'Backspace': 14, + 'Tab': 15, + 'Space': 57, + 'Minus': 12, + 'Equal': 13, + 'BracketLeft': 26, + 'BracketRight': 27, + 'Backslash': 43, + 'Semicolon': 39, + 'Quote': 40, + 'Backquote': 41, + 'Comma': 51, + 'Period': 52, + 'Slash': 53, + 'CapsLock': 58, + 'F1': 59, + 'F2': 60, + 'F3': 61, + 'F4': 62, + 'F5': 63, + 'F6': 64, + 'F7': 65, + 'F8': 66, + 'F9': 67, + 'F10': 68, + 'F11': 87, + 'F12': 88, + 'Insert': 110, + 'Delete': 111, + 'ArrowUp': 103, + 'ArrowDown': 108, + 'ArrowLeft': 105, + 'ArrowRight': 106, + 'Home': 102, + 'End': 107, + 'PageUp': 104, + 'PageDown': 109, + 'NumLock': 69, + 'ScrollLock': 70, + 'Pause': 119, + 'Numpad0': 82, + 'Numpad1': 79, + 'Numpad2': 80, + 'Numpad3': 81, + 'Numpad4': 75, + 'Numpad5': 76, + 'Numpad6': 77, + 'Numpad7': 71, + 'Numpad8': 72, + 'Numpad9': 73, + 'NumpadDivide': 98, + 'NumpadMultiply': 55, + 'NumpadSubtract': 74, + 'NumpadAdd': 78, + 'NumpadEnter': 96, + 'NumpadDecimal': 83, + 'ControlLeft': 29, + 'ControlRight': 97, + 'ShiftLeft': 42, + 'ShiftRight': 54, + 'AltLeft': 56, + 'AltRight': 100, + //'MetaLeft': 125, // Disabled as will break input + //'MetaRight': 126, // Disabled as will break input + 'ContextMenu': 127, +}; + +export const mouseButtonToLinuxEventCode: { [button: number]: number } = { + 0: 272, + 2: 273, + 1: 274, + 3: 275, + 4: 276 +}; diff --git a/packages/input/src/keyboard.ts b/packages/input/src/keyboard.ts index a75cee11..424c770a 100644 --- a/packages/input/src/keyboard.ts +++ b/packages/input/src/keyboard.ts @@ -1,27 +1,31 @@ -import { type Input } from "./types" +import {type Input} from "./types" +import {keyCodeToLinuxEventCode} from "./codes" interface Props { ws: WebSocket; canvas: HTMLCanvasElement; } -//FIXME: removeEventListener does not work, i dunno why -//FIXME: For some reason, multiple eventlisteners are being attached, causing a multitude of keys being evoked + export class Keyboard { protected websocket: WebSocket; protected canvas: HTMLCanvasElement; protected connected!: boolean; - protected abortController: AbortController; // Store references to event listeners private keydownListener: (e: KeyboardEvent) => void; private keyupListener: (e: KeyboardEvent) => void; - constructor({ ws, canvas }: Props) { + constructor({ws, canvas}: Props) { this.websocket = ws; this.canvas = canvas; - this.abortController = new AbortController(); - this.keydownListener = this.createKeyboardListener("keydown", (e: any) => ({ type: "KeyDown", key: this.keyToVirtualKeyCode(e.code) })); - this.keyupListener = this.createKeyboardListener("keyup", (e: any) => ({ type: "KeyUp", key: this.keyToVirtualKeyCode(e.code) })); + this.keydownListener = this.createKeyboardListener("keydown", (e: any) => ({ + type: "KeyDown", + key: this.keyToVirtualKeyCode(e.code) + })); + this.keyupListener = this.createKeyboardListener("keyup", (e: any) => ({ + type: "KeyUp", + key: this.keyToVirtualKeyCode(e.code) + })); this.run() } @@ -36,8 +40,8 @@ export class Keyboard { if (document.pointerLockElement == this.canvas) { this.connected = true - document.addEventListener("keydown", this.keydownListener, { signal: this.abortController.signal }); - document.addEventListener("keyup", this.keyupListener, { signal: this.abortController.signal }); + document.addEventListener("keydown", this.keydownListener); + document.addEventListener("keyup", this.keyupListener); } else { if (this.connected) { this.stop() @@ -45,10 +49,10 @@ export class Keyboard { } } + private stop() { - this.canvas.removeEventListener("keydown", this.keydownListener); - this.canvas.removeEventListener("keyup", this.keyupListener); - this.abortController.abort(); + document.removeEventListener("keydown", this.keydownListener); + document.removeEventListener("keyup", this.keyupListener); this.connected = false; } @@ -58,56 +62,17 @@ export class Keyboard { e.preventDefault(); e.stopPropagation(); const data = dataCreator(e as any); // type assertion because of the way dataCreator is used - this.websocket.send(JSON.stringify({ ...data, type } as Input)); + this.websocket.send(JSON.stringify({...data, type} as Input)); }; } public dispose() { document.exitPointerLock(); this.stop(); - this.abortController.abort(); this.connected = false; } private keyToVirtualKeyCode(code: string) { - - const keyToVirtualKeyCodeMap = new Map([ - // ASCII - ['KeyA', 0x41], ['KeyB', 0x42], ['KeyC', 0x43], ['KeyD', 0x44], ['KeyE', 0x45], - ['KeyF', 0x46], ['KeyG', 0x47], ['KeyH', 0x48], ['KeyI', 0x49], ['KeyJ', 0x4A], - ['KeyK', 0x4B], ['KeyL', 0x4C], ['KeyM', 0x4D], ['KeyN', 0x4E], ['KeyO', 0x4F], - ['KeyP', 0x50], ['KeyQ', 0x51], ['KeyR', 0x52], ['KeyS', 0x53], ['KeyT', 0x54], - ['KeyU', 0x55], ['KeyV', 0x56], ['KeyW', 0x57], ['KeyX', 0x58], ['KeyY', 0x59], - ['KeyZ', 0x5A], - - // Digits - ['Digit0', 0x30], ['Digit1', 0x31], ['Digit2', 0x32], ['Digit3', 0x33], ['Digit4', 0x34], - ['Digit5', 0x35], ['Digit6', 0x36], ['Digit7', 0x37], ['Digit8', 0x38], ['Digit9', 0x39], - - // Special - ['Escape', 0x1B], - ['Backspace', 0x08], - ['Tab', 0x09], - ['Enter', 0x0D], - ['ShiftLeft', 0xA0], - ['ShiftRight', 0xA1], - ['ControlLeft', 0xA2], - ['ControlRight', 0xA3], - ['AltLeft', 0xA4], - ['AltRight', 0xA5], - ['Space', 0x20], - ['PageUp', 0x21], - ['PageDown', 0x22], - ['End', 0x23], - ['Home', 0x24], - ['ArrowLeft', 0x25], - ['ArrowUp', 0x26], - ['ArrowRight', 0x27], - ['ArrowDown', 0x28], - ['Insert', 0x2D], - ['Delete', 0x2E], - ]); - - return keyToVirtualKeyCodeMap.get(code) || 0; // Default to 0 for unknown keys + return keyCodeToLinuxEventCode[code] || undefined; } } \ No newline at end of file diff --git a/packages/input/src/mouse.ts b/packages/input/src/mouse.ts index 4134b1cd..efe7431b 100644 --- a/packages/input/src/mouse.ts +++ b/packages/input/src/mouse.ts @@ -1,16 +1,14 @@ -import { type Input } from "./types" +import {type Input} from "./types" +import {mouseButtonToLinuxEventCode} from "./codes" interface Props { ws: WebSocket; canvas: HTMLCanvasElement; } -//FIXME: removeEventListener does not work, i dunno why - export class Mouse { protected websocket: WebSocket; protected canvas: HTMLCanvasElement; protected connected!: boolean; - protected abortController: AbortController; // Store references to event listeners private mousemoveListener: (e: MouseEvent) => void; @@ -18,14 +16,27 @@ export class Mouse { private mouseupListener: (e: MouseEvent) => void; private mousewheelListener: (e: WheelEvent) => void; - constructor({ ws, canvas }: Props) { + constructor({ws, canvas}: Props) { this.websocket = ws; this.canvas = canvas; - this.abortController = new AbortController(); - this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ type: "MouseMove", x: e.movementX, y: e.movementY })); - this.mousedownListener = this.createMouseListener("mousedown", (e: any) => ({ type: "MouseKeyDown", key: e.button })); - this.mouseupListener = this.createMouseListener("mouseup", (e: any) => ({ type: "MouseKeyUp", key: e.button })); - this.mousewheelListener = this.createMouseListener("wheel", (e: any) => ({ type: "MouseWheel", x: e.deltaX, y: e.deltaY })); + this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ + type: "MouseMove", + x: e.movementX, + y: e.movementY + })); + this.mousedownListener = this.createMouseListener("mousedown", (e: any) => ({ + type: "MouseKeyDown", + key: this.keyToVirtualKeyCode(e.button) + })); + this.mouseupListener = this.createMouseListener("mouseup", (e: any) => ({ + type: "MouseKeyUp", + key: this.keyToVirtualKeyCode(e.button) + })); + this.mousewheelListener = this.createMouseListener("wheel", (e: any) => ({ + type: "MouseWheel", + x: e.deltaX, + y: e.deltaY + })); this.run() } @@ -41,10 +52,10 @@ export class Mouse { if (document.pointerLockElement == this.canvas) { this.connected = true - this.canvas.addEventListener("mousemove", this.mousemoveListener, { signal: this.abortController.signal }); - this.canvas.addEventListener("mousedown", this.mousedownListener, { signal: this.abortController.signal }); - this.canvas.addEventListener("mouseup", this.mouseupListener, { signal: this.abortController.signal }); - this.canvas.addEventListener("wheel", this.mousewheelListener, { signal: this.abortController.signal }); + this.canvas.addEventListener("mousemove", this.mousemoveListener); + this.canvas.addEventListener("mousedown", this.mousedownListener); + this.canvas.addEventListener("mouseup", this.mouseupListener); + this.canvas.addEventListener("wheel", this.mousewheelListener); } else { if (this.connected) { @@ -53,12 +64,12 @@ export class Mouse { } } + private stop() { this.canvas.removeEventListener("mousemove", this.mousemoveListener); this.canvas.removeEventListener("mousedown", this.mousedownListener); this.canvas.removeEventListener("mouseup", this.mouseupListener); this.canvas.removeEventListener("wheel", this.mousewheelListener); - this.abortController.abort(); this.connected = false; } @@ -68,14 +79,17 @@ export class Mouse { e.preventDefault(); e.stopPropagation(); const data = dataCreator(e as any); // type assertion because of the way dataCreator is used - this.websocket.send(JSON.stringify({ ...data, type } as Input)); + this.websocket.send(JSON.stringify({...data, type} as Input)); }; } public dispose() { document.exitPointerLock(); this.stop(); - this.abortController.abort(); this.connected = false; } + + private keyToVirtualKeyCode(code: number) { + return mouseButtonToLinuxEventCode[code] || undefined; + } } \ No newline at end of file From 5f7f4051009cd8a0691d82f61c4f4b3c25c21899 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Sun, 3 Nov 2024 12:42:32 +0300 Subject: [PATCH 09/43] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20the=20cargo=20s?= =?UTF-8?q?erver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- .patches/connectcheckskip.patch | 28 - .patches/devicearg.patch | 23 - Cargo.lock | 3895 +++++++++++++++++ Cargo.toml | 11 + apps/www/src/routes/play/[id]/index.tsx | 4 +- {.certs => packages/certs}/.gitignore | 0 .../certs}/.terraform.lock.hcl | 0 {.certs => packages/certs}/README.md | 0 {.certs => packages/certs}/input.tf | 0 {.certs => packages/certs}/main.tf | 0 {.certs => packages/certs}/terraform.tfvars | 0 {.scripts => packages/scripts}/gpu_helpers.sh | 0 packages/server/Cargo.toml | 22 + packages/server/src/main.rs | 280 ++ 15 files changed, 4214 insertions(+), 54 deletions(-) delete mode 100644 .patches/connectcheckskip.patch delete mode 100644 .patches/devicearg.patch create mode 100644 Cargo.lock create mode 100644 Cargo.toml rename {.certs => packages/certs}/.gitignore (100%) rename {.certs => packages/certs}/.terraform.lock.hcl (100%) rename {.certs => packages/certs}/README.md (100%) rename {.certs => packages/certs}/input.tf (100%) rename {.certs => packages/certs}/main.tf (100%) rename {.certs => packages/certs}/terraform.tfvars (100%) rename {.scripts => packages/scripts}/gpu_helpers.sh (100%) create mode 100644 packages/server/Cargo.toml create mode 100644 packages/server/src/main.rs diff --git a/.gitignore b/.gitignore index 97223e6b..45c4f376 100644 --- a/.gitignore +++ b/.gitignore @@ -44,4 +44,7 @@ yarn-error.log* bun.lockb #tests -id_* \ No newline at end of file +id_* + +#Rust +target \ No newline at end of file diff --git a/.patches/connectcheckskip.patch b/.patches/connectcheckskip.patch deleted file mode 100644 index 01b25ad2..00000000 --- a/.patches/connectcheckskip.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/src/utils.c b/src/utils.c -index e00f3c5..4f1f0bf 100644 ---- a/src/utils.c -+++ b/src/utils.c -@@ -71,7 +71,7 @@ void for_each_active_monitor_output_x11(Display *display, active_monitor_callbac - char display_name[256]; - for(int i = 0; i < screen_res->noutput; ++i) { - XRROutputInfo *out_info = XRRGetOutputInfo(display, screen_res, screen_res->outputs[i]); -- if(out_info && out_info->crtc && out_info->connection == RR_Connected) { -+ if(out_info && out_info->crtc) { - XRRCrtcInfo *crt_info = XRRGetCrtcInfo(display, screen_res, out_info->crtc); - if(crt_info && crt_info->mode) { - const XRRModeInfo *mode_info = get_mode_info(screen_res, crt_info->mode); -@@ -218,10 +218,10 @@ static void for_each_active_monitor_output_drm(const gsr_egl *egl, active_monito - if(connector_type) - ++connector_type->count; - -- if(connector->connection != DRM_MODE_CONNECTED) { -- drmModeFreeConnector(connector); -- continue; -- } -+ //if(connector->connection != DRM_MODE_CONNECTED) { -+ // drmModeFreeConnector(connector); -+ // continue; -+ //} - - if(connector_type) - ++connector_type->count_active; diff --git a/.patches/devicearg.patch b/.patches/devicearg.patch deleted file mode 100644 index 12fd803c..00000000 --- a/.patches/devicearg.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/src/main.cpp b/src/main.cpp -index 112a6ac..57bd9bf 100644 ---- a/src/main.cpp -+++ b/src/main.cpp -@@ -1906,6 +1906,7 @@ int main(int argc, char **argv) { - { "-gopm", Arg { {}, true, false } }, // deprecated, used keyint instead - { "-keyint", Arg { {}, true, false } }, - { "-encoder", Arg { {}, true, false } }, -+ { "-device", Arg { {}, true, false } }, - }; - - for(int i = 1; i < argc; i += 2) { -@@ -2226,6 +2227,10 @@ int main(int argc, char **argv) { - overclock = false; - } - -+ const char *dri_device = args["-device"].value(); -+ if (dri_device) -+ egl.dri_card_path = dri_device; -+ - egl.card_path[0] = '\0'; - if(wayland || egl.gpu_info.vendor != GSR_GPU_VENDOR_NVIDIA) { - // TODO: Allow specifying another card, and in other places diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..788e047a --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3895 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags 2.6.0", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-http" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash", + "base64", + "bitflags 2.6.0", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2", + "http 0.2.12", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn 2.0.87", +] + +[[package]] +name = "actix-router" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +dependencies = [ + "bytestring", + "cfg-if", + "http 0.2.12", + "regex", + "regex-lite", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "regex-lite", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "actix-ws" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3a1fb4f9f2794b0aadaf2ba5f14a6f034c7e86957b458c506a8cb75953f2d99" +dependencies = [ + "actix-codec", + "actix-http", + "actix-web", + "bytestring", + "futures-core", + "tokio", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +dependencies = [ + "backtrace", +] + +[[package]] +name = "appendlist" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e149dc73cd30538307e7ffa2acd3d2221148eaeed4871f246657b1c3eaa1cbd2" + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic_refcell" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "aws-lc-rs" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.87", + "which", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" + +[[package]] +name = "bytestring" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +dependencies = [ + "bytes", +] + +[[package]] +name = "calloop" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ead1e1514bce44c0f40e027899fbc595907fc112635bed21b3b5d975c0a5e7" +dependencies = [ + "bitflags 2.6.0", + "polling", + "rustix", + "slab", + "tracing", +] + +[[package]] +name = "cc" +version = "1.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-expr" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx", + "num-traits", +] + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-targets 0.52.6", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "cmake" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.87", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "drm" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" +dependencies = [ + "bitflags 2.6.0", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "rustix", +] + +[[package]] +name = "drm-ffi" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" +dependencies = [ + "drm-sys", + "rustix", +] + +[[package]] +name = "drm-fourcc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" + +[[package]] +name = "drm-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd39dde40b6e196c2e8763f23d119ddb1a8714534bf7d77fa97a65b0feda3986" +dependencies = [ + "libc", + "linux-raw-sys 0.6.5", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "four-cc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "795cbfc56d419a7ce47ccbb7504dd9a5b7c484c083c356e797de08bd988d9629" + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gbm" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bf55ba6dd53ad0ac115046ff999c5324c283444ee6e0be82454c4e8eb2f36a" +dependencies = [ + "bitflags 2.6.0", + "drm", + "drm-fourcc", + "gbm-sys", + "libc", + "wayland-backend", + "wayland-server", +] + +[[package]] +name = "gbm-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cc2f64de9fa707b5c6b2d2f10d7a7e49e845018a9f5685891eb40d3bab2538" +dependencies = [ + "libc", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gio-sys" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ccf87c30a12c469b6d958950f6a9c09f2be20b7773f7e70d20b867fdf2628c3" +dependencies = [ + "glib-sys 0.17.10", + "gobject-sys 0.17.10", + "libc", + "system-deps 6.2.2", + "winapi", +] + +[[package]] +name = "gio-sys" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd743ba4714d671ad6b6234e8ab2a13b42304d0e13ab7eba1dcdd78a7d6d4ef" +dependencies = [ + "glib-sys 0.19.8", + "gobject-sys 0.19.8", + "libc", + "system-deps 6.2.2", + "windows-sys 0.52.0", +] + +[[package]] +name = "gio-sys" +version = "0.21.0" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +dependencies = [ + "glib-sys 0.21.0", + "gobject-sys 0.21.0", + "libc", + "system-deps 7.0.3", + "windows-sys 0.59.0", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glib" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fad45ba8d4d2cea612b432717e834f48031cd8853c8aaf43b2c79fec8d144b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys 0.17.10", + "glib-macros 0.17.10", + "glib-sys 0.17.10", + "gobject-sys 0.17.10", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib" +version = "0.19.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39650279f135469465018daae0ba53357942a5212137515777d5fdca74984a44" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys 0.19.8", + "glib-macros 0.19.9", + "glib-sys 0.19.8", + "gobject-sys 0.19.8", + "libc", + "memchr", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib" +version = "0.21.0" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +dependencies = [ + "bitflags 2.6.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys 0.21.0", + "glib-macros 0.21.0", + "glib-sys 0.21.0", + "gobject-sys 0.21.0", + "libc", + "memchr", + "smallvec", +] + +[[package]] +name = "glib-macros" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca5c79337338391f1ab8058d6698125034ce8ef31b72a442437fa6c8580de26" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-macros" +version = "0.19.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4429b0277a14ae9751350ad9b658b1be0abb5b54faa5bcdf6e74a3372582fad7" +dependencies = [ + "heck 0.5.0", + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "glib-macros" +version = "0.21.0" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +dependencies = [ + "heck 0.5.0", + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "glib-sys" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d80aa6ea7bba0baac79222204aa786a6293078c210abe69ef1336911d4bdc4f0" +dependencies = [ + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "glib-sys" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2dc18d3a82b0006d470b13304fbbb3e0a9bd4884cf985a60a7ed733ac2c4a5" +dependencies = [ + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "glib-sys" +version = "0.21.0" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +dependencies = [ + "libc", + "system-deps 7.0.3", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gobject-sys" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd34c3317740a6358ec04572c1bcfd3ac0b5b6529275fae255b237b314bb8062" +dependencies = [ + "glib-sys 0.17.10", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gobject-sys" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e697e252d6e0416fd1d9e169bda51c0f1c926026c39ca21fbe8b1bb5c3b8b9e" +dependencies = [ + "glib-sys 0.19.8", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gobject-sys" +version = "0.21.0" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +dependencies = [ + "glib-sys 0.21.0", + "libc", + "system-deps 7.0.3", +] + +[[package]] +name = "gst-plugin-version-helper" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87921209945e5dc809848a100115fad65bd127671896f0206f45e272080cc4c9" +dependencies = [ + "chrono", +] + +[[package]] +name = "gst-plugin-version-helper" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e5e874f1660252fd2ec81c602066df3633b3a6fcbe2b196f7f93c27cf069b2a" +dependencies = [ + "chrono", + "toml_edit 0.22.22", +] + +[[package]] +name = "gst-plugin-wayland-display" +version = "0.2.0" +source = "git+https://github.com/games-on-whales/gst-wayland-display#a31f5a02a1c54ee14fca54f1eaea1a1c583ab139" +dependencies = [ + "gst-plugin-version-helper 0.7.5", + "gstreamer 0.20.7", + "gstreamer-base 0.20.7", + "gstreamer-video", + "once_cell", + "tracing", + "tracing-subscriber", + "wayland-display-core", +] + +[[package]] +name = "gstreamer" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a4150420d4aa1caf6fa15f0dba7a5007d4116380633bd1253acce206098fc9" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "futures-channel", + "futures-core", + "futures-util", + "glib 0.17.10", + "gstreamer-sys 0.20.0", + "libc", + "muldiv", + "num-integer", + "num-rational", + "once_cell", + "option-operations", + "paste", + "pretty-hex", + "smallvec", + "thiserror", +] + +[[package]] +name = "gstreamer" +version = "0.22.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d14f5b75598fa79c864803786b4b242adddbf2b86cbc378df9b7b8a1c5cf53" +dependencies = [ + "cfg-if", + "futures-channel", + "futures-core", + "futures-util", + "glib 0.19.9", + "gstreamer-sys 0.22.6", + "itertools 0.13.0", + "libc", + "muldiv", + "num-integer", + "num-rational", + "once_cell", + "option-operations", + "paste", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gstreamer" +version = "0.24.0" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs#79440636c20fda575e1eb86448951cb87572e879" +dependencies = [ + "cfg-if", + "futures-channel", + "futures-core", + "futures-util", + "glib 0.21.0", + "gstreamer-sys 0.24.0", + "itertools 0.13.0", + "libc", + "muldiv", + "num-integer", + "num-rational", + "option-operations", + "paste", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gstreamer-base" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0896c4acff303dd21d6a96a7ea4cc9339f7096230fe1433720c9f0bed203985" +dependencies = [ + "atomic_refcell", + "bitflags 1.3.2", + "cfg-if", + "glib 0.17.10", + "gstreamer 0.20.7", + "gstreamer-base-sys 0.20.0", + "libc", + "once_cell", +] + +[[package]] +name = "gstreamer-base" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39d55668b23fc69f1843daa42b43d289c00fe38e9586c5453b134783d2dd75a3" +dependencies = [ + "atomic_refcell", + "cfg-if", + "glib 0.19.9", + "gstreamer 0.22.8", + "gstreamer-base-sys 0.22.6", + "libc", +] + +[[package]] +name = "gstreamer-base-sys" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26114ed96f6668380f5a1554128159e98e06c3a7a8460f216d7cd6dce28f928c" +dependencies = [ + "glib-sys 0.17.10", + "gobject-sys 0.17.10", + "gstreamer-sys 0.20.0", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gstreamer-base-sys" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5448abb00c197e3ad306710293bf757303cbeab4036b5ccad21c7642b8bf00c9" +dependencies = [ + "glib-sys 0.19.8", + "gobject-sys 0.19.8", + "gstreamer-sys 0.22.6", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gstreamer-sys" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56fe047adef7d47dbafa8bc1340fddb53c325e16574763063702fc94b5786d2" +dependencies = [ + "glib-sys 0.17.10", + "gobject-sys 0.17.10", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gstreamer-sys" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71f147e7c6bc9313d5569eb15da61f6f64026ec69791922749de230583a07286" +dependencies = [ + "glib-sys 0.19.8", + "gobject-sys 0.19.8", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gstreamer-sys" +version = "0.24.0" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs#79440636c20fda575e1eb86448951cb87572e879" +dependencies = [ + "glib-sys 0.21.0", + "gobject-sys 0.21.0", + "libc", + "system-deps 7.0.3", +] + +[[package]] +name = "gstreamer-video" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69a9554795d3791b8467a30b35ed40ef279aa41c857e6f414ffd6a182a20225" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "futures-channel", + "glib 0.17.10", + "gstreamer 0.20.7", + "gstreamer-base 0.20.7", + "gstreamer-video-sys", + "libc", + "once_cell", +] + +[[package]] +name = "gstreamer-video-sys" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66ddb6112d438aac0004d2db6053a572f92b1c5e0e9d6ff6c71d9245f7f73e46" +dependencies = [ + "glib-sys 0.17.10", + "gobject-sys 0.17.10", + "gstreamer-base-sys 0.20.0", + "gstreamer-sys 0.20.0", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-more" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "input" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbdc09524a91f9cacd26f16734ff63d7dc650daffadd2b6f84d17a285bd875a9" +dependencies = [ + "bitflags 2.6.0", + "input-sys", + "libc", + "udev 0.9.1", +] + +[[package]] +name = "input-sys" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd4f5b4d1c00331c5245163aacfe5f20be75b564c7112d45893d4ae038119eb0" + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "io-lifetimes" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "linux-raw-sys" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" + +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "log", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + +[[package]] +name = "moq-catalog" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2619fa9d01bf7d9540692e8c6699f8462df6af02b3ebd23b9cd9686a38be793b" +dependencies = [ + "serde", +] + +[[package]] +name = "moq-gst" +version = "0.1.0" +source = "git+https://github.com/kixelated/moq-gst#d8436e61d0269c5ee26cdd784351473933c963f6" +dependencies = [ + "anyhow", + "bytes", + "env_logger 0.9.3", + "gst-plugin-version-helper 0.8.2", + "gstreamer 0.22.8", + "gstreamer-base 0.22.6", + "moq-native", + "moq-pub", + "moq-transport", + "once_cell", + "tokio", + "url", +] + +[[package]] +name = "moq-native" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "431ed68c3fc33dc8013c0ef8538fb240a68de1a4947b6601e1cf806863dca44d" +dependencies = [ + "anyhow", + "clap", + "futures", + "hex", + "log", + "moq-transport", + "quinn", + "ring", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "tokio", + "url", + "web-transport", + "web-transport-quinn", + "webpki", +] + +[[package]] +name = "moq-pub" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b734c8c64836373d0aab4a86481078c0c811486ed3707c25a05599efd75aab52" +dependencies = [ + "anyhow", + "bytes", + "clap", + "env_logger 0.11.5", + "log", + "moq-catalog", + "moq-native", + "moq-transport", + "mp4", + "rfc6381-codec", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "moq-transport" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddda15a420e8510d349c1f33ac006cc950f282f61201e77b6dd555a6f8955f92" +dependencies = [ + "bytes", + "futures", + "log", + "paste", + "thiserror", + "tokio", + "web-transport", +] + +[[package]] +name = "mp4" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9ef834d5ed55e494a2ae350220314dc4aacd1c43a9498b00e320e0ea352a5c3" +dependencies = [ + "byteorder", + "bytes", + "num-rational", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "mp4ra-rust" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdbc3d3867085d66ac6270482e66f3dd2c5a18451a3dc9ad7269e94844a536b7" +dependencies = [ + "four-cc", +] + +[[package]] +name = "mpeg4-audio-const" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a1fe2275b68991faded2c80aa4a33dba398b77d276038b8f50701a22e55918" + +[[package]] +name = "muldiv" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" + +[[package]] +name = "nestri-server" +version = "0.1.0" +dependencies = [ + "actix-web", + "actix-ws", + "futures-util", + "gst-plugin-wayland-display", + "gstreamer 0.24.0", + "moq-gst", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", + "wayland-display-core", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "option-operations" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" +dependencies = [ + "paste", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "polling" +version = "3.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "pretty-hex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" + +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.87", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.22", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.87", +] + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.0.0", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash 2.0.0", + "rustls", + "rustls-platform-verifier", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e346e016eacfff12233c243718197ca12f148c84e1e84268a896699b41c71780" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rfc6381-codec" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed54c20f5c3ec82eab6d998b313dc75ec5d5650d4f57675e61d72489040297fd" +dependencies = [ + "mp4ra-rust", + "mpeg4-audio-const", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" + +[[package]] +name = "rustls-platform-verifier" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-roots", + "winapi", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scan_fmt" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b53b0a5db882a8e2fdaae0a43f7b39e7e9082389e978398bdf223a55b581248" + +[[package]] +name = "schannel" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "num-bigint", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay" +version = "0.3.0" +source = "git+https://github.com/games-on-whales/smithay?rev=ef9782b#ef9782b8548c6e876bc61052e4e09351e4071a35" +dependencies = [ + "appendlist", + "bitflags 2.6.0", + "calloop", + "cgmath", + "cursor-icon", + "downcast-rs", + "drm", + "drm-ffi", + "drm-fourcc", + "errno", + "gbm", + "gl_generator", + "indexmap", + "input", + "lazy_static", + "libc", + "libloading", + "once_cell", + "profiling", + "rand", + "rustix", + "scan_fmt", + "smallvec", + "tempfile", + "thiserror", + "tracing", + "udev 0.8.0", + "wayland-backend", + "wayland-protocols", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-server", + "wayland-sys", + "xkbcommon", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr 0.15.8", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "system-deps" +version = "7.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" +dependencies = [ + "cfg-expr 0.17.0", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.22", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.20", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "udev" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50051c6e22be28ee6f217d50014f3bc29e81c20dc66ff7ca0d5c5226e1dcc5a1" +dependencies = [ + "io-lifetimes 1.0.11", + "libc", + "libudev-sys", + "pkg-config", +] + +[[package]] +name = "udev" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d5c197b95f1769931c89f85c33c407801d1fb7a311113bc0b39ad036f1bd81" +dependencies = [ + "io-lifetimes 1.0.11", + "libc", + "libudev-sys", + "pkg-config", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.87", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-display-core" +version = "0.2.0" +source = "git+https://github.com/games-on-whales/gst-wayland-display#a31f5a02a1c54ee14fca54f1eaea1a1c583ab139" +dependencies = [ + "gstreamer 0.20.7", + "gstreamer-video", + "once_cell", + "smithay", + "tracing", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2e42969764e469a115d4bb1c16e9588ef8b75b127ba7a2c9ddf1e140b25ca7" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-protocols", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-protocols", + "wayland-scanner", + "wayland-server", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-server" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89532cc712a2adb119eb4d09694b402576052254d0bb284f82ac1c47fb786ad" +dependencies = [ + "bitflags 2.6.0", + "downcast-rs", + "io-lifetimes 2.0.3", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "libc", + "log", + "memoffset", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-transport" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4703a5ad424f8eca7860903b94f6ed747cf58bebba3081ede78e84493a12440c" +dependencies = [ + "bytes", + "thiserror", + "web-transport-quinn", + "web-transport-wasm", +] + +[[package]] +name = "web-transport-proto" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3806ea43df5817f0d90618c842d28db5946bc18a5db0659b2275c2be48d472" +dependencies = [ + "bytes", + "http 1.1.0", + "thiserror", + "url", +] + +[[package]] +name = "web-transport-quinn" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3020b51cda10472a365e42d9a701916d4f04d74cc743de08246ef6a421c2d137" +dependencies = [ + "bytes", + "futures", + "http 1.1.0", + "log", + "quinn", + "quinn-proto", + "thiserror", + "tokio", + "url", + "web-transport-proto", +] + +[[package]] +name = "web-transport-wasm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66e8f572ad133af04a5aa4a207d48d3f6a2f1f3006aa1b8f0d774d28c085d699" +dependencies = [ + "bytes", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "webpki" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.26.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "xkbcommon" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" +dependencies = [ + "libc", + "memmap2", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zstd" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..87246208 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[workspace] +resolver = "2" +members = [ + "packages/server" +] + +[workspace.package] +version = "0.1.0-alpha.1" +repository = "https://github.com/nestriness/nestri" +edition = "2021" +rust-version = "1.80" \ No newline at end of file diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index 58ee1259..c86ef9d0 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -13,7 +13,7 @@ export default component$(() => { track(() => canvas.value); if (!canvas.value) return; // Ensure canvas is available/87.100.239.153 - new WS({ canvas: canvas.value, url: "ws://localhost:8081/ws" }); + new WS({ canvas: canvas.value, url: "ws://87.100.239.153:8081/ws" }); }) @@ -169,4 +169,4 @@ user agent stylesheet // // Update last position and time // *last_move = (x, y, now); // } -// } \ No newline at end of file +// } diff --git a/.certs/.gitignore b/packages/certs/.gitignore similarity index 100% rename from .certs/.gitignore rename to packages/certs/.gitignore diff --git a/.certs/.terraform.lock.hcl b/packages/certs/.terraform.lock.hcl similarity index 100% rename from .certs/.terraform.lock.hcl rename to packages/certs/.terraform.lock.hcl diff --git a/.certs/README.md b/packages/certs/README.md similarity index 100% rename from .certs/README.md rename to packages/certs/README.md diff --git a/.certs/input.tf b/packages/certs/input.tf similarity index 100% rename from .certs/input.tf rename to packages/certs/input.tf diff --git a/.certs/main.tf b/packages/certs/main.tf similarity index 100% rename from .certs/main.tf rename to packages/certs/main.tf diff --git a/.certs/terraform.tfvars b/packages/certs/terraform.tfvars similarity index 100% rename from .certs/terraform.tfvars rename to packages/certs/terraform.tfvars diff --git a/.scripts/gpu_helpers.sh b/packages/scripts/gpu_helpers.sh similarity index 100% rename from .scripts/gpu_helpers.sh rename to packages/scripts/gpu_helpers.sh diff --git a/packages/server/Cargo.toml b/packages/server/Cargo.toml new file mode 100644 index 00000000..8d9eb4c7 --- /dev/null +++ b/packages/server/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "nestri-server" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "nestri-server" +path = "src/main.rs" + +[dependencies] +gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", version = "0.24.0" } +gst-plugin-wayland-display = { git = "https://github.com/games-on-whales/gst-wayland-display", version = "0.2.0" } +wayland-display-core = { git = "https://github.com/games-on-whales/gst-wayland-display", version = "0.2.0" } +moq-gst = { git = "https://github.com/kixelated/moq-gst", version = "0.1.0" } +tokio = { version = "1.41.0", features = ["full"] } +serde = {version = "1.0.214", features = ["derive"] } +tracing-subscriber = "0.3" +futures-util = "0.3.31" +serde_json = "1.0.132" +actix-web = "4.9.0" +tracing = "0.1.40" +actix-ws = "0.3.0" \ No newline at end of file diff --git a/packages/server/src/main.rs b/packages/server/src/main.rs new file mode 100644 index 00000000..72890b19 --- /dev/null +++ b/packages/server/src/main.rs @@ -0,0 +1,280 @@ +use actix_web::{rt, web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder}; +use actix_ws::Message; +use futures_util::{ + future::{self, Either}, + StreamExt as _, +}; +use gst::prelude::*; +use serde::{Deserialize, Serialize}; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, Instant}; +use tokio::{pin, time::interval}; + +const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(5); +/// How long before lack of client response causes a timeout. +const CLIENT_TIMEOUT: Duration = Duration::from_secs(10); +struct AppState { + pipeline: Arc>, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(tag = "type")] +enum InputMessage { + #[serde(rename = "mousemove")] + MouseMove { x: i32, y: i32 }, + + #[serde(rename = "wheel")] + Wheel { x: f64, y: f64 }, + + #[serde(rename = "mousedown")] + MouseDown { key: i32 }, + // Add other variants as needed + #[serde(rename = "mouseup")] + MouseUp { key: i32 }, + + #[serde(rename = "keydown")] + KeyDown { key: i32 }, + + #[serde(rename = "keyup")] + KeyUp { key: i32 }, +} + +async fn hello_world() -> impl Responder { + "Hello world!" +} + +async fn handle_events( + req: HttpRequest, + stream: web::Payload, + state: web::Data, +) -> Result { + let (res, mut session, mut stream) = actix_ws::handle(&req, stream)?; + // start task but don't wait for it + rt::spawn(async move { + // receive messages from websocket + let state = state.into_inner(); + let pipeline = state.pipeline.lock().unwrap(); + + let mut last_heartbeat = Instant::now(); + let mut interval = interval(HEARTBEAT_INTERVAL); + + let reason = loop { + // create "next client timeout check" future + let tick = interval.tick(); + // required for select() + pin!(tick); + + // waits for either `msg_stream` to receive a message from the client or the heartbeat + // interval timer to tick, yielding the value of whichever one is ready first + match future::select(stream.next(), tick).await { + // received message from WebSocket client + Either::Left((Some(Ok(msg)), _)) => { + match msg { + Message::Text(text) => { + // session.text(text).await.unwrap(); + match serde_json::from_str::(&text) { + Ok(input_msg) => match input_msg { + InputMessage::MouseMove { x, y } => { + + let structure = + gst::Structure::builder("MouseMoveRelative") + .field("pointer_x", x as f64) + .field("pointer_y", y as f64) + .build(); + + let event = gst::event::CustomUpstream::new(structure); + pipeline.send_event(event); + } + + InputMessage::KeyDown { key } => { + + let structure = gst::Structure::builder("KeyboardKey") + .field("key", key as u32) + .field("pressed", true) + .build(); + + let event = gst::event::CustomUpstream::new(structure); + pipeline.send_event(event); + } + + InputMessage::KeyUp { key } => { + + let structure: gst::Structure = + gst::Structure::builder("KeyboardKey") + .field("key", key as u32) + .field("pressed", false) + .build(); + + let event = gst::event::CustomUpstream::new(structure); + pipeline.send_event(event); + } + + InputMessage::Wheel { x, y } => { + + let structure = gst::Structure::builder("MouseAxis") + .field("x", x as f64) + .field("y", y as f64) + .build(); + + let event = gst::event::CustomUpstream::new(structure); + pipeline.send_event(event); + } + + InputMessage::MouseDown { key } => { + + let structure = gst::Structure::builder("MouseButton") + .field("button", key as u32) + .field("pressed", true) + .build(); + + let event = gst::event::CustomUpstream::new(structure); + pipeline.send_event(event); + } + + InputMessage::MouseUp { key } => { + + let structure = gst::Structure::builder("MouseButton") + .field("button", key as u32) + .field("pressed", false) + .build(); + + let event = gst::event::CustomUpstream::new(structure); + pipeline.send_event(event); + } + }, + Err(e) => { + eprintln!("Failed to parse input message: {}", e); + // Optionally, send an error response or handle the error + } + } + } + + Message::Binary(bin) => { + session.binary(bin).await.unwrap(); + } + + Message::Close(reason) => { + break reason; + } + + Message::Ping(bytes) => { + last_heartbeat = Instant::now(); + let _ = session.pong(&bytes).await; + } + + Message::Pong(_) => { + last_heartbeat = Instant::now(); + } + + Message::Continuation(_) => { + println!("no support for continuation frames"); + } + // no-op; ignore + Message::Nop => {} + }; + } + + Either::Left((Some(Err(err)), _)) => { + println!("{}", err); + break None; + } + + // client WebSocket stream ended + Either::Left((None, _)) => break None, + + // heartbeat interval ticked + Either::Right((_inst, _)) => { + // if no heartbeat ping/pong received recently, close the connection + if Instant::now().duration_since(last_heartbeat) > CLIENT_TIMEOUT { + println!( + "client has not sent heartbeat in over {CLIENT_TIMEOUT:?}; disconnecting" + ); + + break None; + } + + // send heartbeat ping + let _ = session.ping(b"").await; + } + } + }; + // attempt to close connection gracefully + let _ = session.close(reason).await; + }); + + // respond immediately with response connected to WS session + Ok(res) +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + let _ = gst::init(); + + let _ = gstmoq::plugin_register_static(); + let _ = gstwaylanddisplaysrc::plugin_register_static(); + + let pipeline = gst::parse::launch( + " + waylanddisplaysrc \ + ! video/x-raw,width=1280,height=720,format=RGBx,framerate=60/1 \ + ! videoconvertscale\ + ! qsvh264enc low-latency=true \ + ! h264parse \ + ! isofmp4mux name=mux chunk-duration=1 fragment-duration=1 \ + ! moqsink url=https://relay.fst.so namespace=testing + ", + ) + .unwrap() + .downcast::() + .unwrap(); + + let _ = pipeline.set_state(gst::State::Playing); + + let app_state = web::Data::new(AppState { + pipeline: Arc::new(Mutex::new(pipeline.clone())), + }); + + let pipeline_clone = pipeline.clone(); + + std::thread::spawn(move || { + let bus = pipeline_clone + .bus() + .expect("Pipeline without bus. Shouldn't happen!"); + + for msg in bus.iter_timed(gst::ClockTime::NONE) { + use gst::MessageView; + + match msg.view() { + MessageView::Eos(..) => { + println!("EOS"); + break; + } + MessageView::Error(err) => { + let _ = pipeline_clone.set_state(gst::State::Null); + eprintln!( + "Got error from {}: {} ({})", + msg.src() + .map(|s| String::from(s.path_string())) + .unwrap_or_else(|| "None".into()), + err.error(), + err.debug().unwrap_or_else(|| "".into()), + ); + break; + } + _ => (), + } + } + + let _ = pipeline.set_state(gst::State::Null); + }); + + HttpServer::new(move || { + App::new() + .app_data(app_state.clone()) + .service(web::resource("/ws").route(web::get().to(handle_events))) + .service(web::resource("/").route(web::get().to(hello_world))) + }) + .bind("0.0.0.0:8081")? + .run() + .await +} \ No newline at end of file From 9763c45c2325e869bbca00f0f501ffb55eb6dde8 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Sun, 3 Nov 2024 17:09:03 +0300 Subject: [PATCH 10/43] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20=20a=20Dockerfi?= =?UTF-8?q?le?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 1 - Containerfile | 136 +++++++++++++++++++++++++++++++++++ packages/server/Cargo.toml | 1 - packages/server/pkg/PKGBUILD | 32 +++++++++ 4 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 Containerfile create mode 100644 packages/server/pkg/PKGBUILD diff --git a/Cargo.lock b/Cargo.lock index 788e047a..432f1044 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2129,7 +2129,6 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "wayland-display-core", ] [[package]] diff --git a/Containerfile b/Containerfile new file mode 100644 index 00000000..d3878490 --- /dev/null +++ b/Containerfile @@ -0,0 +1,136 @@ + +#****************************************************************************** +# base +#****************************************************************************** +FROM archlinux:base-20241027.0.273886 AS base + +# Update the pacman repo +RUN \ + pacman -Syu --noconfirm + +#****************************************************************************** +# builder +#****************************************************************************** + +FROM base AS builder + +RUN \ + pacman -Su --noconfirm \ + base-devel \ + git \ + sudo \ + vim + +WORKDIR /scratch + +# Allow nobody user to invoke pacman to install packages (as part of makepkg) and modify the system. +# This should never exist in a running image, just used by *-build Docker stages. +RUN \ + echo "nobody ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; + +ENV ARTIFACTS=/artifacts \ + CARGO_TARGET_DIR=/build + +RUN \ + mkdir -p /artifacts \ + && mkdir -p /build + +RUN \ + chgrp nobody /scratch /artifacts /build \ + && chmod g+ws /scratch /artifacts /build + +#****************************************************************************** +# rust-builder +#****************************************************************************** + +FROM builder AS rust-builder + +RUN \ + pacman -Su --noconfirm \ + rustup + +RUN \ + rustup default stable + +#****************************************************************************** +# nestri-server-builder +#****************************************************************************** +# Builds nestri server binary +FROM rust-builder AS nestri-server-builder + +RUN \ + pacman -Su --noconfirm \ + wayland \ + vpl-gpu-rt \ + gstreamer \ + gst-plugin-va \ + gst-plugins-base \ + gst-plugins-good \ + mesa-utils \ + weston \ + xorg-xwayland + + +#****************************************************************************** +# nestri-server-build +#****************************************************************************** + +FROM nestri-server-builder AS nestri-server-build + +#Allow makepkg to be run as nobody. +RUN chgrp -R nobody /scratch && chmod -R g+ws /scratch + +# USER nobody + +# Perform the server build. +WORKDIR /scratch/server + +RUN \ + git clone https://github.com/nestriness/nestri + +WORKDIR /scratch/server/nestri + +RUN \ + git checkout feat/stream \ + && cargo build -j$(nproc) --release + +# COPY packages/server/build/ /scratch/server/ + +# RUN makepkg && cp *.zst "$ARTIFACTS" +#****************************************************************************** +# runtime_base_pkgs +#****************************************************************************** + +FROM base AS runtime_base_pkgs + +COPY --from=nestri-server-build /build/release/nestri-server /usr/bin/ + +#****************************************************************************** +# runtime_base +#****************************************************************************** + +FROM runtime_base_pkgs AS runtime_base + +RUN \ + pacman -Su --noconfirm \ + weston \ + sudo \ + xorg-xwayland \ + gstreamer \ + gst-plugins-base \ + gst-plugins-good \ + gst-plugin-qsv \ + gst-plugin-va \ + gst-plugin-fmp4 \ + mesa \ + # Grab GPU encoding packages + # Intel (modern VPL + VA-API) + vpl-gpu-rt \ + intel-media-driver \ + # AMD/ATI (VA-API) + libva-mesa-driver \ + # NVIDIA (proprietary) + nvidia-utils + +ENV \ + XDG_RUNTIME_DIR=/tmp \ No newline at end of file diff --git a/packages/server/Cargo.toml b/packages/server/Cargo.toml index 8d9eb4c7..cbd6096a 100644 --- a/packages/server/Cargo.toml +++ b/packages/server/Cargo.toml @@ -10,7 +10,6 @@ path = "src/main.rs" [dependencies] gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", version = "0.24.0" } gst-plugin-wayland-display = { git = "https://github.com/games-on-whales/gst-wayland-display", version = "0.2.0" } -wayland-display-core = { git = "https://github.com/games-on-whales/gst-wayland-display", version = "0.2.0" } moq-gst = { git = "https://github.com/kixelated/moq-gst", version = "0.1.0" } tokio = { version = "1.41.0", features = ["full"] } serde = {version = "1.0.214", features = ["derive"] } diff --git a/packages/server/pkg/PKGBUILD b/packages/server/pkg/PKGBUILD new file mode 100644 index 00000000..c172511e --- /dev/null +++ b/packages/server/pkg/PKGBUILD @@ -0,0 +1,32 @@ +pkgname=nestri-git +pkgver=0.0.1 +pkgrel=1 +pkgdesc='[Experimental] An open-source, self-hosted Geforce Now alternative' +arch=('x86_64') +url='https://github.com/nestriness/nestri' +license=('AGPL-3.0') +provides=("${pkgname%-git}") +conflicts=("${pkgname%-git}") +depends=('rust' 'git' 'rustup' 'pkgconf' 'wayland') +source=("nestri::git+https://github.com/nestriness/nestri.git") +sha512sums=('SKIP') +pkgver() { + cd "$srcdir/${pkgname%-git}" + printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" +} + +prepare() { + cd "$srcdir/${pkgname%-git}" +} + +build() { + cd "$srcdir/${pkgname%-git}/packages/server" + + CARGO_TARGET_DIR="./build" sudo cargo build -j$(nproc) +} + +package() { + cd "$srcdir/${pkgname%-git}/packages/server" + + install -m755 -Dt "${pkgdir}/usr/bin" build/release/nestri +} \ No newline at end of file From d2bc57d3b595a227d27cf1f5cc4903254e6c52db Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Sun, 3 Nov 2024 19:03:30 +0300 Subject: [PATCH 11/43] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20audio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Containerfile | 78 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/Containerfile b/Containerfile index d3878490..fcc37fd9 100644 --- a/Containerfile +++ b/Containerfile @@ -3,6 +3,12 @@ # base #****************************************************************************** FROM archlinux:base-20241027.0.273886 AS base +# How to run - docker run -it --rm --device /dev/dri nestri /bin/bash - DO NOT forget the ports +# TODO: Migrate XDG_RUNTIME_DIR to /run/user/1000 +# TODO: Add nestri-server to pulseaudio.conf +# TODO: Add our own entrypoint, with our very own zombie ripper 🧟🏾‍♀️ +# FIXME: Add user root to `pulse-access` group as well :D +# TODO: Test the whole damn thing # Update the pacman repo RUN \ @@ -130,7 +136,75 @@ RUN \ # AMD/ATI (VA-API) libva-mesa-driver \ # NVIDIA (proprietary) - nvidia-utils + nvidia-utils \ + # Audio + pulseaudio \ + # Supervisor + supervisor + +RUN \ + # Set up our non-root user $(nestri) + groupadd -g 1000 nestri \ + && useradd -ms /bin/bash nestri -u 1000 -g 1000 \ + && passwd -d nestri \ + # Setup Pulseaudio + && useradd -d /var/run/pulse -s /usr/bin/nologin -G audio pulse \ + && groupadd pulse-access \ + && usermod -aG audio,input,render,video,pulse-access nestri \ + && echo "nestri ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \ + && echo "Users created" \ + # Create an empty machine-id file + && touch /etc/machine-id + +RUN \ + pacman -Su --noconfirm \ + pulseaudio ENV \ - XDG_RUNTIME_DIR=/tmp \ No newline at end of file + XDG_RUNTIME_DIR=/tmp + +#****************************************************************************** +# runtime +#****************************************************************************** + +FROM runtime_base AS runtime +# Setup supervisor # +RUN <<-EOF + echo -e " + [supervisord] + user=root + nodaemon=true + loglevel=info + logfile=/tmp/supervisord.log + pidfile=/tmp/supervisord.pid + + [program:dbus] + user=root + command=dbus-daemon --system --nofork + logfile=/tmp/dbus.log + pidfile=/tmp/dbus.pid + stopsignal=INT + autostart=true + autorestart=true + priority=1 + + [program:pulseaudio] + user=root + command=pulseaudio --daemonize=no --system --disallow-module-loading --disallow-exit --exit-idle-time=-1 + logfile=/tmp/pulseaudio.log + pidfile=/tmp/pulseaudio.pid + stopsignal=INT + autostart=true + autorestart=true + priority=10 + " | tee /etc/supervisord.conf +EOF + +RUN \ + chown -R nestri:nestri /tmp /etc/supervisord.conf + +ENV USER=nestri +USER 1000 + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"] +# Debug - pactl list \ No newline at end of file From d820985a4d45514418fff60a8b4292d0fdf3bba7 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Thu, 7 Nov 2024 12:40:53 +0300 Subject: [PATCH 12/43] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20`moq-transfork`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Containerfile | 4 - apps/www/package.json | 3 +- .../src/routes/(moq)/moq/checker/index.tsx | 11 +- .../src/routes/(moq)/moq/checker/tester.ts | 316 +-- apps/www/src/routes/play/[id]/index.tsx | 12 +- bun.lockb | Bin 769480 -> 768752 bytes packages/moq/.eslintrc.cjs | 2 +- packages/moq/common/async.ts | 7 +- packages/moq/common/hex.ts | 11 + packages/moq/contribute/audio.ts | 69 +- packages/moq/contribute/broadcast.ts | 255 +-- packages/moq/contribute/chunk.ts | 7 - packages/moq/contribute/container.ts | 165 -- packages/moq/contribute/segment.ts | 14 +- packages/moq/contribute/track.ts | 25 +- packages/moq/contribute/tsconfig.json | 4 +- packages/moq/contribute/video.ts | 67 +- packages/moq/karp/catalog/audio.ts | 17 + packages/moq/karp/catalog/broadcast.ts | 59 + packages/moq/karp/catalog/index.ts | 7 + packages/moq/karp/catalog/track.ts | 12 + packages/moq/karp/catalog/video.ts | 26 + packages/moq/karp/frame.ts | 64 + packages/moq/{media => karp}/tsconfig.json | 6 +- packages/moq/media/catalog/index.ts | 218 -- packages/moq/media/mp4/index.ts | 37 - packages/moq/media/mp4/parser.ts | 71 - packages/moq/media/mp4/rename.ts | 13 - packages/moq/package.json | 5 +- packages/moq/playback/audio.ts | 99 +- packages/moq/playback/backend.ts | 114 - packages/moq/playback/broadcast.ts | 143 ++ packages/moq/playback/index.ts | 192 +- packages/moq/playback/player.ts | 57 + .../moq/playback/{worker => }/timeline.ts | 3 +- packages/moq/playback/tsconfig.json | 4 +- packages/moq/playback/{worker => }/video.ts | 57 +- packages/moq/playback/worker/audio.ts | 73 - packages/moq/playback/worker/index.ts | 120 -- packages/moq/playback/worker/message.ts | 98 - .../moq/{transport => transfork}/client.ts | 46 +- packages/moq/transfork/connection.ts | 156 ++ packages/moq/transfork/error.ts | 20 + packages/moq/transfork/frame.ts | 45 + .../moq/{transport => transfork}/index.ts | 4 +- packages/moq/transfork/message.ts | 428 ++++ packages/moq/transfork/model.ts | 170 ++ packages/moq/transfork/publisher.ts | 173 ++ .../moq/{transport => transfork}/stream.ts | 160 +- packages/moq/transfork/subscriber.ts | 168 ++ .../{transport => transfork}/tsconfig.json | 0 packages/moq/transport/connection.ts | 95 - packages/moq/transport/control.ts | 550 ----- packages/moq/transport/objects.ts | 307 --- packages/moq/transport/publisher.ts | 230 -- packages/moq/transport/setup.ts | 163 -- packages/moq/transport/subscriber.ts | 197 -- packages/moq/tsconfig.json | 6 +- packages/moq/types/mp4box.d.ts | 1848 ----------------- packages/moq/types/tsconfig.json | 4 - 60 files changed, 2222 insertions(+), 5015 deletions(-) create mode 100644 packages/moq/common/hex.ts delete mode 100644 packages/moq/contribute/chunk.ts delete mode 100644 packages/moq/contribute/container.ts create mode 100644 packages/moq/karp/catalog/audio.ts create mode 100644 packages/moq/karp/catalog/broadcast.ts create mode 100644 packages/moq/karp/catalog/index.ts create mode 100644 packages/moq/karp/catalog/track.ts create mode 100644 packages/moq/karp/catalog/video.ts create mode 100644 packages/moq/karp/frame.ts rename packages/moq/{media => karp}/tsconfig.json (60%) delete mode 100644 packages/moq/media/catalog/index.ts delete mode 100644 packages/moq/media/mp4/index.ts delete mode 100644 packages/moq/media/mp4/parser.ts delete mode 100644 packages/moq/media/mp4/rename.ts delete mode 100644 packages/moq/playback/backend.ts create mode 100644 packages/moq/playback/broadcast.ts create mode 100644 packages/moq/playback/player.ts rename packages/moq/playback/{worker => }/timeline.ts (97%) rename packages/moq/playback/{worker => }/video.ts (50%) delete mode 100644 packages/moq/playback/worker/audio.ts delete mode 100644 packages/moq/playback/worker/index.ts delete mode 100644 packages/moq/playback/worker/message.ts rename packages/moq/{transport => transfork}/client.ts (51%) create mode 100644 packages/moq/transfork/connection.ts create mode 100644 packages/moq/transfork/error.ts create mode 100644 packages/moq/transfork/frame.ts rename packages/moq/{transport => transfork}/index.ts (51%) create mode 100644 packages/moq/transfork/message.ts create mode 100644 packages/moq/transfork/model.ts create mode 100644 packages/moq/transfork/publisher.ts rename packages/moq/{transport => transfork}/stream.ts (60%) create mode 100644 packages/moq/transfork/subscriber.ts rename packages/moq/{transport => transfork}/tsconfig.json (100%) delete mode 100644 packages/moq/transport/connection.ts delete mode 100644 packages/moq/transport/control.ts delete mode 100644 packages/moq/transport/objects.ts delete mode 100644 packages/moq/transport/publisher.ts delete mode 100644 packages/moq/transport/setup.ts delete mode 100644 packages/moq/transport/subscriber.ts delete mode 100644 packages/moq/types/mp4box.d.ts delete mode 100644 packages/moq/types/tsconfig.json diff --git a/Containerfile b/Containerfile index fcc37fd9..c03d0b03 100644 --- a/Containerfile +++ b/Containerfile @@ -156,10 +156,6 @@ RUN \ # Create an empty machine-id file && touch /etc/machine-id -RUN \ - pacman -Su --noconfirm \ - pulseaudio - ENV \ XDG_RUNTIME_DIR=/tmp diff --git a/apps/www/package.json b/apps/www/package.json index 659d3492..8354974e 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -32,12 +32,11 @@ "@builder.io/qwik": "^1.8.0", "@builder.io/qwik-city": "^1.8.0", "@builder.io/qwik-react": "0.5.0", - "@kixelated/moq": "^0.2.0", "@modular-forms/qwik": "^0.27.0", "@nestri/eslint-config": "*", "@nestri/input": "*", - "@nestri/moq": "*", "@nestri/typescript-config": "*", + "@nestri/libmoq": "*", "@nestri/ui": "*", "@types/eslint": "8.56.10", "@types/node": "^22.5.1", diff --git a/apps/www/src/routes/(moq)/moq/checker/index.tsx b/apps/www/src/routes/(moq)/moq/checker/index.tsx index aee03dc5..612f2666 100644 --- a/apps/www/src/routes/(moq)/moq/checker/index.tsx +++ b/apps/www/src/routes/(moq)/moq/checker/index.tsx @@ -1,5 +1,6 @@ import * as v from "valibot" -import { Broadcast } from "./tester"; +//FIXME: Make sure this works +// import { Broadcast } from "./tester"; import { cn } from "@nestri/ui/design"; import { routeLoader$ } from "@builder.io/qwik-city"; import { component$, $, useSignal } from "@builder.io/qwik"; @@ -36,11 +37,11 @@ export default component$(() => { const handleSubmit = $>(async (values) => { const randomNamespace = generateRandomWord(6); - const sub = await Broadcast.init({ url: values.url, fingerprint: undefined, namespace: randomNamespace }) + // const sub = await Broadcast.init({ url: values.url, fingerprint: undefined, namespace: randomNamespace }) - setTimeout(() => { - broadcasterOk.value = sub.isSubscribed() - }, 1000); + // setTimeout(() => { + // broadcasterOk.value = sub.isSubscribed() + // }, 1000); }); return ( diff --git a/apps/www/src/routes/(moq)/moq/checker/tester.ts b/apps/www/src/routes/(moq)/moq/checker/tester.ts index 11446ea8..09cca337 100644 --- a/apps/www/src/routes/(moq)/moq/checker/tester.ts +++ b/apps/www/src/routes/(moq)/moq/checker/tester.ts @@ -1,208 +1,208 @@ -import type { Connection, SubscribeRecv } from "@nestri/moq/transport" -import { asError } from "@nestri/moq/common/error" -import { Client } from "@nestri/moq/transport/client" -import * as Catalog from "@nestri/moq/media/catalog" -import { type GroupWriter } from "@nestri/moq/transport/objects" - -export interface BroadcastConfig { - namespace: string - connection: Connection -} -export interface BroadcasterConfig { - url: string - namespace: string - fingerprint?: string // URL to fetch TLS certificate fingerprint -} - -export interface BroadcastConfigTrack { - input: string - bitrate: number -} +// import type { Connection, SubscribeRecv } from "@nestri/libmoq/transport" +// import { asError } from "@nestri/moq/common/error" +// import { Client } from "@nestri/moq/transport/client" +// import * as Catalog from "@nestri/moq/media/catalog" +// import { type GroupWriter } from "@nestri/moq/transport/objects" + +// export interface BroadcastConfig { +// namespace: string +// connection: Connection +// } +// export interface BroadcasterConfig { +// url: string +// namespace: string +// fingerprint?: string // URL to fetch TLS certificate fingerprint +// } + +// export interface BroadcastConfigTrack { +// input: string +// bitrate: number +// } -export class Broadcast { - stream: GroupWriter | null - subscriber: SubscribeRecv | null - subscribed: boolean; +// export class Broadcast { +// stream: GroupWriter | null +// subscriber: SubscribeRecv | null +// subscribed: boolean; - readonly config: BroadcastConfig - readonly catalog: Catalog.Root - readonly connection: Connection - readonly namespace: string +// readonly config: BroadcastConfig +// readonly catalog: Catalog.Root +// readonly connection: Connection +// readonly namespace: string - #running: Promise +// #running: Promise - constructor(config: BroadcastConfig) { - this.subscribed = false - this.namespace = config.namespace - this.connection = config.connection - this.config = config - //Arbitrary values, just to keep TypeScript happy :) - this.catalog = { - version: 1, - streamingFormat: 1, - streamingFormatVersion: "0.2", - supportsDeltaUpdates: false, - commonTrackFields: { - packaging: "loc", - renderGroup: 1, - }, - tracks: [{ - name: "tester", - namespace: "tester", - selectionParams: {} - }], - } - this.stream = null - this.subscriber = null +// constructor(config: BroadcastConfig) { +// this.subscribed = false +// this.namespace = config.namespace +// this.connection = config.connection +// this.config = config +// //Arbitrary values, just to keep TypeScript happy :) +// this.catalog = { +// version: 1, +// streamingFormat: 1, +// streamingFormatVersion: "0.2", +// supportsDeltaUpdates: false, +// commonTrackFields: { +// packaging: "loc", +// renderGroup: 1, +// }, +// tracks: [{ +// name: "tester", +// namespace: "tester", +// selectionParams: {} +// }], +// } +// this.stream = null +// this.subscriber = null - this.#running = this.#run() - } +// this.#running = this.#run() +// } - static async init(config: BroadcasterConfig): Promise { - const client = new Client({ url: config.url, fingerprint: config.fingerprint, role: "publisher" }) - const connection = await client.connect(); +// static async init(config: BroadcasterConfig): Promise { +// const client = new Client({ url: config.url, fingerprint: config.fingerprint, role: "publisher" }) +// const connection = await client.connect(); - return new Broadcast({ connection, namespace: config.namespace }) - } +// return new Broadcast({ connection, namespace: config.namespace }) +// } - async #run() { - try { - await this.connection.announce(this.namespace) - this.subscribed = true - } catch (error) { +// async #run() { +// try { +// await this.connection.announce(this.namespace) +// this.subscribed = true +// } catch (error) { - this.subscribed = false - } +// this.subscribed = false +// } - for (; ;) { - const subscriber = await this.connection.subscribed() +// for (; ;) { +// const subscriber = await this.connection.subscribed() - if (!subscriber) { - this.subscribed = false +// if (!subscriber) { +// this.subscribed = false - break - } +// break +// } - await subscriber.ack() +// await subscriber.ack() - this.subscriber = subscriber +// this.subscriber = subscriber - this.subscribed = true +// this.subscribed = true - const bytes = Catalog.encode(this.catalog); +// const bytes = Catalog.encode(this.catalog); - const stream = await subscriber.group({ group: 0 }); +// const stream = await subscriber.group({ group: 0 }); - await stream.write({ object: 0, payload: bytes }) +// await stream.write({ object: 0, payload: bytes }) - this.stream = stream - } - } +// this.stream = stream +// } +// } - isSubscribed(): boolean { - return this.subscribed; - } +// isSubscribed(): boolean { +// return this.subscribed; +// } - // async #serveSubscribe(subscriber: SubscribeRecv) { - // try { +// // async #serveSubscribe(subscriber: SubscribeRecv) { +// // try { - // // Send a SUBSCRIBE_OK - // await subscriber.ack() +// // // Send a SUBSCRIBE_OK +// // await subscriber.ack() - // console.log("catalog track name:", subscriber.track) +// // console.log("catalog track name:", subscriber.track) - // const stream = await subscriber.group({ group: 0 }); +// // const stream = await subscriber.group({ group: 0 }); - // // const bytes = this.catalog.encode("Hello World") +// // // const bytes = this.catalog.encode("Hello World") - // await stream.write({ object: 0, payload: bytes }) +// // await stream.write({ object: 0, payload: bytes }) - // } catch (e) { - // const err = asError(e) - // await subscriber.close(1n, `failed to process publish: ${err.message}`) - // } finally { - // // TODO we can't close subscribers because there's no support for clean termination - // // await subscriber.close() - // } - // } +// // } catch (e) { +// // const err = asError(e) +// // await subscriber.close(1n, `failed to process publish: ${err.message}`) +// // } finally { +// // // TODO we can't close subscribers because there's no support for clean termination +// // // await subscriber.close() +// // } +// // } - // async mouseUpdatePosition({ x, y }: { x: number, y: number }, stream: GroupWriter) { +// // async mouseUpdatePosition({ x, y }: { x: number, y: number }, stream: GroupWriter) { - // const mouse_move = { - // input_type: "mouse_move", - // delta_y: y, - // delta_x: x, - // } +// // const mouse_move = { +// // input_type: "mouse_move", +// // delta_y: y, +// // delta_x: x, +// // } - // const bytes = Catalog.encode(this.catalog) +// // const bytes = Catalog.encode(this.catalog) - // await stream.write({ object: 0, payload: bytes }); - // } +// // await stream.write({ object: 0, payload: bytes }); +// // } - // async mouseUpdateButtons(e: MouseEvent, stream: GroupWriter) { - // const data: { input_type?: "mouse_key_down" | "mouse_key_up"; button: number; } = { button: e.button }; +// // async mouseUpdateButtons(e: MouseEvent, stream: GroupWriter) { +// // const data: { input_type?: "mouse_key_down" | "mouse_key_up"; button: number; } = { button: e.button }; - // if (e.type === "mousedown") { - // data["input_type"] = "mouse_key_down" - // } else if (e.type === "mouseup") { - // data["input_type"] = "mouse_key_up" - // } +// // if (e.type === "mousedown") { +// // data["input_type"] = "mouse_key_down" +// // } else if (e.type === "mouseup") { +// // data["input_type"] = "mouse_key_up" +// // } - // const bytes = Catalog.encode(this.catalog) +// // const bytes = Catalog.encode(this.catalog) - // await stream.write({ object: 0, payload: bytes }); - // } +// // await stream.write({ object: 0, payload: bytes }); +// // } - // async mouseUpdateWheel(e: WheelEvent, stream: GroupWriter) { - // const data: { input_type?: "mouse_wheel_up" | "mouse_wheel_down" } = {} +// // async mouseUpdateWheel(e: WheelEvent, stream: GroupWriter) { +// // const data: { input_type?: "mouse_wheel_up" | "mouse_wheel_down" } = {} - // if (e.deltaY < 0.0) { - // data["input_type"] = "mouse_wheel_up" - // } else { - // data["input_type"] = "mouse_wheel_down" - // } +// // if (e.deltaY < 0.0) { +// // data["input_type"] = "mouse_wheel_up" +// // } else { +// // data["input_type"] = "mouse_wheel_down" +// // } - // const bytes = Catalog.encode(this.catalog) +// // const bytes = Catalog.encode(this.catalog) - // await stream.write({ object: 0, payload: bytes }); - // } +// // await stream.write({ object: 0, payload: bytes }); +// // } - // async updateKeyUp(e: KeyboardEvent, stream: GroupWriter) { - // const data = { - // input_type: "key_up", - // key_code: e.keyCode - // } +// // async updateKeyUp(e: KeyboardEvent, stream: GroupWriter) { +// // const data = { +// // input_type: "key_up", +// // key_code: e.keyCode +// // } - // const bytes = Catalog.encode(this.catalog) +// // const bytes = Catalog.encode(this.catalog) - // await stream.write({ object: 0, payload: bytes }); - // } +// // await stream.write({ object: 0, payload: bytes }); +// // } - // async updateKeyDown(e: KeyboardEvent, stream: GroupWriter) { - // const data = { - // input_type: "key_down", - // key_code: e.keyCode - // } +// // async updateKeyDown(e: KeyboardEvent, stream: GroupWriter) { +// // const data = { +// // input_type: "key_down", +// // key_code: e.keyCode +// // } - // const bytes = Catalog.encode(this.catalog) +// // const bytes = Catalog.encode(this.catalog) - // await stream.write({ object: 0, payload: bytes }); - // } +// // await stream.write({ object: 0, payload: bytes }); +// // } - close() { - // TODO implement publish close - } +// close() { +// // TODO implement publish close +// } - // Returns the error message when the connection is closed - async closed(): Promise { - try { - await this.#running - return new Error("closed") // clean termination - } catch (e) { - return asError(e) - } - } -} \ No newline at end of file +// // Returns the error message when the connection is closed +// async closed(): Promise { +// try { +// await this.#running +// return new Error("closed") // clean termination +// } catch (e) { +// return asError(e) +// } +// } +// } \ No newline at end of file diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index c86ef9d0..24dac40b 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -2,12 +2,14 @@ import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; import { useLocation } from "@builder.io/qwik-city"; import { WS } from "./websocket" // Upstream MoQ lib does not work well with our Qwik Vite implementation -import { Player } from "@nestri/moq/playback" +import { Player } from "@nestri/libmoq/playback" +import { Client } from "@nestri/libmoq/transfork" export default component$(() => { const id = useLocation().params.id; const canvas = useSignal(); - const url = 'https://relay.fst.so' + //This is the latest MoQ relay... use this for now + const url = 'https://relay.dathorse.com:8443' //'https://relay.fst.so' useVisibleTask$(({ track }) => { track(() => canvas.value); @@ -20,7 +22,11 @@ export default component$(() => { useVisibleTask$( async () => { if (canvas.value) { - await Player.create({ url, fingerprint: undefined, canvas: canvas.value, namespace: id }); + const connectedCanvas = canvas.value + const client = new Client({url}) + client.connect().then((connection)=>{ + new Player({connection, path:[id], canvas:connectedCanvas}) + }) } } ) diff --git a/bun.lockb b/bun.lockb index 2c09a9e98ee378e28fd7952effaead5c2e1fc022..950bcdcba398a10ff53525ba3c8b7caadc05ef09 100755 GIT binary patch delta 92204 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 QPFk@e8!kI&mGk%i0rd6SB>(^b From 69b35ae6b220c388df28dd783b0716fbb9b030a3 Mon Sep 17 00:00:00 2001 From: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Date: Fri, 15 Nov 2024 12:31:22 +0200 Subject: [PATCH 22/43] feat: Separate CLI parameters to files, move few things to functions, WHIP output (#130) I feel things can be improved still, however rather than making perfect CLI parameter handling, gonna PR to help move on. WHIP output option added for starters, we may need to write our own WebRTC element based off examples and API from: https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/tree/main/net/webrtc --------- Co-authored-by: DatCaptainHorse Co-authored-by: Wanjohi <71614375+wanjohiryan@users.noreply.github.com> --- packages/server/src/args.rs | 288 +++++++++++----------- packages/server/src/args/app_args.rs | 47 ++++ packages/server/src/args/device_args.rs | 41 +++ packages/server/src/args/encoding_args.rs | 190 ++++++++++++++ packages/server/src/args/output_args.rs | 66 +++++ packages/server/src/enc_helper.rs | 71 +++++- packages/server/src/main.rs | 244 +++++++++++------- 7 files changed, 712 insertions(+), 235 deletions(-) create mode 100644 packages/server/src/args/app_args.rs create mode 100644 packages/server/src/args/device_args.rs create mode 100644 packages/server/src/args/encoding_args.rs create mode 100644 packages/server/src/args/output_args.rs diff --git a/packages/server/src/args.rs b/packages/server/src/args.rs index cebf2291..b2ba08d2 100644 --- a/packages/server/src/args.rs +++ b/packages/server/src/args.rs @@ -1,38 +1,16 @@ use clap::{Arg, Command}; +pub mod app_args; +pub mod output_args; +pub mod device_args; +pub mod encoding_args; + pub struct Args { - /// Verbose output mode - pub verbose: bool, - /// Debug the feed by showing time and spawning ximagesink on host - pub debug_feed: bool, - /// Relay server URL (e.g. "https://relay.example.com") - pub relay_url: String, - /// Relay path/namespace (e.g. "teststream") - pub relay_path: String, - /// Video/display resolution (e.g. "1920x1080") - pub resolution: (u32, u32), - /// Video framerate (e.g. 60) - pub framerate: u32, - /// GPU vendor (e.g. "intel") - pub gpu_vendor: String, - /// GPU name (e.g. "a770") - pub gpu_name: String, - /// GPU index, if multiple same GPUs are present - pub gpu_index: u32, - /// GPU card/render path, sets card explicitly from such path - pub gpu_card_path: String, - /// Encoder video codec (e.g. "h264") - pub encoder_vcodec: String, - /// Encoder type (e.g. "hardware") - pub encoder_type: String, - /// Encoder name (e.g. "vah264lpenc") - pub encoder_name: String, - /// Encoder CQP quality level (e.g. 25) - pub encoder_cqp: u32, - /// Whether to disable audio output - pub no_audio: bool, + pub app: app_args::AppArgs, + pub output: output_args::OutputOption, + pub device: device_args::DeviceArgs, + pub encoding: encoding_args::EncodingArgs, } - impl Args { pub fn new() -> Self { let matches = Command::new("nestri-server") @@ -49,24 +27,16 @@ impl Args { .short('d') .long("debug-feed") .env("DEBUG_FEED") - .help("Debug by showing time in stream and spawning window on host") + .help("Debug by showing a window on host") .default_value("false"), ) .arg( - Arg::new("relay-url") - .short('u') - .long("relay-url") - .env("RELAY_URL") - .help("Relay server URL") - .default_value("https://relay.dathorse.com:8443"), - ) - .arg( - Arg::new("relay-path") - .short('p') - .long("relay-path") - .env("RELAY_PATH") - .help("Relay namespace/path") - .required(false), + Arg::new("debug-latency") + .short('l') + .long("debug-latency") + .env("DEBUG_LATENCY") + .help("Debug latency by showing time on feed") + .default_value("false"), ) .arg( Arg::new("resolution") @@ -118,121 +88,153 @@ impl Args { .conflicts_with_all(["gpu-vendor", "gpu-name", "gpu-index"]), ) .arg( - Arg::new("encoder-vcodec") + Arg::new("video-codec") .short('c') - .long("encoder-vcodec") - .env("ENCODER_VCODEC") - .help("Preferred encoder video codec (e.g. 'h264')") + .long("video-codec") + .env("VIDEO_CODEC") + .help("Preferred video codec ('h264', 'av1')") .default_value("h264"), ) .arg( - Arg::new("encoder-type") - .short('t') - .long("encoder-type") - .env("ENCODER_TYPE") - .help("Preferred encoder type (e.g. 'hardware')") - .default_value("hardware"), + Arg::new("video-encoder") + .short('e') + .long("video-encoder") + .env("VIDEO_ENCODER") + .help("Override video encoder (e.g. 'vah264enc')") ) .arg( - Arg::new("encoder-name") - .short('e') - .long("encoder-name") - .env("ENCODER_NAME") - .help("Force an encoder to use (e.g. 'vah264lpenc')") - .required(false) - .conflicts_with_all(["encoder-type", "encoder-vcodec"]), + Arg::new("video-rate-control") + .short('t') + .long("video-rate-control") + .env("VIDEO_RATE_CONTROL") + .help("Rate control method ('cqp', 'vbr', 'cbr')") + .default_value("vbr"), ) .arg( - Arg::new("encoder-cqp") + Arg::new("video-cqp") .short('q') - .long("encoder-cqp") - .env("ENCODER_CQP") - .help("Encoder CQP quality level, lower values mean higher quality at cost of higher bitrate") - .default_value("25"), + .long("video-cqp") + .env("VIDEO_CQP") + .help("Constant Quantization Parameter (CQP) quality") + .default_value("26"), ) .arg( - Arg::new("no-audio") + Arg::new("video-bitrate") + .short('b') + .long("video-bitrate") + .env("VIDEO_BITRATE") + .help("Target bitrate in kbps") + .default_value("6000"), + ) + .arg( + Arg::new("video-bitrate-max") .short('x') - .long("no-audio") - .env("NO_AUDIO") - .help("Disable audio output") - .default_value("false"), + .long("video-bitrate-max") + .env("VIDEO_BITRATE_MAX") + .help("Maximum bitrate in kbps") + .default_value("8000"), + ) + .arg( + Arg::new("audio-capture-method") + .short('u') + .long("audio-capture-method") + .env("AUDIO_CAPTURE_METHOD") + .help("Audio capture method ('pipewire', 'pulseaudio', 'alsa')") + .default_value("pulseaudio"), + ) + .arg( + Arg::new("audio-codec") + .short('z') + .long("audio-codec") + .env("AUDIO_CODEC") + .help("Preferred audio codec ('opus', 'aac')") + .default_value("opus"), + ) + .arg( + Arg::new("audio-encoder") + .short('r') + .long("audio-encoder") + .env("AUDIO_ENCODER") + .help("Override audio encoder (e.g. 'opusenc')") + ) + .arg( + Arg::new("audio-rate-control") + .short('k') + .long("audio-rate-control") + .env("AUDIO_RATE_CONTROL") + .help("Rate control method ('cqp', 'vbr', 'cbr')") + .default_value("vbr"), + ) + .arg( + Arg::new("audio-bitrate") + .short('j') + .long("audio-bitrate") + .env("AUDIO_BITRATE") + .help("Target bitrate in kbps") + .default_value("128"), + ) + .arg( + Arg::new("audio-bitrate-max") + .short('n') + .long("audio-bitrate-max") + .env("AUDIO_BITRATE_MAX") + .help("Maximum bitrate in kbps") + .default_value("192"), + ) + .arg( + Arg::new("output") + .short('o') + .long("output") + .env("OUTPUT") + .help("Output type (e.g. 'moq', 'whip')") + .default_value("whip"), + ) + .arg( + Arg::new("moq-relay") + .short('m') + .long("moq-relay") + .env("MOQ_RELAY") + .help("MoQ relay URL") + .default_value("https://relay.dathorse.com:8443"), + ) + .arg( + Arg::new("moq-path") + .short('p') + .long("moq-path") + .env("MOQ_PATH") + .help("MoQ relay path/namespace/broadcast") + .default_value("teststream"), + ) + .arg( + Arg::new("whip-endpoint") + .short('w') + .long("whip-endpoint") + .env("WHIP_ENDPOINT") + .help("WebRTC WHIP endpoint") + .default_value("https://relay.dathorse.com/whip"), + ) + .arg( + Arg::new("whip-auth-token") + .short('y') + .long("whip-auth-token") + .env("WHIP_AUTH_TOKEN") + .help("WebRTC WHIP auth token") + .default_value(""), ) .get_matches(); Self { - verbose: matches.get_one::("verbose").unwrap() == "true" - || matches.get_one::("verbose").unwrap() == "1", - debug_feed: matches.get_one::("debug-feed").unwrap() == "true" - || matches.get_one::("debug-feed").unwrap() == "1", - relay_url: matches.get_one::("relay-url").unwrap().clone(), - // generate a random relay namespace/path starting with "teststream", e.g. "teststream-1234" - relay_path: matches - .get_one::("relay-path") - .unwrap_or(&format!("teststream-{}", rand::random::()).clone()) - .clone(), - resolution: { - let res = matches.get_one::("resolution").unwrap().clone(); - let parts: Vec<&str> = res.split('x').collect(); - ( - parts[0].parse::().unwrap(), - parts[1].parse::().unwrap(), - ) - }, - framerate: matches - .get_one::("framerate") - .unwrap() - .parse::() - .unwrap(), - gpu_vendor: matches - .get_one::("gpu-vendor") - .unwrap_or(&"".to_string()) - .clone(), - gpu_name: matches - .get_one::("gpu-name") - .unwrap_or(&"".to_string()) - .clone(), - gpu_index: matches - .get_one::("gpu-index") - .unwrap() - .parse::() - .unwrap(), - gpu_card_path: matches - .get_one::("gpu-card-path") - .unwrap_or(&"".to_string()) - .clone(), - encoder_vcodec: matches.get_one::("encoder-vcodec").unwrap().clone(), - encoder_type: matches.get_one::("encoder-type").unwrap().clone(), - encoder_name: matches - .get_one::("encoder-name") - .unwrap_or(&"".to_string()) - .clone(), - encoder_cqp: matches - .get_one::("encoder-cqp") - .unwrap() - .parse::() - .unwrap(), - no_audio: matches.get_one::("no-audio").unwrap() == "true" - || matches.get_one::("no-audio").unwrap() == "1", + app: app_args::AppArgs::from_matches(&matches), + output: output_args::OutputOption::from_matches(&matches), + device: device_args::DeviceArgs::from_matches(&matches), + encoding: encoding_args::EncodingArgs::from_matches(&matches), } } - pub fn print(&self) { - println!("Arguments:"); - println!("> Verbose: {}", self.verbose); - println!("> Debug Feed: {}", self.debug_feed); - println!("> Relay URL: {}", self.relay_url); - println!("> Relay Path: {}", self.relay_path); - println!("> Resolution: {}x{}", self.resolution.0, self.resolution.1); - println!("> Framerate: {}", self.framerate); - println!("> GPU Vendor: {}", self.gpu_vendor); - println!("> GPU Name: {}", self.gpu_name); - println!("> GPU Index: {}", self.gpu_index); - println!("> GPU Card Path: {}", self.gpu_card_path); - println!("> Encoder Video Codec: {}", self.encoder_vcodec); - println!("> Encoder Type: {}", self.encoder_type); - println!("> Encoder Name: {}", self.encoder_name); - println!("> Encoder CQP: {}", self.encoder_cqp); - println!("> No Audio: {}", self.no_audio); + pub fn debug_print(&self) { + self.app.debug_print(); + self.output.debug_print(); + self.device.debug_print(); + self.encoding.debug_print(); } } diff --git a/packages/server/src/args/app_args.rs b/packages/server/src/args/app_args.rs new file mode 100644 index 00000000..f7adce4c --- /dev/null +++ b/packages/server/src/args/app_args.rs @@ -0,0 +1,47 @@ +pub struct AppArgs { + /// Verbose output mode + pub verbose: bool, + /// Debug the pipeline by showing a window on host + pub debug_feed: bool, + /// Debug the latency by showing time in stream + pub debug_latency: bool, + + /// Virtual display resolution + pub resolution: (u32, u32), + /// Virtual display framerate + pub framerate: u32, +} +impl AppArgs { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + Self { + verbose: matches.get_one::("verbose").unwrap() == "true" + || matches.get_one::("verbose").unwrap() == "1", + debug_feed: matches.get_one::("debug-feed").unwrap() == "true" + || matches.get_one::("debug-feed").unwrap() == "1", + debug_latency: matches.get_one::("debug-latency").unwrap() == "true" + || matches.get_one::("debug-latency").unwrap() == "1", + resolution: { + let res = matches.get_one::("resolution").unwrap().clone(); + let parts: Vec<&str> = res.split('x').collect(); + ( + parts[0].parse::().unwrap(), + parts[1].parse::().unwrap(), + ) + }, + framerate: matches + .get_one::("framerate") + .unwrap() + .parse::() + .unwrap(), + } + } + + pub fn debug_print(&self) { + println!("AppArgs:"); + println!("> verbose: {}", self.verbose); + println!("> debug_feed: {}", self.debug_feed); + println!("> debug_latency: {}", self.debug_latency); + println!("> resolution: {}x{}", self.resolution.0, self.resolution.1); + println!("> framerate: {}", self.framerate); + } +} diff --git a/packages/server/src/args/device_args.rs b/packages/server/src/args/device_args.rs new file mode 100644 index 00000000..2a55d8ad --- /dev/null +++ b/packages/server/src/args/device_args.rs @@ -0,0 +1,41 @@ +pub struct DeviceArgs { + /// GPU vendor (e.g. "intel") + pub gpu_vendor: String, + /// GPU name (e.g. "a770") + pub gpu_name: String, + /// GPU index, if multiple same GPUs are present + pub gpu_index: u32, + /// GPU card/render path, sets card explicitly from such path + pub gpu_card_path: String, +} +impl DeviceArgs { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + Self { + gpu_vendor: matches + .get_one::("gpu-vendor") + .unwrap_or(&"".to_string()) + .clone(), + gpu_name: matches + .get_one::("gpu-name") + .unwrap_or(&"".to_string()) + .clone(), + gpu_index: matches + .get_one::("gpu-index") + .unwrap() + .parse::() + .unwrap(), + gpu_card_path: matches + .get_one::("gpu-card-path") + .unwrap_or(&"".to_string()) + .clone(), + } + } + + pub fn debug_print(&self) { + println!("DeviceArgs:"); + println!("> gpu_vendor: {}", self.gpu_vendor); + println!("> gpu_name: {}", self.gpu_name); + println!("> gpu_index: {}", self.gpu_index); + println!("> gpu_card_path: {}", self.gpu_card_path); + } +} \ No newline at end of file diff --git a/packages/server/src/args/encoding_args.rs b/packages/server/src/args/encoding_args.rs new file mode 100644 index 00000000..1d86f89d --- /dev/null +++ b/packages/server/src/args/encoding_args.rs @@ -0,0 +1,190 @@ +use std::ops::Deref; + +#[derive(Debug, PartialEq, Eq)] +pub struct RateControlCQP { + /// Constant Quantization Parameter (CQP) quality level + pub quality: u32, +} +#[derive(Debug, PartialEq, Eq)] +pub struct RateControlVBR { + /// Target bitrate in kbps + pub target_bitrate: u32, + /// Maximum bitrate in kbps + pub max_bitrate: u32, +} +#[derive(Debug, PartialEq, Eq)] +pub struct RateControlCBR { + /// Target bitrate in kbps + pub target_bitrate: u32, +} + +#[derive(Debug, PartialEq, Eq)] +pub enum RateControl { + /// Constant Quantization Parameter + CQP(RateControlCQP), + /// Variable Bitrate + VBR(RateControlVBR), + /// Constant Bitrate + CBR(RateControlCBR), +} + +pub struct EncodingOptionsBase { + /// Codec (e.g. "h264", "opus" etc.) + pub codec: String, + /// Overridable encoder (e.g. "vah264lpenc", "opusenc" etc.) + pub encoder: String, + /// Rate control method (e.g. "cqp", "vbr", "cbr") + pub rate_control: RateControl, +} +impl EncodingOptionsBase { + pub fn debug_print(&self) { + println!("> Codec: {}", self.codec); + println!("> Encoder: {}", self.encoder); + match &self.rate_control { + RateControl::CQP(cqp) => { + println!("> Rate Control: CQP"); + println!("-> Quality: {}", cqp.quality); + } + RateControl::VBR(vbr) => { + println!("> Rate Control: VBR"); + println!("-> Target Bitrate: {}", vbr.target_bitrate); + println!("-> Max Bitrate: {}", vbr.max_bitrate); + } + RateControl::CBR(cbr) => { + println!("> Rate Control: CBR"); + println!("-> Target Bitrate: {}", cbr.target_bitrate); + } + } + } +} + +pub struct VideoEncodingOptions { + pub base: EncodingOptionsBase, + /// Encoder type (e.g. "hardware", "software") + pub encoder_type: String, +} +impl VideoEncodingOptions { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + Self { + base: EncodingOptionsBase { + codec: matches.get_one::("video-codec").unwrap().clone(), + encoder: matches + .get_one::("video-encoder") + .unwrap_or(&"".to_string()) + .clone(), + rate_control: match matches.get_one::("video-rate-control").unwrap().as_str() { + "cqp" => RateControl::CQP(RateControlCQP { + quality: matches.get_one::("video-cqp").unwrap().parse::().unwrap(), + }), + "cbr" => RateControl::CBR(RateControlCBR { + target_bitrate: matches.get_one::("video-bitrate").unwrap().parse::().unwrap(), + }), + "vbr" => RateControl::VBR(RateControlVBR { + target_bitrate: matches.get_one::("video-bitrate").unwrap().parse::().unwrap(), + max_bitrate: matches.get_one::("video-bitrate-max").unwrap().parse::().unwrap(), + }), + _ => panic!("Invalid rate control method for video"), + }, + }, + encoder_type: matches.get_one::("video-encoder-type").unwrap_or(&"hardware".to_string()).clone(), + } + } + + pub fn debug_print(&self) { + println!("Video Encoding Options:"); + self.base.debug_print(); + println!("> Encoder Type: {}", self.encoder_type); + } +} +impl Deref for VideoEncodingOptions { + type Target = EncodingOptionsBase; + + fn deref(&self) -> &Self::Target { + &self.base + } +} + +#[derive(Debug, PartialEq, Eq)] +pub enum AudioCaptureMethod { + PulseAudio, + PipeWire, + ALSA, +} +impl AudioCaptureMethod { + pub fn as_str(&self) -> &str { + match self { + AudioCaptureMethod::PulseAudio => "pulseaudio", + AudioCaptureMethod::PipeWire => "pipewire", + AudioCaptureMethod::ALSA => "alsa", + } + } +} + +pub struct AudioEncodingOptions { + pub base: EncodingOptionsBase, + pub capture_method: AudioCaptureMethod, +} +impl AudioEncodingOptions { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + Self { + base: EncodingOptionsBase { + codec: matches.get_one::("audio-codec").unwrap().clone(), + encoder: matches + .get_one::("audio-encoder") + .unwrap_or(&"".to_string()) + .clone(), + rate_control: match matches.get_one::("audio-rate-control").unwrap().as_str() { + "cbr" => RateControl::CBR(RateControlCBR { + target_bitrate: matches.get_one::("audio-bitrate").unwrap().parse::().unwrap(), + }), + "vbr" => RateControl::VBR(RateControlVBR { + target_bitrate: matches.get_one::("audio-bitrate").unwrap().parse::().unwrap(), + max_bitrate: matches.get_one::("audio-bitrate-max").unwrap().parse::().unwrap(), + }), + _ => panic!("Invalid rate control method for audio"), + }, + }, + capture_method: match matches.get_one::("audio-capture-method").unwrap().as_str() { + "pulseaudio" => AudioCaptureMethod::PulseAudio, + "pipewire" => AudioCaptureMethod::PipeWire, + "alsa" => AudioCaptureMethod::ALSA, + // Default to PulseAudio + _ => AudioCaptureMethod::PulseAudio, + }, + } + } + + pub fn debug_print(&self) { + println!("Audio Encoding Options:"); + self.base.debug_print(); + println!("> Capture Method: {}", self.capture_method.as_str()); + } +} +impl Deref for AudioEncodingOptions { + type Target = EncodingOptionsBase; + + fn deref(&self) -> &Self::Target { + &self.base + } +} + +pub struct EncodingArgs { + /// Video encoder options + pub video: VideoEncodingOptions, + /// Audio encoder options + pub audio: AudioEncodingOptions, +} +impl EncodingArgs { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + Self { + video: VideoEncodingOptions::from_matches(matches), + audio: AudioEncodingOptions::from_matches(matches), + } + } + + pub fn debug_print(&self) { + println!("Encoding Arguments:"); + self.video.debug_print(); + self.audio.debug_print(); + } +} diff --git a/packages/server/src/args/output_args.rs b/packages/server/src/args/output_args.rs new file mode 100644 index 00000000..8d57e68b --- /dev/null +++ b/packages/server/src/args/output_args.rs @@ -0,0 +1,66 @@ +pub struct MoQOutputArgs { + /// Relay server URL (e.g. "https://relay.example.com") + pub relay_url: String, + /// Relay path/namespace/broadcast (e.g. "teststream") + pub relay_path: String, +} +impl MoQOutputArgs { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + Self { + relay_url: matches.get_one::("moq-relay").unwrap().clone(), + // generate a random relay namespace/path starting with "teststream", e.g. "teststream-1234" + relay_path: matches + .get_one::("moq-path") + .unwrap_or(&format!("teststream-{}", rand::random::()).clone()) + .clone(), + } + } +} + +pub struct WebRTCWHIPOutputArgs { + /// WHIP endpoint + pub endpoint: String, + /// WHIP auth token + pub auth_token: String, +} +impl WebRTCWHIPOutputArgs { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + Self { + endpoint: matches.get_one::("whip-endpoint").unwrap().clone(), + auth_token: matches.get_one::("whip-auth-token").unwrap().clone(), + } + } +} + +pub enum OutputOption { + /// MoQ (Media over QUIC) output + MoQ(MoQOutputArgs), + /// WebRTC WHIP output + WHIP(WebRTCWHIPOutputArgs), +} +impl OutputOption { + pub fn from_matches(matches: &clap::ArgMatches) -> Self { + match matches.get_one::("output").unwrap().as_str() { + "moq" => OutputOption::MoQ(MoQOutputArgs::from_matches(matches)), + "whip" => OutputOption::WHIP(WebRTCWHIPOutputArgs::from_matches(matches)), + // Default to WHIP + _ => OutputOption::WHIP(WebRTCWHIPOutputArgs::from_matches(matches)), + } + } + + pub fn debug_print(&self) { + println!("OutputArgs:"); + match self { + OutputOption::MoQ(args) => { + println!("> MoQ:"); + println!("-> relay_url: {}", args.relay_url); + println!("-> relay_path: {}", args.relay_path); + } + OutputOption::WHIP(args) => { + println!("> WHIP:"); + println!("-> endpoint: {}", args.endpoint); + println!("-> auth_token: {}", args.auth_token); + } + } + } +} diff --git a/packages/server/src/enc_helper.rs b/packages/server/src/enc_helper.rs index 7ba5c5a3..51bbbb49 100644 --- a/packages/server/src/enc_helper.rs +++ b/packages/server/src/enc_helper.rs @@ -192,6 +192,69 @@ pub fn encoder_cqp_params(encoder: &VideoEncoderInfo, quality: u32) -> VideoEnco encoder_optz } +/// Helper to set VBR values of known encoder +/// # Arguments +/// * `encoder` - Information about the encoder. +/// * `bitrate` - Target bitrate in bits per second. +/// * `max_bitrate` - Maximum bitrate in bits per second. +/// # Returns +/// * `EncoderInfo` - Encoder with maybe updated parameters. +pub fn encoder_vbr_params(encoder: &VideoEncoderInfo, bitrate: u32, max_bitrate: u32) -> VideoEncoderInfo { + let mut encoder_optz = encoder.clone(); + + // Look for known keys by factory creation + let encoder = gst::ElementFactory::make(encoder_optz.name.as_str()) + .build() + .unwrap(); + + // Get properties of the encoder + for prop in encoder.list_properties() { + let prop_name = prop.name(); + + // Look for known keys + if prop_name.to_lowercase().contains("bitrate") + && !prop_name.to_lowercase().contains("max") + { + encoder_optz.set_parameter(prop_name, &bitrate.to_string()); + } else if prop_name.to_lowercase().contains("bitrate") + && prop_name.to_lowercase().contains("max") + { + encoder_optz.set_parameter(prop_name, &max_bitrate.to_string()); + } + } + + encoder_optz +} + +/// Helper to set CBR value of known encoder +/// # Arguments +/// * `encoder` - Information about the encoder. +/// * `bitrate` - Target bitrate in bits per second. +/// # Returns +/// * `EncoderInfo` - Encoder with maybe updated parameters. +pub fn encoder_cbr_params(encoder: &VideoEncoderInfo, bitrate: u32) -> VideoEncoderInfo { + let mut encoder_optz = encoder.clone(); + + // Look for known keys by factory creation + let encoder = gst::ElementFactory::make(encoder_optz.name.as_str()) + .build() + .unwrap(); + + // Get properties of the encoder + for prop in encoder.list_properties() { + let prop_name = prop.name(); + + // Look for known keys + if prop_name.to_lowercase().contains("bitrate") + && !prop_name.to_lowercase().contains("max") + { + encoder_optz.set_parameter(prop_name, &bitrate.to_string()); + } + } + + encoder_optz +} + /// Helper to set GOP size of known encoder /// # Arguments /// * `encoder` - Information about the encoder. @@ -235,11 +298,9 @@ pub fn encoder_low_latency_params(encoder: &VideoEncoderInfo) -> VideoEncoderInf EncoderAPI::QSV => { encoder_optz.set_parameter("low-latency", "true"); encoder_optz.set_parameter("target-usage", "7"); - encoder_optz.set_parameter("rate-control", "cqp"); } EncoderAPI::VAAPI => { encoder_optz.set_parameter("target-usage", "7"); - encoder_optz.set_parameter("rate-control", "cqp"); } EncoderAPI::NVENC => { match encoder_optz.codec { @@ -248,19 +309,16 @@ pub fn encoder_low_latency_params(encoder: &VideoEncoderInfo) -> VideoEncoderInf encoder_optz.set_parameter("multi-pass", "disabled"); encoder_optz.set_parameter("preset", "p1"); encoder_optz.set_parameter("tune", "ultra-low-latency"); - encoder_optz.set_parameter("rc-mode", "constqp"); } // nvav1enc only supports older presets VideoCodec::AV1 => { encoder_optz.set_parameter("preset", "low-latency-hp"); - encoder_optz.set_parameter("rc-mode", "constqp"); } _ => {} } } EncoderAPI::AMF => { encoder_optz.set_parameter("preset", "speed"); - encoder_optz.set_parameter("rate-control", "cqp"); match encoder_optz.codec { // Only H.264 supports "ultra-low-latency" usage VideoCodec::H264 => { @@ -278,13 +336,11 @@ pub fn encoder_low_latency_params(encoder: &VideoEncoderInfo) -> VideoEncoderInf "openh264enc" => { encoder_optz.set_parameter("complexity", "low"); encoder_optz.set_parameter("usage-type", "screen"); - encoder_optz.set_parameter("rate-control", "quality"); } "x264enc" => { encoder_optz.set_parameter("rc-lookahead", "0"); encoder_optz.set_parameter("speed-preset", "ultrafast"); encoder_optz.set_parameter("tune", "zerolatency"); - encoder_optz.set_parameter("pass", "quant"); } "svtav1enc" => { encoder_optz.set_parameter("preset", "12"); @@ -293,7 +349,6 @@ pub fn encoder_low_latency_params(encoder: &VideoEncoderInfo) -> VideoEncoderInf "av1enc" => { encoder_optz.set_parameter("usage-profile", "realtime"); encoder_optz.set_parameter("cpu-used", "10"); - encoder_optz.set_parameter("end-usage", "q"); encoder_optz.set_parameter("lag-in-frames", "0"); } _ => {} diff --git a/packages/server/src/main.rs b/packages/server/src/main.rs index 944a2b11..a1cf4e73 100644 --- a/packages/server/src/main.rs +++ b/packages/server/src/main.rs @@ -9,6 +9,7 @@ use url::Url; use gst::prelude::*; use serde::{Deserialize, Serialize}; use std::time::{Duration, Instant}; +use crate::args::{encoding_args, output_args}; #[derive(Serialize, Deserialize, Debug)] #[serde(tag = "type")] @@ -32,21 +33,13 @@ enum InputMessage { KeyUp { key: i32 }, } -#[tokio::main] -async fn main() -> std::io::Result<()> { - let args = args::Args::new(); - if args.verbose { - args.print(); - } - - let _ = gst::init(); - let _ = gstmoq::plugin_register_static(); - +// Handles gathering GPU information and selecting the most suitable GPU +fn handle_gpus(args: &args::Args) -> Option { println!("Gathering GPU information.."); let gpus = gpu::get_gpus(); if gpus.is_empty() { - println!("No GPUs found. Exiting.."); - return Ok(()); + println!("No GPUs found"); + return None; } for gpu in &gpus { println!( @@ -60,131 +53,214 @@ async fn main() -> std::io::Result<()> { // Based on available arguments, pick a GPU let mut gpu = gpus.get(0).cloned(); - if !args.gpu_card_path.is_empty() { - gpu = gpu::get_gpu_by_card_path(&gpus, &args.gpu_card_path); + if !args.device.gpu_card_path.is_empty() { + gpu = gpu::get_gpu_by_card_path(&gpus, &args.device.gpu_card_path); } else { // Run all filters that are not empty let mut filtered_gpus = gpus.clone(); - if !args.gpu_vendor.is_empty() { - filtered_gpus = gpu::get_gpus_by_vendor(&filtered_gpus, &args.gpu_vendor); + if !args.device.gpu_vendor.is_empty() { + filtered_gpus = gpu::get_gpus_by_vendor(&filtered_gpus, &args.device.gpu_vendor); } - if !args.gpu_name.is_empty() { - filtered_gpus = gpu::get_gpus_by_device_name(&filtered_gpus, &args.gpu_name); + if !args.device.gpu_name.is_empty() { + filtered_gpus = gpu::get_gpus_by_device_name(&filtered_gpus, &args.device.gpu_name); } - if args.gpu_index != 0 { + if args.device.gpu_index != 0 { // get single GPU by index - gpu = filtered_gpus.get(args.gpu_index as usize).cloned(); + gpu = filtered_gpus.get(args.device.gpu_index as usize).cloned(); } else { // get first GPU gpu = filtered_gpus.get(0).cloned(); } } if gpu.is_none() { - println!("No GPU found with the specified parameters: vendor='{}', name='{}', index='{}', card_path='{}'. Exiting..", - args.gpu_vendor, args.gpu_name, args.gpu_index, args.gpu_card_path); - return Ok(()); + println!("No GPU found with the specified parameters: vendor='{}', name='{}', index='{}', card_path='{}'", + args.device.gpu_vendor, args.device.gpu_name, args.device.gpu_index, args.device.gpu_card_path); + return None; } let gpu = gpu.unwrap(); println!("Selected GPU: '{}'", gpu.device_name()); + Some(gpu) +} - println!("Getting compatible encoders.."); - let encoders = enc_helper::get_compatible_encoders(); - if encoders.is_empty() { - println!("No compatible encoders found. Exiting.."); - return Ok(()); +// Handles picking video encoder +fn handle_encoder_video(args: &args::Args) -> Option { + println!("Getting compatible video encoders.."); + let video_encoders = enc_helper::get_compatible_encoders(); + if video_encoders.is_empty() { + println!("No compatible video encoders found"); + return None; } - for encoder in &encoders { + for encoder in &video_encoders { println!( - "> [Encoder] Name: '{}', Codec: '{}', API: '{}', Type: '{}'", + "> [Video Encoder] Name: '{}', Codec: '{}', API: '{}', Type: '{}'", encoder.name, encoder.codec.to_str(), encoder.encoder_api.to_str(), encoder.encoder_type.to_str() ); } - // Pick most suitable encoder based on given arguments - let mut encoder = encoders.get(0).cloned(); - if !args.encoder_name.is_empty() { - encoder = enc_helper::get_encoder_by_name(&encoders, &args.encoder_name); + // Pick most suitable video encoder based on given arguments + let mut video_encoder = video_encoders.get(0).cloned(); + if !args.encoding.video.encoder.is_empty() { + video_encoder = enc_helper::get_encoder_by_name(&video_encoders, &args.encoding.video.encoder); } else { - encoder = enc_helper::get_best_compatible_encoder( - &encoders, - enc_helper::VideoCodec::from_str(&args.encoder_vcodec), - enc_helper::EncoderType::from_str(&args.encoder_type), + video_encoder = enc_helper::get_best_compatible_encoder( + &video_encoders, + enc_helper::VideoCodec::from_str(&args.encoding.video.codec), + enc_helper::EncoderType::from_str(&args.encoding.video.encoder_type), ); } - if encoder.is_none() { - println!("No encoder found with the specified parameters: name='{}', vcodec='{}', type='{}'. Exiting..", - args.encoder_name, args.encoder_vcodec, args.encoder_type); - return Ok(()); + if video_encoder.is_none() { + println!("No video encoder found with the specified parameters: name='{}', vcodec='{}', type='{}'", + args.encoding.video.encoder, args.encoding.video.codec, args.encoding.video.encoder_type); + return None; } - let encoder = encoder.unwrap(); - println!("Selected encoder: '{}'", encoder.name); + let video_encoder = video_encoder.unwrap(); + println!("Selected video encoder: '{}'", video_encoder.name); + Some(video_encoder) +} - println!( - "Optimizing encoder parameters with CQP of: {}..", - args.encoder_cqp - ); - let mut optimized_encoder = enc_helper::encoder_cqp_params(&encoder, args.encoder_cqp); - println!("Optimizing encoder parameters for low latency.."); - optimized_encoder = enc_helper::encoder_low_latency_params(&optimized_encoder); - println!( - "Optimized encoder parameters: '{}'", - optimized_encoder.get_parameters_string() - ); +// Handles picking preferred settings for video encoder +fn handle_encoder_video_settings(args: &args::Args, video_encoder: &enc_helper::VideoEncoderInfo) -> enc_helper::VideoEncoderInfo { + let mut optimized_encoder = enc_helper::encoder_low_latency_params(&video_encoder); + // Handle rate-control method + match &args.encoding.video.rate_control { + encoding_args::RateControl::CQP(cqp) => { + optimized_encoder = enc_helper::encoder_cqp_params(&video_encoder, cqp.quality); + } + encoding_args::RateControl::VBR(vbr) => { + optimized_encoder = enc_helper::encoder_vbr_params(&video_encoder, vbr.target_bitrate, vbr.max_bitrate); + } + encoding_args::RateControl::CBR(cbr) => { + optimized_encoder = enc_helper::encoder_cbr_params(&video_encoder, cbr.target_bitrate); + } + } + println!("Selected video encoder settings: '{}'", optimized_encoder.get_parameters_string()); + optimized_encoder +} + +// Handles picking audio encoder +// TODO: Expand enc_helper with audio types, for now just AAC or opus +fn handle_encoder_audio(args: &args::Args, output_option: &output_args::OutputOption) -> String { + let audio_encoder = if args.encoding.audio.encoder.is_empty() { + if let output_args::OutputOption::MoQ(_) = output_option { + "faac".to_string() + } else { + "opusenc".to_string() + } + } else { + args.encoding.audio.encoder.clone() + }; + println!("Selected audio encoder: '{}'", audio_encoder); + audio_encoder +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + let args = args::Args::new(); + if args.app.verbose { + args.debug_print(); + } + + let _ = gst::init(); + let _ = gstmoq::plugin_register_static(); + + // Handle GPU selection + let gpu = handle_gpus(&args); + if gpu.is_none() { + println!("Failed to find a suitable GPU. Exiting.."); + return Ok(()); + } + let gpu = gpu.unwrap(); - // Notify of relay path used - println!("Starting stream with relay path: '{}'", args.relay_path); + // Handle video encoder selection + let video_encoder = handle_encoder_video(&args); + if video_encoder.is_none() { + println!("Failed to find a suitable video encoder. Exiting.."); + return Ok(()); + } + let mut video_encoder = video_encoder.unwrap(); + // Handle video encoder settings + video_encoder = handle_encoder_video_settings(&args, &video_encoder); + + // Handle audio encoder selection + let audio_encoder = handle_encoder_audio(&args, &args.output); + + + // Get output option + let mut output_pipeline: String = "".to_string(); + if let output_args::OutputOption::MoQ(args) = &args.output { + output_pipeline = format!( + " + ! isofmp4mux chunk-duration=1 fragment-duration=1 name=pipend \ + ! moqsink url={} broadcast={} + ", + args.relay_url, args.relay_path + ); + } else if let output_args::OutputOption::WHIP(args) = &args.output { + output_pipeline = format!( + " + ! whipclientsink name=pipend signaller::whip-endpoint=\"{}\" signaller::auth-token=\"{}\" congestion-control=disabled + ", + args.endpoint, args.auth_token + ); + } - // Debug-feed string + // Debug-latency let mut debug_feed = ""; - if args.debug_feed { - debug_feed = "! timeoverlay halignment=right valignment=bottom ! tee name=dfee" + if args.app.debug_latency { + debug_feed = "! timeoverlay halignment=right valignment=bottom" } // Additional sink for debugging let mut debug_sink = ""; - if args.debug_feed { + if args.app.debug_feed { debug_sink = "dfee. ! queue2 max-size-time=1000000 ! videoconvert ! ximagesink" } // Audio sub-pipeline - let audio_pipeline = " - pipewiresrc \ + let audio_pipeline = format!(" + {} ! queue2 max-size-time=1000000 ! audioconvert \ - ! faac bitrate=196000 \ - ! aacparse ! mux."; + ! {} bitrate={}000 \ + ! pipend.", + if args.encoding.audio.capture_method == encoding_args::AudioCaptureMethod::PulseAudio { + "pulsesrc" + } else if args.encoding.audio.capture_method == encoding_args::AudioCaptureMethod::PipeWire { + "pipewiresrc" + } else { + "alsasrc" + }, + audio_encoder, + match &args.encoding.audio.rate_control { + encoding_args::RateControl::CBR(cbr) => cbr.target_bitrate, + encoding_args::RateControl::VBR(vbr) => vbr.target_bitrate, + _ => 128, + } + ).to_string(); // Construct the pipeline string let pipeline_str = format!( " waylanddisplaysrc render-node={} \ ! video/x-raw,width={},height={},framerate={}/1,format=RGBx \ - {debug_feed} \ + {debug_feed} ! tee name=dfee \ ! queue2 max-size-time=1000000 ! videoconvert \ ! {} {} \ - ! {} \ - ! isofmp4mux chunk-duration=1 fragment-duration=1 name=mux \ - ! moqsink url={} broadcast={} \ - {} \ + {output_pipeline} \ + {audio_pipeline} \ {debug_sink} ", gpu.render_path(), - args.resolution.0, - args.resolution.1, - args.framerate, - optimized_encoder.name, - optimized_encoder.get_parameters_string(), - (optimized_encoder.codec == enc_helper::VideoCodec::AV1) - .then(|| "av1parse") - .unwrap_or("h264parse"), - args.relay_url, - args.relay_path, - args.no_audio.then(|| "").unwrap_or(audio_pipeline), + args.app.resolution.0, + args.app.resolution.1, + args.app.framerate, + video_encoder.name, + video_encoder.get_parameters_string(), ); // If verbose, print out the pipeline string - if args.verbose { + if args.app.verbose { println!("Constructed pipeline string: {}", pipeline_str); } @@ -265,10 +341,10 @@ async fn main() -> std::io::Result<()> { } } - + if let Some(mut socket) = socket { socket.send(Message::Text("Hello There".into())).unwrap(); - + let pipeline = pipeline_clone.lock().unwrap(); let reason = loop { From a975b894f10aa7df92b745afd1ffb342259ddbc0 Mon Sep 17 00:00:00 2001 From: Wanjohi Ryan Date: Sun, 17 Nov 2024 10:17:33 +0300 Subject: [PATCH 23/43] chore: Some modular changes --- Containerfile => Containerfile.master | 2 +- Containerfile.cachyos => Containerfile.runner | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) rename Containerfile => Containerfile.master (99%) rename Containerfile.cachyos => Containerfile.runner (99%) diff --git a/Containerfile b/Containerfile.master similarity index 99% rename from Containerfile rename to Containerfile.master index c03d0b03..0031b681 100644 --- a/Containerfile +++ b/Containerfile.master @@ -1,4 +1,4 @@ - +#This image is used to start and stop the other containers #****************************************************************************** # base #****************************************************************************** diff --git a/Containerfile.cachyos b/Containerfile.runner similarity index 99% rename from Containerfile.cachyos rename to Containerfile.runner index 4fac5a3b..0b48e536 100644 --- a/Containerfile.cachyos +++ b/Containerfile.runner @@ -1,3 +1,4 @@ +#! This image is used to run the games # Container build arguments # ARG BASE_IMAGE=docker.io/cachyos/cachyos-v3:latest From e21ac8347c400a9f153ad461cdd25f774ea52dad Mon Sep 17 00:00:00 2001 From: Wanjohi Ryan Date: Sun, 17 Nov 2024 10:22:01 +0300 Subject: [PATCH 24/43] Revert "chore: Some modular changes" This reverts commit a975b894f10aa7df92b745afd1ffb342259ddbc0. --- Containerfile.master => Containerfile | 2 +- Containerfile.runner => Containerfile.cachyos | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) rename Containerfile.master => Containerfile (99%) rename Containerfile.runner => Containerfile.cachyos (99%) diff --git a/Containerfile.master b/Containerfile similarity index 99% rename from Containerfile.master rename to Containerfile index 0031b681..c03d0b03 100644 --- a/Containerfile.master +++ b/Containerfile @@ -1,4 +1,4 @@ -#This image is used to start and stop the other containers + #****************************************************************************** # base #****************************************************************************** diff --git a/Containerfile.runner b/Containerfile.cachyos similarity index 99% rename from Containerfile.runner rename to Containerfile.cachyos index 0b48e536..4fac5a3b 100644 --- a/Containerfile.runner +++ b/Containerfile.cachyos @@ -1,4 +1,3 @@ -#! This image is used to run the games # Container build arguments # ARG BASE_IMAGE=docker.io/cachyos/cachyos-v3:latest From 874e47de421fe1901e2b306eb65e47a4ebfefdbb Mon Sep 17 00:00:00 2001 From: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Date: Sun, 17 Nov 2024 09:23:14 +0200 Subject: [PATCH 25/43] =?UTF-8?q?=E2=9C=A8feat:=20WebRTC=20streaming=20sup?= =?UTF-8?q?port=20and=20improvements=20(#131)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds WebRTC WHIP/WHEP relay, frontend code changes and container file changes. --------- Co-authored-by: DatCaptainHorse Co-authored-by: Wanjohi <71614375+wanjohiryan@users.noreply.github.com> --- Cargo.lock | 122 +++++++- Containerfile.cachyos | 4 +- apps/www/src/routes/play/[id]/index.tsx | 128 ++++++++- packages/input/src/mouse.ts | 26 +- packages/input/src/types.ts | 7 + packages/server/Cargo.toml | 2 +- packages/server/src/args.rs | 20 ++ packages/server/src/args/app_args.rs | 15 + packages/server/src/args/output_args.rs | 8 - packages/server/src/main.rs | 276 ++++++++++-------- packages/webrtc-relay/Containerfile | 20 ++ packages/webrtc-relay/go.mod | 27 ++ packages/webrtc-relay/go.sum | 56 ++++ packages/webrtc-relay/internal/common.go | 119 ++++++++ packages/webrtc-relay/internal/flags.go | 78 ++++++ packages/webrtc-relay/internal/http.go | 340 +++++++++++++++++++++++ packages/webrtc-relay/main.go | 32 +++ 17 files changed, 1127 insertions(+), 153 deletions(-) create mode 100644 packages/webrtc-relay/Containerfile create mode 100644 packages/webrtc-relay/go.mod create mode 100644 packages/webrtc-relay/go.sum create mode 100644 packages/webrtc-relay/internal/common.go create mode 100644 packages/webrtc-relay/internal/flags.go create mode 100644 packages/webrtc-relay/internal/http.go create mode 100644 packages/webrtc-relay/main.go diff --git a/Cargo.lock b/Cargo.lock index 268291a2..87cfead0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -835,6 +835,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "fastrand" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" + [[package]] name = "flate2" version = "1.0.34" @@ -851,6 +857,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1834,6 +1855,23 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nestri-server" version = "0.1.0" @@ -1849,9 +1887,9 @@ dependencies = [ "serde", "serde_json", "tokio", + "tokio-tungstenite", "tracing", "tracing-subscriber", - "tungstenite", "url", ] @@ -1969,12 +2007,50 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "openssl" +version = "0.10.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-operations" version = "0.5.0" @@ -2653,6 +2729,19 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "tempfile" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -2777,6 +2866,30 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite", +] + [[package]] name = "tokio-util" version = "0.7.12" @@ -2898,6 +3011,7 @@ dependencies = [ "http 1.1.0", "httparse", "log", + "native-tls", "rand", "sha1", "thiserror", @@ -2969,6 +3083,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.0" diff --git a/Containerfile.cachyos b/Containerfile.cachyos index 4fac5a3b..42dcb8d4 100644 --- a/Containerfile.cachyos +++ b/Containerfile.cachyos @@ -9,7 +9,7 @@ WORKDIR /builder/ # Grab build and rust packages # RUN pacman -Syu --noconfirm meson pkgconf cmake git gcc make rustup \ - gstreamer gst-plugins-base gst-plugins-good + gstreamer gst-plugins-base gst-plugins-good gst-plugin-rswebrtc # Setup stable rust toolchain # RUN rustup default stable @@ -75,7 +75,7 @@ RUN pacman -Syu --noconfirm libva-utils # Grab gstreamer packages # RUN pacman -Syu --noconfirm gstreamer gst-plugins-base gst-plugins-good \ - gst-plugin-va gst-plugins-bad gst-plugin-fmp4 gst-plugin-qsv gst-plugin-pipewire + gst-plugin-va gst-plugins-bad gst-plugin-fmp4 gst-plugin-qsv gst-plugin-pipewire gst-plugin-rswebrtc ## Audio ## # Grab audio packages # diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index b140d929..29d78052 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -3,6 +3,64 @@ import { useLocation } from "@builder.io/qwik-city"; import PartySocket from "partysocket"; import {Keyboard, Mouse} from "@nestri/input" +class WebRTCStream { + private readonly _url: string; + private _pc: RTCPeerConnection; + private _mediaStream: MediaStream | undefined = undefined; + + constructor(serverURL: string) { + this._url = serverURL; + + console.log("Setting up PeerConnection"); + this._pc = new RTCPeerConnection({ + iceServers: [ + { + urls: "stun:stun.l.google.com:19302" + } + ], + }); + + // Allow us to receive single audio and video tracks + this._pc.addTransceiver("audio", { direction: "recvonly" }); + this._pc.addTransceiver("video", { direction: "recvonly" }); + + this._pc.ontrack = (e) => { + console.log("Track received: ", e.track); + // Update our mediastream as we receive tracks + this._mediaStream = e.streams[e.streams.length - 1]; + }; + } + + // Forces opus to stereo in Chromium browsers, because of course + private forceOpusStereo(SDP: string): string { + // Look for "minptime=10;useinbandfec=1" and replace with "minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;" + return SDP.replace(/(minptime=10;useinbandfec=1)/, "$1;stereo=1;sprop-stereo=1;"); + } + + public async connect(streamName: string) { + const offer = await this._pc.createOffer(); + offer.sdp = this.forceOpusStereo(offer.sdp!); + await this._pc.setLocalDescription(offer); + + const response = await fetch(`${this._url}/api/whep/${streamName}`, { + method: "POST", + body: offer.sdp, + headers: { + 'Content-Type': "application/sdp" + } + }); + + const answer = await response.text(); + await this._pc.setRemoteDescription({ + sdp: answer, + type: "answer", + }); + } + + public getMediaStream() { + return this._mediaStream; + } +} export default component$(() => { const id = useLocation().params.id; @@ -12,23 +70,67 @@ export default component$(() => { track(() => canvas.value); const ws = new PartySocket({ - host: "ws://localhost:1999", // or localhost:1999 in dev + host: "https://nestri-party.datcaptainhorse.partykit.dev", // or localhost:1999 in dev room: id, - }) - + }); + if (!canvas.value) return; // Ensure canvas is available - - document.addEventListener("pointerlockchange",()=>{ + + document.addEventListener("pointerlockchange", (e) => { if (!canvas.value) return; // Ensure canvas is available - if (document.pointerLockElement){ - new Mouse({canvas: canvas.value, ws}) - new Keyboard({canvas: canvas.value, ws}) - } - }) - + // @ts-ignore + if (document.pointerLockElement && !window.nestrimouse && !window.nestrikeyboard) { + // @ts-ignore + window.nestrimouse = new Mouse({canvas: canvas.value, ws}, false); //< TODO: Make absolute mode toggleable, for now feels better? + // @ts-ignore + window.nestrikeyboard = new Keyboard({canvas: canvas.value, ws}); + // @ts-ignore + } else if (!document.pointerLockElement && window.nestrimouse && window.nestrikeyboard) { + // @ts-ignore + window.nestrimouse.dispose(); + // @ts-ignore + window.nestrimouse = undefined; + // @ts-ignore + window.nestrikeyboard.dispose(); + // @ts-ignore + window.nestrikeyboard = undefined; + } + }); + ws.onmessage = (msg) => { console.log(msg.data) - } + } + + // Create video element and make it output to canvas (TODO: improve this) + let video = document.getElementById("webrtc-video-player"); + if (!video) { + video = document.createElement("video"); + video.id = "stream-video-player"; + video.style.visibility = "hidden"; + const webrtc = new WebRTCStream("https://relay.dathorse.com"); // or http://localhost:8088 + webrtc.connect(id).then(() => { + const mediaStream = webrtc.getMediaStream(); + console.log("Setting mediastream"); + if (video && mediaStream) { + (video as HTMLVideoElement).srcObject = mediaStream; + (video as HTMLVideoElement).play().then(() => { + if (canvas.value) { + canvas.value.width = (video as HTMLVideoElement).videoWidth; + canvas.value.height = (video as HTMLVideoElement).videoHeight; + + const ctx = canvas.value.getContext("2d"); + const renderer = () => { + if (ctx) { + ctx.drawImage((video as HTMLVideoElement), 0, 0); + requestAnimationFrame(renderer); + } + } + requestAnimationFrame(renderer); + } + }); + } + }); + } }) return ( @@ -41,7 +143,7 @@ export default component$(() => { canvas.value.requestPointerLock(); } }} - class="aspect-video h-screen rounded-sm" /> + class="aspect-video w-full h-auto rounded-sm" /> ) }) diff --git a/packages/input/src/mouse.ts b/packages/input/src/mouse.ts index eadc3b72..08fc2e27 100644 --- a/packages/input/src/mouse.ts +++ b/packages/input/src/mouse.ts @@ -11,20 +11,34 @@ export class Mouse { protected canvas: HTMLCanvasElement; protected connected!: boolean; + private absX: number = 0; + private absY: number = 0; + // Store references to event listeners private mousemoveListener: (e: MouseEvent) => void; private mousedownListener: (e: MouseEvent) => void; private mouseupListener: (e: MouseEvent) => void; private mousewheelListener: (e: WheelEvent) => void; - constructor({ ws, canvas }: Props) { + constructor({ ws, canvas }: Props, absoluteTrick?: boolean) { this.websocket = ws; this.canvas = canvas; - this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ - type: "MouseMove", - x: e.movementX, - y: e.movementY - })); + if (!absoluteTrick) { + this.mousemoveListener = this.createMouseListener("mousemove", (e: any) => ({ + type: "MouseMove", + x: e.movementX, + y: e.movementY + })); + } else { + this.mousemoveListener = this.createMouseListener("mousemoveabs", (e: any) => ({ + type: "MouseMoveAbs", + x: this.absX = this.absX + e.movementX, + y: this.absY = this.absY + e.movementY + })); + + this.absX = this.canvas.width / 2; + this.absY = this.canvas.height / 2; + } this.mousedownListener = this.createMouseListener("mousedown", (e: any) => ({ type: "MouseKeyDown", diff --git a/packages/input/src/types.ts b/packages/input/src/types.ts index 242f2038..b733b499 100644 --- a/packages/input/src/types.ts +++ b/packages/input/src/types.ts @@ -8,6 +8,12 @@ interface MouseMove extends BaseInput { y: number; } +interface MouseMoveAbs extends BaseInput { + type: "MouseMoveAbs"; + x: number; + y: number; +} + interface MouseWheel extends BaseInput { type: "MouseWheel"; x: number; @@ -37,6 +43,7 @@ interface KeyUp extends BaseInput { export type Input = | MouseMove + | MouseMoveAbs | MouseWheel | MouseKeyDown | MouseKeyUp diff --git a/packages/server/Cargo.toml b/packages/server/Cargo.toml index 47840a09..49a6d7fd 100644 --- a/packages/server/Cargo.toml +++ b/packages/server/Cargo.toml @@ -22,4 +22,4 @@ regex = "1.11.1" clap = { version = "4.5.20", features = ["env"] } rand = "0.8.5" url = "2.5.3" -tungstenite = "0.24.0" +tokio-tungstenite = { version = "0.24.0", features = ["native-tls"] } diff --git a/packages/server/src/args.rs b/packages/server/src/args.rs index b2ba08d2..a2a7f462 100644 --- a/packages/server/src/args.rs +++ b/packages/server/src/args.rs @@ -54,6 +54,19 @@ impl Args { .help("Display/stream framerate") .default_value("60"), ) + .arg( + Arg::new("input-server") + .long("input-server") + .env("INPUT_SERVER") + .help("Input server address") + .default_value("ws://localhost:1999"), + ) + .arg( + Arg::new("room") + .long("room") + .env("NESTRI_ROOM") + .help("Nestri room name/identifier") + ) .arg( Arg::new("gpu-vendor") .short('g') @@ -134,6 +147,13 @@ impl Args { .help("Maximum bitrate in kbps") .default_value("8000"), ) + .arg( + Arg::new("video-encoder-type") + .long("video-encoder-type") + .env("VIDEO_ENCODER_TYPE") + .help("Encoder type ('hardware', 'software')") + .default_value("hardware"), + ) .arg( Arg::new("audio-capture-method") .short('u') diff --git a/packages/server/src/args/app_args.rs b/packages/server/src/args/app_args.rs index f7adce4c..eb371686 100644 --- a/packages/server/src/args/app_args.rs +++ b/packages/server/src/args/app_args.rs @@ -10,6 +10,11 @@ pub struct AppArgs { pub resolution: (u32, u32), /// Virtual display framerate pub framerate: u32, + + /// Input server address + pub input_server: String, + /// Nestri room name/identifier + pub room: String, } impl AppArgs { pub fn from_matches(matches: &clap::ArgMatches) -> Self { @@ -33,6 +38,14 @@ impl AppArgs { .unwrap() .parse::() .unwrap(), + input_server: matches + .get_one::("input-server") + .unwrap_or(&"".to_string()) + .clone(), + // Generate random room name if not provided + room: matches.get_one::("room") + .unwrap_or(&rand::random::().to_string()) + .clone(), } } @@ -43,5 +56,7 @@ impl AppArgs { println!("> debug_latency: {}", self.debug_latency); println!("> resolution: {}x{}", self.resolution.0, self.resolution.1); println!("> framerate: {}", self.framerate); + println!("> input server: {}", self.input_server); + println!("> room: {}", self.room); } } diff --git a/packages/server/src/args/output_args.rs b/packages/server/src/args/output_args.rs index 8d57e68b..85c2a424 100644 --- a/packages/server/src/args/output_args.rs +++ b/packages/server/src/args/output_args.rs @@ -1,18 +1,11 @@ pub struct MoQOutputArgs { /// Relay server URL (e.g. "https://relay.example.com") pub relay_url: String, - /// Relay path/namespace/broadcast (e.g. "teststream") - pub relay_path: String, } impl MoQOutputArgs { pub fn from_matches(matches: &clap::ArgMatches) -> Self { Self { relay_url: matches.get_one::("moq-relay").unwrap().clone(), - // generate a random relay namespace/path starting with "teststream", e.g. "teststream-1234" - relay_path: matches - .get_one::("moq-path") - .unwrap_or(&format!("teststream-{}", rand::random::()).clone()) - .clone(), } } } @@ -54,7 +47,6 @@ impl OutputOption { OutputOption::MoQ(args) => { println!("> MoQ:"); println!("-> relay_url: {}", args.relay_url); - println!("-> relay_path: {}", args.relay_path); } OutputOption::WHIP(args) => { println!("> WHIP:"); diff --git a/packages/server/src/main.rs b/packages/server/src/main.rs index a1cf4e73..09dbcb06 100644 --- a/packages/server/src/main.rs +++ b/packages/server/src/main.rs @@ -2,13 +2,17 @@ mod args; mod enc_helper; mod gpu; -use std::sync::{Arc, Mutex}; -use tungstenite::{connect, Message}; +use std::collections::HashSet; +use std::sync::{Arc}; +use tokio_tungstenite::{connect_async, tungstenite::protocol::Message}; use url::Url; use gst::prelude::*; use serde::{Deserialize, Serialize}; use std::time::{Duration, Instant}; +use futures_util::{SinkExt, StreamExt}; +use serde_json::from_str; +use tokio::sync::mpsc; use crate::args::{encoding_args, output_args}; #[derive(Serialize, Deserialize, Debug)] @@ -17,6 +21,9 @@ enum InputMessage { #[serde(rename = "mousemove")] MouseMove { x: i32, y: i32 }, + #[serde(rename = "mousemoveabs")] + MouseMoveAbs { x: i32, y: i32 }, + #[serde(rename = "wheel")] Wheel { x: f64, y: f64 }, @@ -126,13 +133,13 @@ fn handle_encoder_video_settings(args: &args::Args, video_encoder: &enc_helper:: // Handle rate-control method match &args.encoding.video.rate_control { encoding_args::RateControl::CQP(cqp) => { - optimized_encoder = enc_helper::encoder_cqp_params(&video_encoder, cqp.quality); + optimized_encoder = enc_helper::encoder_cqp_params(&optimized_encoder, cqp.quality); } encoding_args::RateControl::VBR(vbr) => { - optimized_encoder = enc_helper::encoder_vbr_params(&video_encoder, vbr.target_bitrate, vbr.max_bitrate); + optimized_encoder = enc_helper::encoder_vbr_params(&optimized_encoder, vbr.target_bitrate, vbr.max_bitrate); } encoding_args::RateControl::CBR(cbr) => { - optimized_encoder = enc_helper::encoder_cbr_params(&video_encoder, cbr.target_bitrate); + optimized_encoder = enc_helper::encoder_cbr_params(&optimized_encoder, cbr.target_bitrate); } } println!("Selected video encoder settings: '{}'", optimized_encoder.get_parameters_string()); @@ -155,7 +162,7 @@ fn handle_encoder_audio(args: &args::Args, output_option: &output_args::OutputOp audio_encoder } -#[actix_web::main] +#[tokio::main] async fn main() -> std::io::Result<()> { let args = args::Args::new(); if args.app.verbose { @@ -189,20 +196,20 @@ async fn main() -> std::io::Result<()> { // Get output option let mut output_pipeline: String = "".to_string(); - if let output_args::OutputOption::MoQ(args) = &args.output { + if let output_args::OutputOption::MoQ(moqargs) = &args.output { output_pipeline = format!( " ! isofmp4mux chunk-duration=1 fragment-duration=1 name=pipend \ ! moqsink url={} broadcast={} ", - args.relay_url, args.relay_path + moqargs.relay_url, args.app.room ); - } else if let output_args::OutputOption::WHIP(args) = &args.output { + } else if let output_args::OutputOption::WHIP(whipargs) = &args.output { output_pipeline = format!( " - ! whipclientsink name=pipend signaller::whip-endpoint=\"{}\" signaller::auth-token=\"{}\" congestion-control=disabled + ! whipclientsink name=pipend signaller::whip-endpoint=\"{}/api/whip/{}\" signaller::auth-token=\"{}\" congestion-control=disabled ", - args.endpoint, args.auth_token + whipargs.endpoint, args.app.room, whipargs.auth_token ); } @@ -271,7 +278,7 @@ async fn main() -> std::io::Result<()> { .unwrap(); let _ = pipeline.set_state(gst::State::Playing); - let pipeline_clone = Arc::new(Mutex::new(pipeline.clone())); + let pipeline_clone = Arc::new(tokio::sync::Mutex::new(pipeline.clone())); // let app_state = web::Data::new(AppState { // pipeline: Arc::new(Mutex::new(pipeline.clone())), @@ -313,8 +320,7 @@ async fn main() -> std::io::Result<()> { //TODO: Get this from the CLI let server = "server"; - let ws_relay = "localhost:1999"; - let url_string = format!("ws://{}/parties/main/testing?_pk={}", ws_relay, server); + let url_string = format!("{}/parties/main/{}?_pk={}", args.app.input_server, args.app.room, server); let mut socket = None; let start_time = Instant::now(); @@ -323,14 +329,14 @@ async fn main() -> std::io::Result<()> { while socket.is_none() && start_time.elapsed() < retry_duration { match Url::parse(&url_string) { Ok(url) => { - match connect(url.as_str()) { - Ok((s, _response)) => { + match connect_async(url.as_str()).await { + Ok((ws_stream, _response)) => { println!("[websocket]: Connected to the server"); - socket = Some(s); + socket = Some(ws_stream); } Err(e) => { eprintln!("[websocket]: Error connecting: {}", e); - std::thread::sleep(Duration::from_secs(1)); // Wait before retrying + tokio::time::sleep(Duration::from_secs(1)).await; } } } @@ -341,121 +347,147 @@ async fn main() -> std::io::Result<()> { } } + // Create an async channel for sending events to the pipeline + let (event_tx, mut event_rx) = mpsc::channel(10); - if let Some(mut socket) = socket { - socket.send(Message::Text("Hello There".into())).unwrap(); - - let pipeline = pipeline_clone.lock().unwrap(); - - let reason = loop { - let _handle_msg = match socket.read() { - Ok(msg) => { - match msg { - Message::Text(txt) => { - match serde_json::from_str::(&txt) { - Ok(input_msg) => match input_msg { - InputMessage::MouseMove { x, y } => { - let structure = - gst::Structure::builder("MouseMoveRelative") - .field("pointer_x", x as f64) - .field("pointer_y", y as f64) - .build(); - - let event = gst::event::CustomUpstream::new(structure); - pipeline.send_event(event); - } - InputMessage::KeyDown { key } => { - let structure = gst::Structure::builder("KeyboardKey") - .field("key", key as u32) - .field("pressed", true) - .build(); - - let event = gst::event::CustomUpstream::new(structure); - pipeline.send_event(event); - } - - InputMessage::KeyUp { key } => { - let structure: gst::Structure = - gst::Structure::builder("KeyboardKey") - .field("key", key as u32) - .field("pressed", false) - .build(); - - let event = gst::event::CustomUpstream::new(structure); - pipeline.send_event(event); - } - - InputMessage::Wheel { x, y } => { - let structure = gst::Structure::builder("MouseAxis") - .field("x", x as f64) - .field("y", y as f64) - .build(); - - let event = gst::event::CustomUpstream::new(structure); - pipeline.send_event(event); - } - - InputMessage::MouseDown { key } => { - let structure = gst::Structure::builder("MouseButton") - .field("button", key as u32) - .field("pressed", true) - .build(); - - let event = gst::event::CustomUpstream::new(structure); - pipeline.send_event(event); - } - - InputMessage::MouseUp { key } => { - let structure = gst::Structure::builder("MouseButton") - .field("button", key as u32) - .field("pressed", false) - .build(); - - let event = gst::event::CustomUpstream::new(structure); - pipeline.send_event(event); - } - }, - - Err(e) => { - // eprintln!("Failed to parse input message: {}", e); - println!("{}", e); - // Optionally, send an error response or handle the error - } - } - } - - Message::Binary(_) => { - // session.binary(bin).await.unwrap(); - } - - Message::Close(reason) => { - //TODO: Add a retry method for the websocket server, when it goes down because of a graceful connection close - break reason; - } + // A shared state to track currently pressed keys + let pressed_keys = Arc::new(tokio::sync::Mutex::new(HashSet::new())); - Message::Ping(bytes) => { - socket.send(Message::Pong(bytes)).unwrap(); - } + // Spawn a task to process events for the pipeline + let pipeline_task = { + let pipeline = Arc::clone(&pipeline_clone); + tokio::spawn(async move { + while let Some(event) = event_rx.recv().await { + let mut pipeline = pipeline.lock().await; + pipeline.send_event(event); + } + }) + }; - Message::Pong(bytes) => { - socket.send(Message::Ping(bytes)).unwrap(); + if let Some(mut socket) = socket { + socket + .send(Message::Text("Hello There".into())) + .await + .expect("Failed to send initial message"); + + while let Some(msg) = socket.next().await { + match msg { + Ok(Message::Text(txt)) => { + let event_tx = event_tx.clone(); + let pressed_keys = Arc::clone(&pressed_keys); + + // Spawn a task to handle the input message + tokio::spawn(async move { + if let Ok(input_msg) = from_str::(&txt) { + if let Some(event) = handle_input_message(input_msg, &pressed_keys).await { + event_tx.send(event).await.unwrap(); + } } - - // ignore - Message::Frame(_) => {} - } + }); + } + Ok(Message::Ping(bytes)) => { + socket.send(Message::Pong(bytes)).await.unwrap(); + } + Ok(Message::Pong(bytes)) => { + socket.send(Message::Ping(bytes)).await.unwrap(); + } + Ok(Message::Close(reason)) => { + println!("WebSocket closed: {:?}", reason); + break; } Err(e) => { - //TODO: Add a retry method for the websocket server, when it goes down because of ungraceful connection close - eprintln!("Error reading message: {}", e); + eprintln!("Error reading WebSocket message: {}", e); } - }; - }; + _ => {} + } + } - let _ = socket.close(reason); + pipeline_task.await?; } else { eprintln!("[websocket]: Could not connect to the server within 30 seconds."); } Ok(()) } + +async fn handle_input_message( + input_msg: InputMessage, + pressed_keys: &Arc>> +) -> Option { + match input_msg { + InputMessage::MouseMove { x, y } => { + let structure = gst::Structure::builder("MouseMoveRelative") + .field("pointer_x", x as f64) + .field("pointer_y", y as f64) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::MouseMoveAbs { x, y } => { + let structure = gst::Structure::builder("MouseMoveAbsolute") + .field("pointer_x", x as f64) + .field("pointer_y", y as f64) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::KeyDown { key } => { + let mut keys = pressed_keys.lock().await; + // If the key is already pressed, send KeyUp first to release it + // this prevents multiple down events locking a key + if keys.contains(&key) { + let structure = gst::Structure::builder("KeyboardKey") + .field("key", key as u32) + .field("pressed", false) + .build(); + + let release_event = gst::event::CustomUpstream::new(structure); + return Some(release_event); // Send the release event first + } + keys.insert(key); + + let structure = gst::Structure::builder("KeyboardKey") + .field("key", key as u32) + .field("pressed", true) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::KeyUp { key } => { + let mut keys = pressed_keys.lock().await; + // Remove the key from the pressed state when released + keys.remove(&key); + + let structure = gst::Structure::builder("KeyboardKey") + .field("key", key as u32) + .field("pressed", false) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::Wheel { x, y } => { + let structure = gst::Structure::builder("MouseAxis") + .field("x", x as f64) + .field("y", y as f64) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::MouseDown { key } => { + let structure = gst::Structure::builder("MouseButton") + .field("button", key as u32) + .field("pressed", true) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + InputMessage::MouseUp { key } => { + let structure = gst::Structure::builder("MouseButton") + .field("button", key as u32) + .field("pressed", false) + .build(); + + Some(gst::event::CustomUpstream::new(structure)) + } + } +} diff --git a/packages/webrtc-relay/Containerfile b/packages/webrtc-relay/Containerfile new file mode 100644 index 00000000..e74311e6 --- /dev/null +++ b/packages/webrtc-relay/Containerfile @@ -0,0 +1,20 @@ +FROM docker.io/golang:1.23-alpine AS go-build +WORKDIR /builder +COPY . /builder +RUN go build + +FROM docker.io/golang:1.23-alpine +COPY --from=go-build /builder/webrtcrelay /webrtcrelay/webrtcrelay +WORKDIR /webrtcrelay + +# ENV flags +ENV VERBOSE=false +ENV ENDPOINT_PORT=8088 +ENV WEBRTC_UDP_START=10000 +ENV WEBRTC_UDP_END=20000 +ENV STUN_SERVER="stun.l.google.com:19302" + +EXPOSE $ENDPOINT_PORT +EXPOSE $WEBRTC_UDP_START-$WEBRTC_UDP_END/udp + +ENTRYPOINT ["/webrtcrelay/webrtcrelay"] \ No newline at end of file diff --git a/packages/webrtc-relay/go.mod b/packages/webrtc-relay/go.mod new file mode 100644 index 00000000..410c29bb --- /dev/null +++ b/packages/webrtc-relay/go.mod @@ -0,0 +1,27 @@ +module webrtcrelay + +go 1.23 + +require ( + github.com/google/uuid v1.6.0 // indirect + github.com/pion/datachannel v1.5.9 // indirect + github.com/pion/dtls/v3 v3.0.4 // indirect + github.com/pion/ice/v4 v4.0.2 // indirect + github.com/pion/interceptor v0.1.37 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns/v2 v2.0.7 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.14 // indirect + github.com/pion/rtp v1.8.9 // indirect + github.com/pion/sctp v1.8.33 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v3 v3.0.4 // indirect + github.com/pion/stun/v3 v3.0.0 // indirect + github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/turn/v4 v4.0.0 // indirect + github.com/pion/webrtc/v4 v4.0.2 // indirect + github.com/wlynxg/anet v0.0.3 // indirect + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.26.0 // indirect +) diff --git a/packages/webrtc-relay/go.sum b/packages/webrtc-relay/go.sum new file mode 100644 index 00000000..75476156 --- /dev/null +++ b/packages/webrtc-relay/go.sum @@ -0,0 +1,56 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA= +github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE= +github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= +github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg= +github.com/pion/ice/v4 v4.0.2 h1:1JhBRX8iQLi0+TfcavTjPjI6GO41MFn4CeTBX+Y9h5s= +github.com/pion/ice/v4 v4.0.2/go.mod h1:DCdqyzgtsDNYN6/3U8044j3U7qsJ9KFJC92VnOWHvXg= +github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= +github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= +github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= +github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtp v1.8.9 h1:E2HX740TZKaqdcPmf4pw6ZZuG8u5RlMMt+l3dxeu6Wk= +github.com/pion/rtp v1.8.9/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/sctp v1.8.33 h1:dSE4wX6uTJBcNm8+YlMg7lw1wqyKHggsP5uKbdj+NZw= +github.com/pion/sctp v1.8.33/go.mod h1:beTnqSzewI53KWoG3nqB282oDMGrhNxBdb+JZnkCwRM= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M= +github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ= +github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw= +github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v4 v4.0.0 h1:qxplo3Rxa9Yg1xXDxxH8xaqcyGUtbHYw4QSCvmFWvhM= +github.com/pion/turn/v4 v4.0.0/go.mod h1:MuPDkm15nYSklKpN8vWJ9W2M0PlyQZqYt1McGuxG7mA= +github.com/pion/webrtc/v4 v4.0.2 h1:fBwm5/hqSUybrCWl0DDBSTDrpbkcgkqpeLmXw9CsBQA= +github.com/pion/webrtc/v4 v4.0.2/go.mod h1:moylBT2A4dNoEaYBCdV1nThM3TLwRHzWszIG+eSPaqQ= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/wlynxg/anet v0.0.3 h1:PvR53psxFXstc12jelG6f1Lv4MWqE0tI76/hHGjh9rg= +github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/packages/webrtc-relay/internal/common.go b/packages/webrtc-relay/internal/common.go new file mode 100644 index 00000000..d621ffd5 --- /dev/null +++ b/packages/webrtc-relay/internal/common.go @@ -0,0 +1,119 @@ +package webrtcrelay + +import ( + "github.com/pion/interceptor" + "github.com/pion/webrtc/v4" + "log" +) + +type Stream struct { + PeerConnection *webrtc.PeerConnection + AudioTrack webrtc.TrackLocal + VideoTrack webrtc.TrackLocal +} + +type Viewer struct { + UUID string + PeerConnection *webrtc.PeerConnection +} + +func (vw *Viewer) AddTrack(trackLocal *webrtc.TrackLocal) error { + rtpSender, err := vw.PeerConnection.AddTrack(*trackLocal) + if err != nil { + return err + } + + go func() { + rtcpBuffer := make([]byte, 1400) + for { + if _, _, rtcpErr := rtpSender.Read(rtcpBuffer); rtcpErr != nil { + return + } + } + }() + + return nil +} + +var StreamMap map[string]*Stream //< stream name -> stream +var ViewerMap map[string]map[string]*Viewer //< stream name -> viewers by their UUID + +var globalWebRTCAPI *webrtc.API +var globalWebRTCConfig = webrtc.Configuration{ + ICETransportPolicy: webrtc.ICETransportPolicyAll, + BundlePolicy: webrtc.BundlePolicyBalanced, + SDPSemantics: webrtc.SDPSemanticsUnifiedPlan, +} + +func InitWebRTCAPI() error { + // Make our maps + StreamMap = make(map[string]*Stream) + ViewerMap = make(map[string]map[string]*Viewer) + + var err error + flags := GetRelayFlags() + + // Media engine + mediaEngine := &webrtc.MediaEngine{} + + // Default codecs cover most of our needs + err = mediaEngine.RegisterDefaultCodecs() + if err != nil { + return err + } + + // Interceptor registry + interceptorRegistry := &interceptor.Registry{} + + // Use default set + err = webrtc.RegisterDefaultInterceptors(mediaEngine, interceptorRegistry) + if err != nil { + return err + } + + // Setting engine + settingEngine := webrtc.SettingEngine{} + + // New in v4, reduces CPU usage and latency when enabled + settingEngine.EnableSCTPZeroChecksum(true) + + // Set the UDP port range used by WebRTC + err = settingEngine.SetEphemeralUDPPortRange(uint16(flags.WebRTCUDPStart), uint16(flags.WebRTCUDPEnd)) + if err != nil { + return err + } + + // Create a new API object with our customized settings + globalWebRTCAPI = webrtc.NewAPI(webrtc.WithMediaEngine(mediaEngine), webrtc.WithSettingEngine(settingEngine), webrtc.WithInterceptorRegistry(interceptorRegistry)) + + return nil +} + +// GetWebRTCAPI returns the global WebRTC API +func GetWebRTCAPI() *webrtc.API { + return globalWebRTCAPI +} + +// CreatePeerConnection sets up a new peer connection +func CreatePeerConnection(onClose func()) (*webrtc.PeerConnection, error) { + pc, err := globalWebRTCAPI.NewPeerConnection(globalWebRTCConfig) + if err != nil { + return nil, err + } + + // Log connection state changes and handle failed/disconnected connections + pc.OnConnectionStateChange(func(connectionState webrtc.PeerConnectionState) { + // Close PeerConnection in cases + if connectionState == webrtc.PeerConnectionStateFailed || + connectionState == webrtc.PeerConnectionStateDisconnected || + connectionState == webrtc.PeerConnectionStateClosed { + err := pc.Close() + if err != nil { + log.Printf("Error closing PeerConnection: %s\n", err.Error()) + } + onClose() + } + }) + + return pc, nil +} diff --git a/packages/webrtc-relay/internal/flags.go b/packages/webrtc-relay/internal/flags.go new file mode 100644 index 00000000..ac16b2db --- /dev/null +++ b/packages/webrtc-relay/internal/flags.go @@ -0,0 +1,78 @@ +package webrtcrelay + +import ( + "flag" + "github.com/pion/webrtc/v4" + "log" + "os" + "strconv" +) + +var globalFlags *RelayFlags + +type RelayFlags struct { + Verbose bool + EndpointPort int + WebRTCUDPStart int + WebRTCUDPEnd int + STUNServer string +} + +func (flags *RelayFlags) DebugLog() { + log.Println("Relay Flags:") + log.Println("> Verbose: ", flags.Verbose) + log.Println("> Endpoint Port: ", flags.EndpointPort) + log.Println("> WebRTC UDP Range Start: ", flags.WebRTCUDPStart) + log.Println("> WebRTC UDP Range End: ", flags.WebRTCUDPEnd) + log.Println("> WebRTC STUN Server: ", flags.STUNServer) +} + +func getEnvAsInt(name string, defaultVal int) int { + valueStr := os.Getenv(name) + if value, err := strconv.Atoi(valueStr); err != nil { + return defaultVal + } else { + return value + } +} + +func getEnvAsBool(name string, defaultVal bool) bool { + valueStr := os.Getenv(name) + val, err := strconv.ParseBool(valueStr) + if err != nil { + return defaultVal + } + return val +} + +func getEnvAsString(name string, defaultVal string) string { + valueStr := os.Getenv(name) + if len(valueStr) == 0 { + return defaultVal + } + return valueStr +} + +func InitRelayFlags() { + // Create Flags struct + globalFlags = &RelayFlags{} + // Get flags + flag.BoolVar(&globalFlags.Verbose, "verbose", getEnvAsBool("VERBOSE", false), "Verbose mode") + flag.IntVar(&globalFlags.EndpointPort, "endpointPort", getEnvAsInt("ENDPOINT_PORT", 8088), "HTTP endpoint port") + flag.IntVar(&globalFlags.WebRTCUDPStart, "webrtcUDPStart", getEnvAsInt("WEBRTC_UDP_START", 10000), "WebRTC UDP port range start") + flag.IntVar(&globalFlags.WebRTCUDPEnd, "webrtcUDPEnd", getEnvAsInt("WEBRTC_UDP_END", 20000), "WebRTC UDP port range end") + flag.StringVar(&globalFlags.STUNServer, "stunServer", getEnvAsString("STUN_SERVER", "stun.l.google.com:19302"), "WebRTC STUN server") + // Parse flags + flag.Parse() + + // ICE STUN servers + globalWebRTCConfig.ICEServers = []webrtc.ICEServer{ + { + URLs: []string{"stun:" + globalFlags.STUNServer}, + }, + } +} + +func GetRelayFlags() *RelayFlags { + return globalFlags +} diff --git a/packages/webrtc-relay/internal/http.go b/packages/webrtc-relay/internal/http.go new file mode 100644 index 00000000..7241a86e --- /dev/null +++ b/packages/webrtc-relay/internal/http.go @@ -0,0 +1,340 @@ +package webrtcrelay + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/google/uuid" + "github.com/pion/webrtc/v4" + "io" + "log" + "net/http" + "strconv" + "strings" +) + +var httpMux *http.ServeMux + +func InitHTTPEndpoint() { + // Create HTTP mux which serves our WHIP/WHEP endpoints + httpMux = http.NewServeMux() + + // Endpoints themselves + httpMux.Handle("/", http.NotFoundHandler()) + httpMux.HandleFunc("/api/whip/{streamName}", corsAnyHandler(whipHandler)) + httpMux.HandleFunc("/api/whep/{streamName}", corsAnyHandler(whepHandler)) + + // Get our serving port + port := GetRelayFlags().EndpointPort + + // Log and start the endpoint server + log.Println("Starting HTTP endpoint server on :", strconv.Itoa(port)) + go func() { + log.Fatal((&http.Server{ + Handler: httpMux, + Addr: ":" + strconv.Itoa(port), + }).ListenAndServe()) + }() +} + +// WHIP - WebRTC HTTP Ingress Protocol +// This is the handler for the /api/whip/{streamName} endpoint +func whipHandler(w http.ResponseWriter, r *http.Request) { + // Get stream name + streamName := r.PathValue("streamName") + if len(streamName) <= 0 { + logHTTPError(w, "no stream name given", http.StatusBadRequest) + return + } + + // Get body + body, err := io.ReadAll(r.Body) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Get SDP offer from body + sdpOffer := string(body) + if sdpOffer == "" { + // If stream exists, just return OK (force stream close?) + if _, ok := StreamMap[streamName]; ok { + w.WriteHeader(http.StatusOK) + return + } else { + logHTTPError(w, "SDP offer not set", http.StatusBadRequest) + return + } + } + + // Verify there's no existing stream with same name + if _, ok := StreamMap[streamName]; ok { + logHTTPError(w, "stream name already in use", http.StatusBadRequest) + return + } + + // Callback for closing PeerConnection + onPCClose := func() { + if GetRelayFlags().Verbose { + log.Println("Closed PeerConnection for stream: ", streamName) + } + if _, ok := StreamMap[streamName]; ok { + delete(StreamMap, streamName) + } + } + + // Create a new stream + if GetRelayFlags().Verbose { + log.Println("Creating new stream: ", streamName) + } + stream := &Stream{} + stream.PeerConnection, err = CreatePeerConnection(onPCClose) + if err != nil { + logHTTPError(w, err.Error(), http.StatusInternalServerError) + return + } + + // Modify SDP offer to remove opus "sprop-maxcapturerate=24000" (fixes opus bad quality issue, present in GStreamer) + sdpOffer = strings.Replace(sdpOffer, ";sprop-maxcapturerate=24000", "", -1) + + stream.PeerConnection.OnTrack(func(remoteTrack *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) { + var localTrack *webrtc.TrackLocalStaticRTP + if remoteTrack.Kind() == webrtc.RTPCodecTypeVideo { + localTrack, err = webrtc.NewTrackLocalStaticRTP(remoteTrack.Codec().RTPCodecCapability, "video", fmt.Sprint("nestri-", streamName)) + if err != nil { + log.Println("Failed to create local video track for stream: ", streamName, " - reason: ", err) + return + } + stream.VideoTrack = localTrack + } else if remoteTrack.Kind() == webrtc.RTPCodecTypeAudio { + localTrack, err = webrtc.NewTrackLocalStaticRTP(remoteTrack.Codec().RTPCodecCapability, "audio", fmt.Sprint("nestri-", streamName)) + if err != nil { + log.Println("Failed to create local audio track for stream: ", streamName, " - reason: ", err) + return + } + stream.AudioTrack = localTrack + } + + // TODO: With custom (non-WHEP) viewer connections, notify them of new stream to set their tracks + + rtpBuffer := make([]byte, 1400) + for { + read, _, err := remoteTrack.Read(rtpBuffer) + if err != nil { + // EOF is expected when stopping stream + if !errors.Is(err, io.EOF) { + log.Println("RTP read error from stream: ", streamName, " - ", err) + } + break + } + + _, err = localTrack.Write(rtpBuffer[:read]) + if err != nil && !errors.Is(err, io.ErrClosedPipe) { + log.Println("RTP write error from stream: ", streamName, " - ", err) + break + } + } + // TODO: Cleanup track from viewer for stream restart + }) + + // Set new remote description + err = stream.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ + Type: webrtc.SDPTypeOffer, + SDP: sdpOffer, + }) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + gatherComplete := webrtc.GatheringCompletePromise(stream.PeerConnection) + + // Create Answer and set local description + answer, err := stream.PeerConnection.CreateAnswer(nil) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + err = stream.PeerConnection.SetLocalDescription(answer) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + <-gatherComplete + + // Return SDP answer + w.Header().Set("Content-Type", "application/sdp") + w.Header().Set("Location", fmt.Sprint("/api/whip/", streamName)) + w.WriteHeader(http.StatusCreated) + _, err = w.Write([]byte(stream.PeerConnection.LocalDescription().SDP)) + if err != nil { + log.Println(err) + return + } + + // Save to our stream map + StreamMap[streamName] = stream +} + +// WHEP - WebRTC HTTP Egress Protocol +// This is the handler for the /api/whep/{streamName} endpoint +func whepHandler(w http.ResponseWriter, r *http.Request) { + // Get stream name + streamName := r.PathValue("streamName") + if len(streamName) <= 0 { + logHTTPError(w, "no stream name given", http.StatusBadRequest) + return + } + + // Make sure stream exists + stream, ok := StreamMap[streamName] + if !ok { + logHTTPError(w, "no stream with given name online", http.StatusNotFound) + return + } + + // Get body + body, err := io.ReadAll(r.Body) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Get SDP offer from body + sdpOffer := string(body) + if sdpOffer == "" { + logHTTPError(w, "SDP offer not set", http.StatusBadRequest) + return + } + + // Generate UUID for viewer + viewerUUID := uuid.New().String() + + // Callback for closing PeerConnection + onPCClose := func() { + if GetRelayFlags().Verbose { + log.Println("Closed PeerConnection for viewer: ", viewerUUID, " - beloging to stream: ", streamName) + } + if _, ok := ViewerMap[streamName]; ok { + if _, vOk := ViewerMap[viewerUUID]; vOk { + delete(ViewerMap[streamName], viewerUUID) + } + } + } + + // Create new viewer + if GetRelayFlags().Verbose { + log.Println("New viewer for stream: ", streamName) + } + viewer := &Viewer{ + UUID: viewerUUID, + } + viewer.PeerConnection, err = CreatePeerConnection(onPCClose) + if err != nil { + logHTTPError(w, err.Error(), http.StatusInternalServerError) + return + } + + // Add stream tracks for viewer + if stream.AudioTrack != nil { + if err = viewer.AddTrack(&stream.AudioTrack); err != nil { + logHTTPError(w, "failed to add audio track to viewer", http.StatusInternalServerError) + return + } + } else if GetRelayFlags().Verbose { + log.Println("nil audio track for stream: ", streamName) + } + if stream.VideoTrack != nil { + if err = viewer.AddTrack(&stream.VideoTrack); err != nil { + logHTTPError(w, "failed to add video track to viewer", http.StatusInternalServerError) + return + } + } else if GetRelayFlags().Verbose { + log.Println("nil video track for stream: ", streamName) + } + + // Set new remote description + err = viewer.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ + Type: webrtc.SDPTypeOffer, + SDP: sdpOffer, + }) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + gatherComplete := webrtc.GatheringCompletePromise(viewer.PeerConnection) + + // Create Answer and set local description + answer, err := viewer.PeerConnection.CreateAnswer(nil) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + err = viewer.PeerConnection.SetLocalDescription(answer) + if err != nil { + logHTTPError(w, err.Error(), http.StatusBadRequest) + return + } + + // Wait for ICE Gathering to complete + <-gatherComplete + + // Return SDP answer + w.Header().Set("Content-Type", "application/sdp") + w.Header().Set("Location", fmt.Sprint("/api/whep/", streamName)) + w.WriteHeader(http.StatusCreated) + _, err = w.Write([]byte(viewer.PeerConnection.LocalDescription().SDP)) + if err != nil { + log.Println(err) + return + } +} + +// logHTTPError logs (if verbose) and sends an error code to requester +func logHTTPError(w http.ResponseWriter, err string, code int) { + if GetRelayFlags().Verbose { + log.Println(err) + } + http.Error(w, err, code) +} + +// httpError sends a web response with an error message +func httpError(w http.ResponseWriter, statusCode int, message string) { + w.WriteHeader(statusCode) + _ = json.NewEncoder(w).Encode(map[string]string{"error": message}) +} + +// respondWithJSON writes JSON to the response body +func respondWithJSON(w http.ResponseWriter, statusCode int, payload interface{}) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(statusCode) + _ = json.NewEncoder(w).Encode(payload) +} + +// respondWithText writes text to the response body +func respondWithText(w http.ResponseWriter, statusCode int, payload string) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(statusCode) + _, _ = w.Write([]byte(payload)) +} + +// corsAnyHandler allows any origin to access the endpoint +func corsAnyHandler(next func(w http.ResponseWriter, r *http.Request)) http.HandlerFunc { + return func(res http.ResponseWriter, req *http.Request) { + // Allow all origins + res.Header().Set("Access-Control-Allow-Origin", "*") + res.Header().Set("Access-Control-Allow-Methods", "*") + res.Header().Set("Access-Control-Allow-Headers", "*") + + if req.Method != http.MethodOptions { + next(res, req) + } + } +} diff --git a/packages/webrtc-relay/main.go b/packages/webrtc-relay/main.go new file mode 100644 index 00000000..d9641bd4 --- /dev/null +++ b/packages/webrtc-relay/main.go @@ -0,0 +1,32 @@ +package main + +import ( + "log" + "os" + "os/signal" + "syscall" + "webrtcrelay/internal" +) + +func main() { + var err error + stopCh := make(chan os.Signal, 1) + signal.Notify(stopCh, os.Interrupt, syscall.SIGTERM) + + // Get flags and log them + webrtcrelay.InitRelayFlags() + webrtcrelay.GetRelayFlags().DebugLog() + + // Init WebRTC API + err = webrtcrelay.InitWebRTCAPI() + if err != nil { + log.Fatal("Failed to initialize WebRTC API: ", err) + } + + // Start our HTTP endpoints + webrtcrelay.InitHTTPEndpoint() + + // Wait for exit signal + <-stopCh + log.Println("Shutting down gracefully by signal..") +} From b2e4b1f3e165085c60038120d98f9151bb16ea15 Mon Sep 17 00:00:00 2001 From: Wanjohi <71614375+wanjohiryan@users.noreply.github.com> Date: Sun, 17 Nov 2024 10:31:19 +0300 Subject: [PATCH 26/43] fix: Move the Containerfile --- Containerfile => Containerfile.master | 2 +- Containerfile.relay | 21 +++++++++++++++++- Containerfile.cachyos => Containerfile.runner | 0 bun.lockb | Bin packages/webrtc-relay/Containerfile | 20 ----------------- packages/webrtc-relay/main.go | 2 +- 6 files changed, 22 insertions(+), 23 deletions(-) rename Containerfile => Containerfile.master (99%) rename Containerfile.cachyos => Containerfile.runner (100%) mode change 100755 => 100644 bun.lockb delete mode 100644 packages/webrtc-relay/Containerfile diff --git a/Containerfile b/Containerfile.master similarity index 99% rename from Containerfile rename to Containerfile.master index c03d0b03..14777233 100644 --- a/Containerfile +++ b/Containerfile.master @@ -1,4 +1,4 @@ - +#! Runs the docker server that handles everything else #****************************************************************************** # base #****************************************************************************** diff --git a/Containerfile.relay b/Containerfile.relay index 8bab1106..a49619dd 100644 --- a/Containerfile.relay +++ b/Containerfile.relay @@ -1 +1,20 @@ -# FIXME: Fit the MoQ relay Dockerfile here \ No newline at end of file +FROM docker.io/golang:1.23-alpine AS go-build +WORKDIR /builder +COPY packages/webrtc-relay/ /builder/ +RUN go build + +FROM docker.io/golang:1.23-alpine +COPY --from=go-build /builder/webrtcrelay /webrtcrelay/webrtcrelay +WORKDIR /webrtcrelay + +# ENV flags +ENV VERBOSE=false +ENV ENDPOINT_PORT=8088 +ENV WEBRTC_UDP_START=10000 +ENV WEBRTC_UDP_END=20000 +ENV STUN_SERVER="stun.l.google.com:19302" + +EXPOSE $ENDPOINT_PORT +EXPOSE $WEBRTC_UDP_START-$WEBRTC_UDP_END/udp + +ENTRYPOINT ["/webrtcrelay/webrtcrelay"] \ No newline at end of file diff --git a/Containerfile.cachyos b/Containerfile.runner similarity index 100% rename from Containerfile.cachyos rename to Containerfile.runner diff --git a/bun.lockb b/bun.lockb old mode 100755 new mode 100644 diff --git a/packages/webrtc-relay/Containerfile b/packages/webrtc-relay/Containerfile deleted file mode 100644 index e74311e6..00000000 --- a/packages/webrtc-relay/Containerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM docker.io/golang:1.23-alpine AS go-build -WORKDIR /builder -COPY . /builder -RUN go build - -FROM docker.io/golang:1.23-alpine -COPY --from=go-build /builder/webrtcrelay /webrtcrelay/webrtcrelay -WORKDIR /webrtcrelay - -# ENV flags -ENV VERBOSE=false -ENV ENDPOINT_PORT=8088 -ENV WEBRTC_UDP_START=10000 -ENV WEBRTC_UDP_END=20000 -ENV STUN_SERVER="stun.l.google.com:19302" - -EXPOSE $ENDPOINT_PORT -EXPOSE $WEBRTC_UDP_START-$WEBRTC_UDP_END/udp - -ENTRYPOINT ["/webrtcrelay/webrtcrelay"] \ No newline at end of file diff --git a/packages/webrtc-relay/main.go b/packages/webrtc-relay/main.go index d9641bd4..76e33b1e 100644 --- a/packages/webrtc-relay/main.go +++ b/packages/webrtc-relay/main.go @@ -28,5 +28,5 @@ func main() { // Wait for exit signal <-stopCh - log.Println("Shutting down gracefully by signal..") + log.Println("Shutting down gracefully by signal...") } From 06a952dbbaf8d90c21f24f597d42ba4b8692b963 Mon Sep 17 00:00:00 2001 From: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Date: Sun, 17 Nov 2024 10:59:25 +0200 Subject: [PATCH 27/43] =?UTF-8?q?=F0=9F=90=9Bfix:=20some=20input=20fixes,?= =?UTF-8?q?=20missing=20heartbeat=20(#132)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adds heartbeat to keep WS alive on nestri-server side - Fixes inputs getting stuck on repeated keys, while also allowing modifiers to be sent after. - For now treat Home keys as Esc to make games escapable. - Add button to start stream, to fix browser preventing play issue. Co-authored-by: DatCaptainHorse --- apps/www/src/routes/play/[id]/index.tsx | 44 +++++++++++----- packages/input/src/keyboard.ts | 6 +++ packages/server/src/main.rs | 68 ++++++++++++++++--------- 3 files changed, 81 insertions(+), 37 deletions(-) diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index 29d78052..58b73227 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -113,21 +113,39 @@ export default component$(() => { console.log("Setting mediastream"); if (video && mediaStream) { (video as HTMLVideoElement).srcObject = mediaStream; - (video as HTMLVideoElement).play().then(() => { - if (canvas.value) { - canvas.value.width = (video as HTMLVideoElement).videoWidth; - canvas.value.height = (video as HTMLVideoElement).videoHeight; - - const ctx = canvas.value.getContext("2d"); - const renderer = () => { - if (ctx) { - ctx.drawImage((video as HTMLVideoElement), 0, 0); - requestAnimationFrame(renderer); + const playbtn = document.createElement("button"); + playbtn.style.position = "absolute"; + playbtn.style.left = "50%"; + playbtn.style.top = "50%"; + playbtn.style.transform = "translateX(-50%) translateY(-50%)"; + playbtn.style.width = "12rem"; + playbtn.style.height = "6rem"; + playbtn.style.borderRadius = "1rem"; + playbtn.style.backgroundColor = "rgb(175, 50, 50)"; + playbtn.style.color = "black"; + playbtn.style.fontSize = "1.5em"; + playbtn.textContent = "< Start >"; + + playbtn.onclick = () => { + playbtn.remove(); + (video as HTMLVideoElement).play().then(() => { + if (canvas.value) { + canvas.value.width = (video as HTMLVideoElement).videoWidth; + canvas.value.height = (video as HTMLVideoElement).videoHeight; + + const ctx = canvas.value.getContext("2d"); + const renderer = () => { + if (ctx) { + ctx.drawImage((video as HTMLVideoElement), 0, 0); + requestAnimationFrame(renderer); + } } + requestAnimationFrame(renderer); } - requestAnimationFrame(renderer); - } - }); + }); + }; + + document.body.append(playbtn); } }); } diff --git a/packages/input/src/keyboard.ts b/packages/input/src/keyboard.ts index 8f882d17..420aab00 100644 --- a/packages/input/src/keyboard.ts +++ b/packages/input/src/keyboard.ts @@ -62,6 +62,10 @@ export class Keyboard { return (e: Event) => { e.preventDefault(); e.stopPropagation(); + // Prevent repeated key events from being sent (important for games) + if ((e as any).repeat) + return; + const data = dataCreator(e as any); // type assertion because of the way dataCreator is used this.websocket.send(JSON.stringify({...data, type} as Input)); }; @@ -74,6 +78,8 @@ export class Keyboard { } private keyToVirtualKeyCode(code: string) { + // Treat Home key as Escape - TODO: Make user-configurable + if (code === "Home") return 1; return keyCodeToLinuxEventCode[code] || undefined; } } \ No newline at end of file diff --git a/packages/server/src/main.rs b/packages/server/src/main.rs index 09dbcb06..7b59e7e2 100644 --- a/packages/server/src/main.rs +++ b/packages/server/src/main.rs @@ -59,7 +59,7 @@ fn handle_gpus(args: &args::Args) -> Option { } // Based on available arguments, pick a GPU - let mut gpu = gpus.get(0).cloned(); + let gpu; if !args.device.gpu_card_path.is_empty() { gpu = gpu::get_gpu_by_card_path(&gpus, &args.device.gpu_card_path); } else { @@ -107,7 +107,7 @@ fn handle_encoder_video(args: &args::Args) -> Option std::io::Result<()> { match Url::parse(&url_string) { Ok(url) => { match connect_async(url.as_str()).await { - Ok((ws_stream, _response)) => { + Ok((ws_stream, _)) => { println!("[websocket]: Connected to the server"); socket = Some(ws_stream); } @@ -358,19 +358,41 @@ async fn main() -> std::io::Result<()> { let pipeline = Arc::clone(&pipeline_clone); tokio::spawn(async move { while let Some(event) = event_rx.recv().await { - let mut pipeline = pipeline.lock().await; + let pipeline = pipeline.lock().await; pipeline.send_event(event); } }) }; - if let Some(mut socket) = socket { - socket - .send(Message::Text("Hello There".into())) - .await - .expect("Failed to send initial message"); + if let Some(socket) = socket { + let (mut ws_sink, mut ws_stream) = socket.split(); - while let Some(msg) = socket.next().await { + // Start the heartbeat task + let heartbeat_interval = Duration::from_secs(10); // Send a Ping every 10 seconds + let heartbeat_timeout = Duration::from_secs(20); // Consider the connection dead if no Pong within 20 seconds + + println!("Spawning heartbeat task"); + let heartbeat_task = tokio::spawn(async move { + let mut interval = tokio::time::interval(heartbeat_interval); + loop { + interval.tick().await; + + match tokio::time::timeout(heartbeat_timeout, ws_sink.send(Message::Ping(Vec::new()))).await { + Ok(Ok(_)) => {} + Ok(Err(e)) => { + eprintln!("[heartbeat]: Failed to send Ping: {}", e); + break; + } + Err(_) => { + eprintln!("[heartbeat]: Pong not received within timeout"); + break; + } + } + } + println!("[heartbeat]: Exiting heartbeat task"); + }); + + while let Some(msg) = ws_stream.next().await { match msg { Ok(Message::Text(txt)) => { let event_tx = event_tx.clone(); @@ -385,11 +407,13 @@ async fn main() -> std::io::Result<()> { } }); } - Ok(Message::Ping(bytes)) => { - socket.send(Message::Pong(bytes)).await.unwrap(); + Ok(Message::Ping(_)) => { + // Since we do our heartbeat logic above, no need to respond? + //ws_sink.send(Message::Pong(bytes)).await.unwrap(); } - Ok(Message::Pong(bytes)) => { - socket.send(Message::Ping(bytes)).await.unwrap(); + Ok(Message::Pong(_)) => { + // Spammy if kept on + //println!("[websocket]: Received Pong"); } Ok(Message::Close(reason)) => { println!("WebSocket closed: {:?}", reason); @@ -403,6 +427,9 @@ async fn main() -> std::io::Result<()> { } pipeline_task.await?; + + // Abort on exit to cleanup + heartbeat_task.abort(); } else { eprintln!("[websocket]: Could not connect to the server within 30 seconds."); } @@ -412,7 +439,7 @@ async fn main() -> std::io::Result<()> { async fn handle_input_message( input_msg: InputMessage, - pressed_keys: &Arc>> + pressed_keys: &Arc>>, ) -> Option { match input_msg { InputMessage::MouseMove { x, y } => { @@ -433,16 +460,9 @@ async fn handle_input_message( } InputMessage::KeyDown { key } => { let mut keys = pressed_keys.lock().await; - // If the key is already pressed, send KeyUp first to release it - // this prevents multiple down events locking a key + // If the key is already pressed, return to prevent key lockup if keys.contains(&key) { - let structure = gst::Structure::builder("KeyboardKey") - .field("key", key as u32) - .field("pressed", false) - .build(); - - let release_event = gst::event::CustomUpstream::new(structure); - return Some(release_event); // Send the release event first + return None; } keys.insert(key); From 8d9a221f4324ae094a73576327342e879a6d14e2 Mon Sep 17 00:00:00 2001 From: Wanjohi Ryan Date: Sun, 17 Nov 2024 12:16:35 +0300 Subject: [PATCH 28/43] fix: Add stuff --- Containerfile.relay | 38 ++++++------- apps/docs/tsconfig.json | 2 +- apps/www/src/routes/play/[id]/index.tsx | 64 +--------------------- apps/www/src/routes/play/webrtc-stream.ts | 58 ++++++++++++++++++++ bun.lockb | Bin 807968 -> 808008 bytes packages/master/go.mod | 3 + packages/master/main.go | 5 ++ 7 files changed, 89 insertions(+), 81 deletions(-) create mode 100644 apps/www/src/routes/play/webrtc-stream.ts mode change 100644 => 100755 bun.lockb create mode 100644 packages/master/go.mod create mode 100644 packages/master/main.go diff --git a/Containerfile.relay b/Containerfile.relay index a49619dd..587ef6c9 100644 --- a/Containerfile.relay +++ b/Containerfile.relay @@ -1,20 +1,20 @@ -FROM docker.io/golang:1.23-alpine AS go-build -WORKDIR /builder -COPY packages/webrtc-relay/ /builder/ -RUN go build - -FROM docker.io/golang:1.23-alpine -COPY --from=go-build /builder/webrtcrelay /webrtcrelay/webrtcrelay -WORKDIR /webrtcrelay - -# ENV flags -ENV VERBOSE=false -ENV ENDPOINT_PORT=8088 -ENV WEBRTC_UDP_START=10000 -ENV WEBRTC_UDP_END=20000 -ENV STUN_SERVER="stun.l.google.com:19302" - -EXPOSE $ENDPOINT_PORT -EXPOSE $WEBRTC_UDP_START-$WEBRTC_UDP_END/udp - +FROM docker.io/golang:1.23-alpine AS go-build +WORKDIR /builder +COPY packages/webrtc-relay/ /builder/ +RUN go build + +FROM docker.io/golang:1.23-alpine +COPY --from=go-build /builder/webrtcrelay /webrtcrelay/webrtcrelay +WORKDIR /webrtcrelay + +# ENV flags +ENV VERBOSE=false +ENV ENDPOINT_PORT=8088 +ENV WEBRTC_UDP_START=10000 +ENV WEBRTC_UDP_END=20000 +ENV STUN_SERVER="stun.l.google.com:19302" + +EXPOSE $ENDPOINT_PORT +EXPOSE $WEBRTC_UDP_START-$WEBRTC_UDP_END/udp + ENTRYPOINT ["/webrtcrelay/webrtcrelay"] \ No newline at end of file diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index ad2f8d27..59e048dc 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -1,4 +1,4 @@ { - "extends": "./.nuxt/tsconfig.json", + // "extends": "./.nuxt/tsconfig.json", "ignoreConfigErrors": true } diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index 29d78052..1a53c245 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -2,65 +2,7 @@ import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; import { useLocation } from "@builder.io/qwik-city"; import PartySocket from "partysocket"; import {Keyboard, Mouse} from "@nestri/input" - -class WebRTCStream { - private readonly _url: string; - private _pc: RTCPeerConnection; - private _mediaStream: MediaStream | undefined = undefined; - - constructor(serverURL: string) { - this._url = serverURL; - - console.log("Setting up PeerConnection"); - this._pc = new RTCPeerConnection({ - iceServers: [ - { - urls: "stun:stun.l.google.com:19302" - } - ], - }); - - // Allow us to receive single audio and video tracks - this._pc.addTransceiver("audio", { direction: "recvonly" }); - this._pc.addTransceiver("video", { direction: "recvonly" }); - - this._pc.ontrack = (e) => { - console.log("Track received: ", e.track); - // Update our mediastream as we receive tracks - this._mediaStream = e.streams[e.streams.length - 1]; - }; - } - - // Forces opus to stereo in Chromium browsers, because of course - private forceOpusStereo(SDP: string): string { - // Look for "minptime=10;useinbandfec=1" and replace with "minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;" - return SDP.replace(/(minptime=10;useinbandfec=1)/, "$1;stereo=1;sprop-stereo=1;"); - } - - public async connect(streamName: string) { - const offer = await this._pc.createOffer(); - offer.sdp = this.forceOpusStereo(offer.sdp!); - await this._pc.setLocalDescription(offer); - - const response = await fetch(`${this._url}/api/whep/${streamName}`, { - method: "POST", - body: offer.sdp, - headers: { - 'Content-Type': "application/sdp" - } - }); - - const answer = await response.text(); - await this._pc.setRemoteDescription({ - sdp: answer, - type: "answer", - }); - } - - public getMediaStream() { - return this._mediaStream; - } -} +import {WebRTCStream} from "../webrtc-stream" export default component$(() => { const id = useLocation().params.id; @@ -71,7 +13,7 @@ export default component$(() => { const ws = new PartySocket({ host: "https://nestri-party.datcaptainhorse.partykit.dev", // or localhost:1999 in dev - room: id, + room: id, }); if (!canvas.value) return; // Ensure canvas is available @@ -143,7 +85,7 @@ export default component$(() => { canvas.value.requestPointerLock(); } }} - class="aspect-video w-full h-auto rounded-sm" /> + class="aspect-video h-full w-auto rounded-sm" /> ) }) diff --git a/apps/www/src/routes/play/webrtc-stream.ts b/apps/www/src/routes/play/webrtc-stream.ts new file mode 100644 index 00000000..c3aa7ba7 --- /dev/null +++ b/apps/www/src/routes/play/webrtc-stream.ts @@ -0,0 +1,58 @@ +export class WebRTCStream { + private readonly _url: string; + private _pc: RTCPeerConnection; + private _mediaStream: MediaStream | undefined = undefined; + + constructor(serverURL: string) { + this._url = serverURL; + + console.log("Setting up PeerConnection"); + this._pc = new RTCPeerConnection({ + iceServers: [ + { + urls: "stun:stun.l.google.com:19302" + } + ], + }); + + // Allow us to receive single audio and video tracks + this._pc.addTransceiver("audio", { direction: "recvonly" }); + this._pc.addTransceiver("video", { direction: "recvonly" }); + + this._pc.ontrack = (e) => { + console.log("Track received: ", e.track); + // Update our mediastream as we receive tracks + this._mediaStream = e.streams[e.streams.length - 1]; + }; + } + + // Forces opus to stereo in Chromium browsers, because of course + private forceOpusStereo(SDP: string): string { + // Look for "minptime=10;useinbandfec=1" and replace with "minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;" + return SDP.replace(/(minptime=10;useinbandfec=1)/, "$1;stereo=1;sprop-stereo=1;"); + } + + public async connect(streamName: string) { + const offer = await this._pc.createOffer(); + offer.sdp = this.forceOpusStereo(offer.sdp!); + await this._pc.setLocalDescription(offer); + + const response = await fetch(`${this._url}/api/whep/${streamName}`, { + method: "POST", + body: offer.sdp, + headers: { + 'Content-Type': "application/sdp" + } + }); + + const answer = await response.text(); + await this._pc.setRemoteDescription({ + sdp: answer, + type: "answer", + }); + } + + public getMediaStream() { + return this._mediaStream; + } +} diff --git a/bun.lockb b/bun.lockb old mode 100644 new mode 100755 index 6b20cb99c6f1c6c6285ba5451697bab87cf014e8..28e1f495d90107e00d7aa5e88410d9a2631f2bb0 GIT binary patch delta 222 zcmZ3m!tlfj!wG(jI~x64{TW;RnOgmsTm4yD{aIW6*;@VCTm3n<`g0zsV`q#r)HBdC z+AdYkc`uvsSo_acoIuRA{pTz0H7Qnk`6;OinR&$}i8(oXS;fd){p5_)civ&#H=g*_W4waq$z@Nv1a|Tq-W4mDh&wEC$iXe#E3qjNO`|~JH_YUHT i<&+492o_A=7{oK5dj*ucBbaCU{4MN?(`$lxmH+@86++wq delta 173 zcmX@H!f?R~!wG(j6B_+n{TW;RnOgmsTm4yD{aIW6*;@VCTm3n<`g0zsV`pLjgY8oF zocFRBm$v_W#R7;4oGx<;LigV(wKhVpGRr>gdiS`=>`Ej y3Y-N25DA6tkpVpK894)jAp8~61A}<#IX^(T9@B3I@yzFJ2!_Z`nBEx7a~uF(%Q4yj diff --git a/packages/master/go.mod b/packages/master/go.mod new file mode 100644 index 00000000..308a4045 --- /dev/null +++ b/packages/master/go.mod @@ -0,0 +1,3 @@ +module master + +go 1.23.3 diff --git a/packages/master/main.go b/packages/master/main.go new file mode 100644 index 00000000..a29e8a5d --- /dev/null +++ b/packages/master/main.go @@ -0,0 +1,5 @@ +package main + +func main() { + println("Hello World!") +} From 36cac1d17bf2be5bc10eeb5656eb6831685593ad Mon Sep 17 00:00:00 2001 From: Wanjohi Ryan Date: Sun, 17 Nov 2024 13:00:55 +0300 Subject: [PATCH 29/43] fix: Fix canvas overflowing because of aspect-ratio --- apps/www/src/routes/play/[id]/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index f5787f72..66e6607d 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -103,7 +103,9 @@ export default component$(() => { canvas.value.requestPointerLock(); } }} - class="aspect-video h-full w-auto rounded-sm" /> + //TODO: Fix the canvas issues + //TODO: go full screen, then lock on "landscape" screen-orientation on mobile + class="aspect-video h-screen w-auto" /> ) }) From 9a8eddbe698eed23ade0e7c7caad4ed7e7c3ac8a Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Tue, 19 Nov 2024 11:52:47 +0300 Subject: [PATCH 30/43] feat: Rename webrtcrelay to relay --- packages/{webrtc-relay => relay}/go.mod | 2 +- packages/{webrtc-relay => relay}/go.sum | 0 packages/{webrtc-relay => relay}/internal/common.go | 9 +++++---- packages/{webrtc-relay => relay}/internal/flags.go | 5 +++-- packages/{webrtc-relay => relay}/internal/http.go | 7 ++++--- packages/{webrtc-relay => relay}/main.go | 10 +++++----- 6 files changed, 18 insertions(+), 15 deletions(-) rename packages/{webrtc-relay => relay}/go.mod (98%) rename packages/{webrtc-relay => relay}/go.sum (100%) rename packages/{webrtc-relay => relay}/internal/common.go (96%) rename packages/{webrtc-relay => relay}/internal/flags.go (99%) rename packages/{webrtc-relay => relay}/internal/http.go (99%) rename packages/{webrtc-relay => relay}/main.go (72%) diff --git a/packages/webrtc-relay/go.mod b/packages/relay/go.mod similarity index 98% rename from packages/webrtc-relay/go.mod rename to packages/relay/go.mod index 410c29bb..d2db0a2e 100644 --- a/packages/webrtc-relay/go.mod +++ b/packages/relay/go.mod @@ -1,4 +1,4 @@ -module webrtcrelay +module relay go 1.23 diff --git a/packages/webrtc-relay/go.sum b/packages/relay/go.sum similarity index 100% rename from packages/webrtc-relay/go.sum rename to packages/relay/go.sum diff --git a/packages/webrtc-relay/internal/common.go b/packages/relay/internal/common.go similarity index 96% rename from packages/webrtc-relay/internal/common.go rename to packages/relay/internal/common.go index d621ffd5..21c398f0 100644 --- a/packages/webrtc-relay/internal/common.go +++ b/packages/relay/internal/common.go @@ -1,9 +1,10 @@ -package webrtcrelay +package relay import ( + "log" + "github.com/pion/interceptor" "github.com/pion/webrtc/v4" - "log" ) type Stream struct { @@ -13,7 +14,7 @@ type Stream struct { } type Viewer struct { - UUID string + UUID string PeerConnection *webrtc.PeerConnection } @@ -35,7 +36,7 @@ func (vw *Viewer) AddTrack(trackLocal *webrtc.TrackLocal) error { return nil } -var StreamMap map[string]*Stream //< stream name -> stream +var StreamMap map[string]*Stream //< stream name -> stream var ViewerMap map[string]map[string]*Viewer //< stream name -> viewers by their UUID var globalWebRTCAPI *webrtc.API diff --git a/packages/webrtc-relay/internal/flags.go b/packages/relay/internal/flags.go similarity index 99% rename from packages/webrtc-relay/internal/flags.go rename to packages/relay/internal/flags.go index ac16b2db..129ac376 100644 --- a/packages/webrtc-relay/internal/flags.go +++ b/packages/relay/internal/flags.go @@ -1,11 +1,12 @@ -package webrtcrelay +package relay import ( "flag" - "github.com/pion/webrtc/v4" "log" "os" "strconv" + + "github.com/pion/webrtc/v4" ) var globalFlags *RelayFlags diff --git a/packages/webrtc-relay/internal/http.go b/packages/relay/internal/http.go similarity index 99% rename from packages/webrtc-relay/internal/http.go rename to packages/relay/internal/http.go index 7241a86e..d90f015d 100644 --- a/packages/webrtc-relay/internal/http.go +++ b/packages/relay/internal/http.go @@ -1,16 +1,17 @@ -package webrtcrelay +package relay import ( "encoding/json" "errors" "fmt" - "github.com/google/uuid" - "github.com/pion/webrtc/v4" "io" "log" "net/http" "strconv" "strings" + + "github.com/google/uuid" + "github.com/pion/webrtc/v4" ) var httpMux *http.ServeMux diff --git a/packages/webrtc-relay/main.go b/packages/relay/main.go similarity index 72% rename from packages/webrtc-relay/main.go rename to packages/relay/main.go index 76e33b1e..f72afd08 100644 --- a/packages/webrtc-relay/main.go +++ b/packages/relay/main.go @@ -4,8 +4,8 @@ import ( "log" "os" "os/signal" + relay "relay/internal" "syscall" - "webrtcrelay/internal" ) func main() { @@ -14,17 +14,17 @@ func main() { signal.Notify(stopCh, os.Interrupt, syscall.SIGTERM) // Get flags and log them - webrtcrelay.InitRelayFlags() - webrtcrelay.GetRelayFlags().DebugLog() + relay.InitRelayFlags() + relay.GetRelayFlags().DebugLog() // Init WebRTC API - err = webrtcrelay.InitWebRTCAPI() + err = relay.InitWebRTCAPI() if err != nil { log.Fatal("Failed to initialize WebRTC API: ", err) } // Start our HTTP endpoints - webrtcrelay.InitHTTPEndpoint() + relay.InitHTTPEndpoint() // Wait for exit signal <-stopCh From 42fbeb7a5c4ca9cf73dce26f4e8aac967523379a Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Tue, 19 Nov 2024 12:18:00 +0300 Subject: [PATCH 31/43] feat: Add websocket server v1 --- packages/relay/go.mod | 1 + packages/relay/go.sum | 2 + packages/relay/internal/http.go | 1 + packages/relay/internal/websocket.go | 112 +++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 packages/relay/internal/websocket.go diff --git a/packages/relay/go.mod b/packages/relay/go.mod index d2db0a2e..3513fcd5 100644 --- a/packages/relay/go.mod +++ b/packages/relay/go.mod @@ -4,6 +4,7 @@ go 1.23 require ( github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/pion/datachannel v1.5.9 // indirect github.com/pion/dtls/v3 v3.0.4 // indirect github.com/pion/ice/v4 v4.0.2 // indirect diff --git a/packages/relay/go.sum b/packages/relay/go.sum index 75476156..16b48af4 100644 --- a/packages/relay/go.sum +++ b/packages/relay/go.sum @@ -2,6 +2,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/pion/datachannel v1.5.9 h1:LpIWAOYPyDrXtU+BW7X0Yt/vGtYxtXQ8ql7dFfYUVZA= github.com/pion/datachannel v1.5.9/go.mod h1:kDUuk4CU4Uxp82NH4LQZbISULkX/HtzKa4P7ldf9izE= github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U= diff --git a/packages/relay/internal/http.go b/packages/relay/internal/http.go index d90f015d..fd1832d9 100644 --- a/packages/relay/internal/http.go +++ b/packages/relay/internal/http.go @@ -24,6 +24,7 @@ func InitHTTPEndpoint() { httpMux.Handle("/", http.NotFoundHandler()) httpMux.HandleFunc("/api/whip/{streamName}", corsAnyHandler(whipHandler)) httpMux.HandleFunc("/api/whep/{streamName}", corsAnyHandler(whepHandler)) + httpMux.HandleFunc("/room/{room}", corsAnyHandler(websocketHandler)) // Get our serving port port := GetRelayFlags().EndpointPort diff --git a/packages/relay/internal/websocket.go b/packages/relay/internal/websocket.go new file mode 100644 index 00000000..303f84ef --- /dev/null +++ b/packages/relay/internal/websocket.go @@ -0,0 +1,112 @@ +package relay + +import ( + "log" + "net/http" + "sync" + + "github.com/gorilla/websocket" +) + +// Room represents a chat room +type Room struct { + participants map[*Participant]bool + broadcast chan string + mutex sync.RWMutex +} + +// Participant represents a participant in a chat room +type Participant struct { + ws *websocket.Conn + send chan string + room *Room +} + +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, +} + +var rooms = make(map[string]*Room) +var mutex sync.RWMutex + +func websocketHandler(w http.ResponseWriter, r *http.Request) { + roomName := r.PathValue("room") + if len(roomName) <= 0 { + logHTTPError(w, "no stream name given", http.StatusBadRequest) + return + } + + mutex.Lock() + room, ok := rooms[roomName] + if !ok { + room = &Room{ + participants: make(map[*Participant]bool), + broadcast: make(chan string), + } + rooms[roomName] = room + } + mutex.Unlock() + + ws, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Println(err) + return + } + + participant := &Participant{ + ws: ws, + send: make(chan string), + room: room, + } + + room.mutex.Lock() + room.participants[participant] = true + room.mutex.Unlock() + + go participant.writePump() + go participant.readPump() + go room.broadcastPump() + +} + +func (p *Participant) writePump() { + for message := range p.send { + err := p.ws.WriteMessage(websocket.TextMessage, []byte(message)) + if err != nil { + log.Println(err) + p.room.removeParticipant(p) + return + } + } +} + +func (p *Participant) readPump() { + for { + _, message, err := p.ws.ReadMessage() + if err != nil { + log.Println(err) + p.room.removeParticipant(p) + return + } + + p.room.broadcast <- string(message) + } +} + +func (r *Room) broadcastPump() { + for message := range r.broadcast { + r.mutex.RLock() + for participant := range r.participants { + participant.send <- message + } + r.mutex.RUnlock() + } +} + +func (r *Room) removeParticipant(p *Participant) { + r.mutex.Lock() + delete(r.participants, p) + r.mutex.Unlock() + close(p.send) +} From 2ef1f0baba9c97db130722d99e70bb0c25c6b007 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Tue, 19 Nov 2024 12:31:23 +0300 Subject: [PATCH 32/43] feat: Add participant's names --- packages/relay/internal/http.go | 2 +- packages/relay/internal/websocket.go | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/relay/internal/http.go b/packages/relay/internal/http.go index fd1832d9..8d75321e 100644 --- a/packages/relay/internal/http.go +++ b/packages/relay/internal/http.go @@ -22,9 +22,9 @@ func InitHTTPEndpoint() { // Endpoints themselves httpMux.Handle("/", http.NotFoundHandler()) + httpMux.HandleFunc("/api/room/{roomName}", corsAnyHandler(websocketHandler)) httpMux.HandleFunc("/api/whip/{streamName}", corsAnyHandler(whipHandler)) httpMux.HandleFunc("/api/whep/{streamName}", corsAnyHandler(whepHandler)) - httpMux.HandleFunc("/room/{room}", corsAnyHandler(websocketHandler)) // Get our serving port port := GetRelayFlags().EndpointPort diff --git a/packages/relay/internal/websocket.go b/packages/relay/internal/websocket.go index 303f84ef..a914b17b 100644 --- a/packages/relay/internal/websocket.go +++ b/packages/relay/internal/websocket.go @@ -1,10 +1,12 @@ package relay import ( + "fmt" "log" "net/http" "sync" + "github.com/google/uuid" "github.com/gorilla/websocket" ) @@ -13,6 +15,7 @@ type Room struct { participants map[*Participant]bool broadcast chan string mutex sync.RWMutex + name string } // Participant represents a participant in a chat room @@ -20,6 +23,7 @@ type Participant struct { ws *websocket.Conn send chan string room *Room + name string } var upgrader = websocket.Upgrader{ @@ -31,20 +35,29 @@ var rooms = make(map[string]*Room) var mutex sync.RWMutex func websocketHandler(w http.ResponseWriter, r *http.Request) { - roomName := r.PathValue("room") + roomName := r.PathValue("roomName") if len(roomName) <= 0 { logHTTPError(w, "no stream name given", http.StatusBadRequest) return } + participantName := r.URL.Query().Get("name") + if participantName == "" { + participantName = uuid.New().String() + } + + log.Printf("New participant %s joining room %s\n", participantName, roomName) + mutex.Lock() room, ok := rooms[roomName] if !ok { room = &Room{ participants: make(map[*Participant]bool), broadcast: make(chan string), + name: roomName, } rooms[roomName] = room + log.Printf("Created new room %s\n", roomName) } mutex.Unlock() @@ -58,12 +71,15 @@ func websocketHandler(w http.ResponseWriter, r *http.Request) { ws: ws, send: make(chan string), room: room, + name: participantName, } room.mutex.Lock() room.participants[participant] = true room.mutex.Unlock() + log.Printf("Participant %s joined room %s\n", participantName, roomName) + go participant.writePump() go participant.readPump() go room.broadcastPump() @@ -90,12 +106,14 @@ func (p *Participant) readPump() { return } - p.room.broadcast <- string(message) + log.Printf("Participant %s sent message to room %s: %s\n", p.name, p.room.name, string(message)) + p.room.broadcast <- fmt.Sprintf("%s: %s", p.name, string(message)) } } func (r *Room) broadcastPump() { for message := range r.broadcast { + log.Printf("Broadcasting message to room %s: %s\n", r.name, message) r.mutex.RLock() for participant := range r.participants { participant.send <- message @@ -109,4 +127,5 @@ func (r *Room) removeParticipant(p *Participant) { delete(r.participants, p) r.mutex.Unlock() close(p.send) + log.Printf("Participant %s left room %s\n", p.name, r.name) } From 581f466d80c4ddfa718a63ccac8bacfd1306b114 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Tue, 19 Nov 2024 12:36:01 +0300 Subject: [PATCH 33/43] chore: Add styling to logs --- packages/relay/internal/websocket.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/relay/internal/websocket.go b/packages/relay/internal/websocket.go index a914b17b..992730ae 100644 --- a/packages/relay/internal/websocket.go +++ b/packages/relay/internal/websocket.go @@ -46,7 +46,7 @@ func websocketHandler(w http.ResponseWriter, r *http.Request) { participantName = uuid.New().String() } - log.Printf("New participant %s joining room %s\n", participantName, roomName) + log.Printf("> New participant %s joining room %s\n", participantName, roomName) mutex.Lock() room, ok := rooms[roomName] @@ -57,7 +57,7 @@ func websocketHandler(w http.ResponseWriter, r *http.Request) { name: roomName, } rooms[roomName] = room - log.Printf("Created new room %s\n", roomName) + log.Printf("> Created new room %s\n", roomName) } mutex.Unlock() @@ -78,7 +78,7 @@ func websocketHandler(w http.ResponseWriter, r *http.Request) { room.participants[participant] = true room.mutex.Unlock() - log.Printf("Participant %s joined room %s\n", participantName, roomName) + log.Printf("> Participant %s joined room %s\n", participantName, roomName) go participant.writePump() go participant.readPump() @@ -106,14 +106,14 @@ func (p *Participant) readPump() { return } - log.Printf("Participant %s sent message to room %s: %s\n", p.name, p.room.name, string(message)) + log.Printf("> Participant %s sent message to room %s >>>> %s\n", p.name, p.room.name, string(message)) p.room.broadcast <- fmt.Sprintf("%s: %s", p.name, string(message)) } } func (r *Room) broadcastPump() { for message := range r.broadcast { - log.Printf("Broadcasting message to room %s: %s\n", r.name, message) + log.Printf("> Broadcasting message to room %s: %s\n", r.name, message) r.mutex.RLock() for participant := range r.participants { participant.send <- message @@ -127,5 +127,5 @@ func (r *Room) removeParticipant(p *Participant) { delete(r.participants, p) r.mutex.Unlock() close(p.send) - log.Printf("Participant %s left room %s\n", p.name, r.name) + log.Printf("> Participant %s left room %s\n", p.name, r.name) } From 4d9b9414a5d79794b1e04e7dee701855d2198cb0 Mon Sep 17 00:00:00 2001 From: Wanjohi Date: Tue, 19 Nov 2024 13:00:47 +0300 Subject: [PATCH 34/43] feat: Add msg types --- packages/relay/internal/websocket.go | 42 ++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/relay/internal/websocket.go b/packages/relay/internal/websocket.go index 992730ae..4a13583e 100644 --- a/packages/relay/internal/websocket.go +++ b/packages/relay/internal/websocket.go @@ -1,7 +1,7 @@ package relay import ( - "fmt" + "encoding/json" "log" "net/http" "sync" @@ -18,6 +18,12 @@ type Room struct { name string } +// Message represents a message sent by a participant +type Message struct { + Type string `json:"type"` + Data string `json:"data"` +} + // Participant represents a participant in a chat room type Participant struct { ws *websocket.Conn @@ -29,6 +35,9 @@ type Participant struct { var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, + CheckOrigin: func(r *http.Request) bool { + return true + }, } var rooms = make(map[string]*Room) @@ -107,7 +116,23 @@ func (p *Participant) readPump() { } log.Printf("> Participant %s sent message to room %s >>>> %s\n", p.name, p.room.name, string(message)) - p.room.broadcast <- fmt.Sprintf("%s: %s", p.name, string(message)) + + var msg Message + err = json.Unmarshal(message, &msg) + if err != nil { + log.Println(err) + p.room.broadcast <- string(message) + continue + } + + switch msg.Type { + case "input": + p.room.sendMessageToParticipant("server", string(message)) + case "docker": + p.room.sendMessageToParticipant("master", string(message)) + default: + p.room.broadcast <- string(message) + } } } @@ -129,3 +154,16 @@ func (r *Room) removeParticipant(p *Participant) { close(p.send) log.Printf("> Participant %s left room %s\n", p.name, r.name) } + +func (r *Room) sendMessageToParticipant(name string, message string) { + r.mutex.RLock() + for participant := range r.participants { + if participant.name == name { + participant.send <- message + log.Printf("Sent message to participant %s in room %s: %s\n", name, r.name, message) + return + } + } + r.mutex.RUnlock() + log.Printf("Participant %s not found in room %s\n", name, r.name) +} From 8bc770fd18537dbc260102499071bf3984e6aafb Mon Sep 17 00:00:00 2001 From: Wanjohi <71614375+wanjohiryan@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:37:43 +0300 Subject: [PATCH 35/43] =?UTF-8?q?=E2=9C=A8=20feat:=20Add=20rooms=20and=20u?= =?UTF-8?q?se=20`WebRTC=20DataChannel`=20for=20input=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds functionality to: 1. Broadcast input to the server using WebRTC Data Channels 2. Change some terms for easy understanding `stream -> room`, `viewer => participant` 3. Remove input functionality currently relying on Cloudflare's D3 and move it to our relay --------- Co-authored-by: Kristian Ollikainen <14197772+DatCaptainHorse@users.noreply.github.com> Co-authored-by: DatCaptainHorse --- Cargo.lock | 1896 +++++++++++++---- Cargo.toml | 10 +- Containerfile.relay | 6 +- Containerfile.runner | 2 +- apps/www/package.json | 1 - apps/www/src/routes/play/[id]/index.tsx | 59 +- apps/www/tsconfig.json | 2 +- bun.lockb | Bin 808008 -> 803088 bytes package.json | 8 +- packages/input/src/index.ts | 3 +- packages/input/src/keyboard.ts | 12 +- packages/input/src/mouse.ts | 12 +- .../input/src}/webrtc-stream.ts | 34 +- packages/party/.gitignore | 1 - packages/party/index.ts | 32 - packages/party/package.json | 7 - packages/relay/dev/Cargo.toml | 16 + packages/relay/dev/Containerfile | 11 + packages/relay/dev/server.sh | 17 + packages/relay/dev/src/main.rs | 11 + packages/relay/dev/src/room.rs | 292 +++ packages/relay/go.mod | 20 +- packages/relay/go.sum | 26 +- packages/relay/internal/common.go | 41 +- packages/relay/internal/flags.go | 12 +- packages/relay/internal/http.go | 319 +-- packages/relay/internal/participant.go | 38 + packages/relay/internal/room.go | 65 + packages/relay/internal/websocket.go | 169 -- packages/relay/internal/whep.go | 173 ++ packages/relay/internal/whip.go | 161 ++ packages/relay/main.go | 4 +- packages/server/Cargo.toml | 13 +- packages/server/src/args.rs | 1 + packages/server/src/main.rs | 270 +-- packages/server/src/room.rs | 335 +++ partykit.json | 6 - 37 files changed, 2731 insertions(+), 1354 deletions(-) rename {apps/www/src/routes/play => packages/input/src}/webrtc-stream.ts (55%) delete mode 100644 packages/party/.gitignore delete mode 100644 packages/party/index.ts delete mode 100644 packages/party/package.json create mode 100644 packages/relay/dev/Cargo.toml create mode 100644 packages/relay/dev/Containerfile create mode 100755 packages/relay/dev/server.sh create mode 100644 packages/relay/dev/src/main.rs create mode 100644 packages/relay/dev/src/room.rs create mode 100644 packages/relay/internal/participant.go create mode 100644 packages/relay/internal/room.go delete mode 100644 packages/relay/internal/websocket.go create mode 100644 packages/relay/internal/whep.go create mode 100644 packages/relay/internal/whip.go create mode 100644 packages/server/src/room.rs delete mode 100644 partykit.json diff --git a/Cargo.lock b/Cargo.lock index 87cfead0..62eee052 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,326 +3,236 @@ version = 3 [[package]] -name = "actix-codec" -version = "0.5.2" +name = "addr2line" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-sink", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util", - "tracing", + "gimli", ] [[package]] -name = "actix-http" -version = "3.9.0" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "ahash", - "base64", - "bitflags", - "brotli", - "bytes", - "bytestring", - "derive_more 0.99.18", - "encoding_rs", - "flate2", - "futures-core", - "h2", - "http 0.2.12", - "httparse", - "httpdate", - "itoa", - "language-tags", - "local-channel", - "mime", - "percent-encoding", - "pin-project-lite", - "rand", - "sha1", - "smallvec", - "tokio", - "tokio-util", - "tracing", - "zstd", -] +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] -name = "actix-macros" -version = "0.2.4" +name = "aead" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ - "quote", - "syn", + "crypto-common", + "generic-array", ] [[package]] -name = "actix-router" -version = "0.5.3" +name = "aes" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ - "bytestring", "cfg-if", - "http 0.2.12", - "regex", - "regex-lite", - "serde", - "tracing", + "cipher", + "cpufeatures", ] [[package]] -name = "actix-rt" -version = "2.10.0" +name = "aes-gcm" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" dependencies = [ - "futures-core", - "tokio", + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", ] [[package]] -name = "actix-server" -version = "2.5.0" +name = "aho-corasick" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "futures-util", - "mio", - "socket2", - "tokio", - "tracing", + "memchr", ] [[package]] -name = "actix-service" -version = "2.0.2" +name = "android-tzdata" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" -dependencies = [ - "futures-core", - "paste", - "pin-project-lite", -] +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[package]] -name = "actix-utils" -version = "3.0.1" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "local-waker", - "pin-project-lite", + "libc", ] [[package]] -name = "actix-web" -version = "4.9.0" +name = "anstream" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ - "actix-codec", - "actix-http", - "actix-macros", - "actix-router", - "actix-rt", - "actix-server", - "actix-service", - "actix-utils", - "actix-web-codegen", - "ahash", - "bytes", - "bytestring", - "cfg-if", - "cookie", - "derive_more 0.99.18", - "encoding_rs", - "futures-core", - "futures-util", - "impl-more", - "itoa", - "language-tags", - "log", - "mime", - "once_cell", - "pin-project-lite", - "regex", - "regex-lite", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "socket2", - "time", - "url", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", ] [[package]] -name = "actix-web-codegen" -version = "4.3.0" +name = "anstyle" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" -dependencies = [ - "actix-router", - "proc-macro2", - "quote", - "syn", -] +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] -name = "actix-ws" -version = "0.3.0" +name = "anstyle-parse" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a1fb4f9f2794b0aadaf2ba5f14a6f034c7e86957b458c506a8cb75953f2d99" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ - "actix-codec", - "actix-http", - "actix-web", - "bytestring", - "futures-core", - "tokio", + "utf8parse", ] [[package]] -name = "addr2line" -version = "0.24.2" +name = "anstyle-query" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "gimli", + "windows-sys 0.59.0", ] [[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" +name = "anstyle-wincon" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", + "anstyle", + "windows-sys 0.59.0", ] [[package]] -name = "aho-corasick" -version = "1.1.3" +name = "anyhow" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" dependencies = [ - "memchr", + "backtrace", ] [[package]] -name = "alloc-no-stdlib" -version = "2.0.4" +name = "arc-swap" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] -name = "alloc-stdlib" -version = "0.2.2" +name = "asn1-rs" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" dependencies = [ - "alloc-no-stdlib", + "asn1-rs-derive 0.4.0", + "asn1-rs-impl 0.1.0", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.66", ] [[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" +name = "asn1-rs" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" dependencies = [ - "libc", + "asn1-rs-derive 0.5.1", + "asn1-rs-impl 0.2.0", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 1.0.66", + "time", ] [[package]] -name = "anstream" -version = "0.6.17" +name = "asn1-rs-derive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", ] [[package]] -name = "anstyle" -version = "1.0.10" +name = "asn1-rs-derive" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure 0.13.1", +] [[package]] -name = "anstyle-parse" -version = "0.2.6" +name = "asn1-rs-impl" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "utf8parse", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "anstyle-query" -version = "1.1.2" +name = "asn1-rs-impl" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ - "windows-sys 0.59.0", + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] -name = "anstyle-wincon" -version = "3.0.6" +name = "async-trait" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "anstyle", - "windows-sys 0.59.0", + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] -name = "anyhow" -version = "1.0.92" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" -dependencies = [ - "backtrace", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atomic_refcell" @@ -349,9 +259,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" +checksum = "fe7c2840b66236045acd2607d5866e274380afd87ef99d6226e961e2cb47df45" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -361,9 +271,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" +checksum = "ad3a619a9de81e1d7de1f1186dcba4506ed661a0e483d84410fdef0ee87b2f96" dependencies = [ "bindgen", "cc", @@ -389,19 +299,46 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bindgen" version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -414,10 +351,16 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn", + "syn 2.0.87", "which", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" @@ -434,24 +377,12 @@ dependencies = [ ] [[package]] -name = "brotli" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "4.0.1" +name = "block-padding" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", + "generic-array", ] [[package]] @@ -473,12 +404,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] -name = "bytestring" -version = "1.3.1" +name = "cbc" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" dependencies = [ - "bytes", + "cipher", ] [[package]] @@ -492,6 +423,18 @@ dependencies = [ "shlex", ] +[[package]] +name = "ccm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae3c82e4355234767756212c570e29833699ab63e6ffd161887314cc5b43847" +dependencies = [ + "aead", + "cipher", + "ctr", + "subtle", +] + [[package]] name = "cesu8" version = "1.1.0" @@ -509,9 +452,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c" +checksum = "c360837f8f19e2e4468275138f1c0dec1647d1e17bb7c0215fe3cd7530e93c25" dependencies = [ "smallvec", "target-lexicon", @@ -542,6 +485,16 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -555,9 +508,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -565,9 +518,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -584,14 +537,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "cmake" @@ -619,21 +572,10 @@ dependencies = [ ] [[package]] -name = "convert_case" -version = "0.4.0" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "cookie" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "core-foundation" @@ -661,12 +603,30 @@ dependencies = [ ] [[package]] -name = "crc32fast" -version = "1.4.2" +name = "crc" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ - "cfg-if", + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", ] [[package]] @@ -676,9 +636,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "rand_core", "typenum", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "darling" version = "0.20.10" @@ -700,7 +696,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.87", ] [[package]] @@ -711,7 +707,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -721,26 +717,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] -name = "deranged" -version = "0.3.11" +name = "der" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ - "powerfmt", - "serde", + "const-oid", + "pem-rfc7468", + "zeroize", ] [[package]] -name = "derive_more" -version = "0.99.18" +name = "der-parser" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn", + "asn1-rs 0.5.2", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs 0.6.2", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", ] [[package]] @@ -760,10 +781,21 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", "unicode-xid", ] +[[package]] +name = "dev" +version = "0.1.0" +dependencies = [ + "reqwest", + "serde", + "serde_json", + "tokio", + "webrtc", +] + [[package]] name = "digest" version = "0.10.7" @@ -771,7 +803,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -782,7 +816,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -791,12 +825,47 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -842,15 +911,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] -name = "flate2" -version = "1.0.34" +name = "ff" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "crc32fast", - "miniz_oxide", + "rand_core", + "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "fnv" version = "1.0.7" @@ -943,7 +1018,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -984,6 +1059,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -993,8 +1069,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", ] [[package]] @@ -1005,11 +1093,11 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio-sys" -version = "0.20.5" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "217f464cad5946ae4369c355155e2d16b488c08920601083cb4891e352ae777b" +checksum = "b965df6f3534c84816b5c1a7d9efcb5671ae790822de5abe8e299797039529bc" dependencies = [ - "glib-sys 0.20.5", + "glib-sys 0.20.6", "gobject-sys 0.20.4", "libc", "system-deps", @@ -1019,7 +1107,7 @@ dependencies = [ [[package]] name = "gio-sys" version = "0.21.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#804440607521c86ade677759e2865cf74793ed41" dependencies = [ "glib-sys 0.21.0", "gobject-sys 0.21.0", @@ -1030,19 +1118,19 @@ dependencies = [ [[package]] name = "glib" -version = "0.20.5" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358431b0e0eb15b9d02db52e1f19c805b953c5c168099deb3de88beab761768c" +checksum = "86bd3e4ee7998ab5a135d900db56930cc19ad16681adf245daff54f618b9d5e1" dependencies = [ - "bitflags", + "bitflags 2.6.0", "futures-channel", "futures-core", "futures-executor", "futures-task", "futures-util", - "gio-sys 0.20.5", + "gio-sys 0.20.6", "glib-macros 0.20.5", - "glib-sys 0.20.5", + "glib-sys 0.20.6", "gobject-sys 0.20.4", "libc", "memchr", @@ -1052,9 +1140,9 @@ dependencies = [ [[package]] name = "glib" version = "0.21.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#804440607521c86ade677759e2865cf74793ed41" dependencies = [ - "bitflags", + "bitflags 2.6.0", "futures-channel", "futures-core", "futures-executor", @@ -1079,26 +1167,26 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] name = "glib-macros" version = "0.21.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#804440607521c86ade677759e2865cf74793ed41" dependencies = [ "heck", "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] name = "glib-sys" -version = "0.20.5" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a5911863ab7ecd4a6f8d5976f12eeba076b23669c49b066d877e742544aa389" +checksum = "3d0b1827e8621fc42c0dfb228e5d57ff6a71f9699e666ece8113f979ad87c2de" dependencies = [ "libc", "system-deps", @@ -1107,7 +1195,7 @@ dependencies = [ [[package]] name = "glib-sys" version = "0.21.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#804440607521c86ade677759e2865cf74793ed41" dependencies = [ "libc", "system-deps", @@ -1125,7 +1213,7 @@ version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c674d2ff8478cf0ec29d2be730ed779fef54415a2fb4b565c52def62696462" dependencies = [ - "glib-sys 0.20.5", + "glib-sys 0.20.6", "libc", "system-deps", ] @@ -1133,13 +1221,24 @@ dependencies = [ [[package]] name = "gobject-sys" version = "0.21.0" -source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#e6542785e9b78532a776e299a02b26ba12fc66ca" +source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#804440607521c86ade677759e2865cf74793ed41" dependencies = [ "glib-sys 0.21.0", "libc", "system-deps", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + [[package]] name = "gst-plugin-version-helper" version = "0.8.2" @@ -1160,7 +1259,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "glib 0.20.5", + "glib 0.20.6", "gstreamer-sys 0.23.3", "itertools 0.13.0", "libc", @@ -1172,13 +1271,13 @@ dependencies = [ "paste", "pin-project-lite", "smallvec", - "thiserror", + "thiserror 1.0.66", ] [[package]] name = "gstreamer" version = "0.24.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs#79440636c20fda575e1eb86448951cb87572e879" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs#9c386085e3799a4dd4670f5e4cea337ace0a7daf" dependencies = [ "cfg-if", "futures-channel", @@ -1187,6 +1286,7 @@ dependencies = [ "glib 0.21.0", "gstreamer-sys 0.24.0", "itertools 0.13.0", + "kstring", "libc", "muldiv", "num-integer", @@ -1195,7 +1295,7 @@ dependencies = [ "paste", "pin-project-lite", "smallvec", - "thiserror", + "thiserror 2.0.3", ] [[package]] @@ -1206,7 +1306,7 @@ checksum = "a11df90e3abf1d9747111c41902338fc1bd13b1c23b27fb828d43e57bd190134" dependencies = [ "atomic_refcell", "cfg-if", - "glib 0.20.5", + "glib 0.20.6", "gstreamer 0.23.3", "gstreamer-base-sys", "libc", @@ -1218,7 +1318,7 @@ version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d691b2bb51a9e5727fb33c3b53fb64ee5b80c40cbbd250941a6d44b142f7a6a0" dependencies = [ - "glib-sys 0.20.5", + "glib-sys 0.20.6", "gobject-sys 0.20.4", "gstreamer-sys 0.23.3", "libc", @@ -1231,7 +1331,7 @@ version = "0.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db89964774a97d5b092e2d124debc6bbcaf34b5c7cdef1759f4a9e1e3f8326ef" dependencies = [ - "glib-sys 0.20.5", + "glib-sys 0.20.6", "gobject-sys 0.20.4", "libc", "system-deps", @@ -1240,8 +1340,9 @@ dependencies = [ [[package]] name = "gstreamer-sys" version = "0.24.0" -source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs#79440636c20fda575e1eb86448951cb87572e879" +source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs#9c386085e3799a4dd4670f5e4cea337ace0a7daf" dependencies = [ + "cfg-if", "glib-sys 0.21.0", "gobject-sys 0.21.0", "libc", @@ -1250,16 +1351,16 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", - "http 0.2.12", + "http", "indexmap 2.6.0", "slab", "tokio", @@ -1306,6 +1407,24 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "home" version = "0.5.9" @@ -1317,9 +1436,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.12" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -1327,27 +1446,33 @@ dependencies = [ ] [[package]] -name = "http" -version = "1.1.0" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "fnv", - "itoa", + "http", ] [[package]] -name = "httparse" -version = "1.9.5" +name = "http-body-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] [[package]] -name = "httpdate" -version = "1.0.3" +name = "httparse" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "humantime" @@ -1355,6 +1480,78 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +[[package]] +name = "hyper" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -1493,7 +1690,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1523,12 +1720,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "impl-more" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" - [[package]] name = "indexmap" version = "1.9.3" @@ -1551,6 +1742,42 @@ dependencies = [ "serde", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "interceptor" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4705c00485029e738bea8c9505b5ddb1486a8f3627a953e1e77e6abdf5eef90c" +dependencies = [ + "async-trait", + "bytes", + "log", + "portable-atomic", + "rand", + "rtcp", + "rtp", + "thiserror 1.0.66", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -1591,7 +1818,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.66", "walkdir", ] @@ -1620,10 +1847,13 @@ dependencies = [ ] [[package]] -name = "language-tags" -version = "0.3.2" +name = "kstring" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" +checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" +dependencies = [ + "static_assertions", +] [[package]] name = "lazy_static" @@ -1665,23 +1895,6 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" -[[package]] -name = "local-channel" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" -dependencies = [ - "futures-core", - "futures-sink", - "local-waker", -] - -[[package]] -name = "local-waker" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" - [[package]] name = "lock_api" version = "0.4.12" @@ -1707,12 +1920,31 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -1742,7 +1974,6 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", - "log", "wasi", "windows-sys 0.52.0", ] @@ -1756,7 +1987,7 @@ checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" [[package]] name = "moq-gst" version = "0.1.1" -source = "git+https://github.com/wanjohiryan/moq-gst?branch=main#1ad9113e26b6c974848ffd77f17ca0c8d8587b45" +source = "git+https://github.com/wanjohiryan/moq-gst?branch=main#d6f0241fd8428c06a7be3529d982b654290badc5" dependencies = [ "anyhow", "env_logger", @@ -1772,25 +2003,22 @@ dependencies = [ [[package]] name = "moq-karp" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c84b42dbdc0414b8a22f6521bbaa0fefa4913d393206803c40991d915f9e95" +checksum = "db567f26b7ef7ad5d457aabb7871fa1479bcbe47aa96fd13e542b1a38cbe4470" dependencies = [ - "anyhow", "bytes", - "clap", - "derive_more 1.0.0", + "derive_more", "futures", "hex", "lazy_static", - "moq-native", "moq-transfork", "mp4-atom", "regex", "serde", "serde_json", "serde_with", - "thiserror", + "thiserror 1.0.66", "tokio", "tracing", "url", @@ -1828,7 +2056,7 @@ checksum = "f7bca71d1b85893f79ffc0dd9f1f25627019879ec6ae6cff398954862859f34a" dependencies = [ "bytes", "futures", - "thiserror", + "thiserror 1.0.66", "tokio", "tracing", "wasm-bindgen-futures", @@ -1844,7 +2072,7 @@ dependencies = [ "bytes", "num", "paste", - "thiserror", + "thiserror 1.0.66", "tokio", "tracing", ] @@ -1876,14 +2104,14 @@ dependencies = [ name = "nestri-server" version = "0.1.0" dependencies = [ - "actix-web", - "actix-ws", "clap", "futures-util", "gstreamer 0.24.0", "moq-gst", "rand", "regex", + "reqwest", + "rustls", "serde", "serde_json", "tokio", @@ -1891,6 +2119,20 @@ dependencies = [ "tracing", "tracing-subscriber", "url", + "webrtc", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", + "pin-utils", ] [[package]] @@ -2001,19 +2243,34 @@ dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs 0.6.2", +] + [[package]] name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + [[package]] name = "openssl" version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -2030,7 +2287,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2066,6 +2323,30 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "parking_lot" version = "0.12.3" @@ -2095,6 +2376,25 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -2113,12 +2413,40 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + [[package]] name = "powerfmt" version = "0.2.0" @@ -2141,7 +2469,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.87", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", ] [[package]] @@ -2164,9 +2501,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -2175,27 +2512,30 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror", + "thiserror 2.0.3", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", "rustc-hash 2.0.0", "rustls", + "rustls-pki-types", "rustls-platform-verifier", "slab", - "thiserror", + "thiserror 2.0.3", "tinyvec", "tracing", + "web-time", ] [[package]] @@ -2251,13 +2591,27 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rcgen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54077e1872c46788540de1ea3d7f4ccb1983d12f9aa909b234468676c1a36779" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "x509-parser", + "yasna", +] + [[package]] name = "redox_syscall" version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] @@ -2292,12 +2646,6 @@ dependencies = [ "regex-syntax 0.8.5", ] -[[package]] -name = "regex-lite" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" - [[package]] name = "regex-syntax" version = "0.6.29" @@ -2310,6 +2658,59 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "reqwest" +version = "0.12.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.8" @@ -2325,6 +2726,31 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rtcp" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc9f775ff89c5fe7f0cc0abafb7c57688ae25ce688f1a52dd88e277616c76ab2" +dependencies = [ + "bytes", + "thiserror 1.0.66", + "webrtc-util", +] + +[[package]] +name = "rtp" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6870f09b5db96f8b9e7290324673259fd15519ebb7d55acf8e7eb044a9ead6af" +dependencies = [ + "bytes", + "portable-atomic", + "rand", + "serde", + "thiserror 1.0.66", + "webrtc-util", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -2352,13 +2778,22 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -2367,9 +2802,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" dependencies = [ "aws-lc-rs", "log", @@ -2421,12 +2856,15 @@ name = "rustls-pki-types" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-platform-verifier" -version = "0.3.4" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +checksum = "a4c7dc240fec5517e6c4eab3310438636cfe6391dfc345ba013109909a90d136" dependencies = [ "core-foundation", "core-foundation-sys", @@ -2439,8 +2877,8 @@ dependencies = [ "rustls-webpki", "security-framework", "security-framework-sys", - "webpki-roots", - "winapi", + "webpki-root-certs", + "windows-sys 0.52.0", ] [[package]] @@ -2491,13 +2929,39 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sdp" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13254db766b17451aced321e7397ebf0a446ef0c8d2942b6e67a95815421093f" +dependencies = [ + "rand", + "substring", + "thiserror 1.0.66", + "url", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -2523,29 +2987,29 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -2580,7 +3044,7 @@ version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", @@ -2601,7 +3065,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2615,6 +3079,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2639,6 +3114,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "slab" version = "0.4.9" @@ -2654,6 +3139,15 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + [[package]] name = "socket2" version = "0.5.7" @@ -2670,24 +3164,79 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "stun" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28fad383a1cc63ae141e84e48eaef44a1063e9d9e55bcb8f51a99b886486e01b" +dependencies = [ + "base64 0.21.7", + "crc", + "lazy_static", + "md-5", + "rand", + "ring", + "subtle", + "thiserror 1.0.66", + "tokio", + "url", + "webrtc-util", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.87" @@ -2699,6 +3248,27 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + [[package]] name = "synstructure" version = "0.13.1" @@ -2707,7 +3277,28 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -2757,7 +3348,16 @@ version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.66", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", ] [[package]] @@ -2768,7 +3368,18 @@ checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] @@ -2839,9 +3450,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -2863,7 +3474,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2876,6 +3487,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-tungstenite" version = "0.24.0" @@ -2937,6 +3559,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.40" @@ -2957,7 +3585,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2999,6 +3627,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tungstenite" version = "0.24.0" @@ -3008,16 +3642,37 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.1.0", + "http", "httparse", "log", "native-tls", "rand", "sha1", - "thiserror", + "thiserror 1.0.66", "utf-8", ] +[[package]] +name = "turn" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b000cebd930420ac1ed842c8128e3b3412512dfd5b82657eab035a3f5126acc" +dependencies = [ + "async-trait", + "base64 0.21.7", + "futures", + "log", + "md-5", + "portable-atomic", + "rand", + "ring", + "stun", + "thiserror 1.0.66", + "tokio", + "tokio-util", + "webrtc-util", +] + [[package]] name = "typenum" version = "1.17.0" @@ -3036,6 +3691,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + [[package]] name = "untrusted" version = "0.9.0" @@ -3077,6 +3742,15 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", +] + [[package]] name = "valuable" version = "0.1.0" @@ -3101,6 +3775,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -3111,6 +3794,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -3139,7 +3831,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -3173,7 +3865,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3194,6 +3886,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-transport" version = "0.6.2" @@ -3201,7 +3903,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a55e06e224351ec132a7acbbbd66375380a38dbf9376be23f4d623d6e8591e7" dependencies = [ "bytes", - "thiserror", + "thiserror 1.0.66", "web-transport-quinn", "web-transport-wasm", ] @@ -3213,8 +3915,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a3806ea43df5817f0d90618c842d28db5946bc18a5db0659b2275c2be48d472" dependencies = [ "bytes", - "http 1.1.0", - "thiserror", + "http", + "thiserror 1.0.66", "url", ] @@ -3226,11 +3928,11 @@ checksum = "3020b51cda10472a365e42d9a701916d4f04d74cc743de08246ef6a421c2d137" dependencies = [ "bytes", "futures", - "http 1.1.0", + "http", "log", "quinn", "quinn-proto", - "thiserror", + "thiserror 1.0.66", "tokio", "url", "web-transport-proto", @@ -3244,7 +3946,7 @@ checksum = "972d6ef19b807640a81eb5a7979f9d520fa99bf28c091654053b0a4dce1fc62a" dependencies = [ "bytes", "js-sys", - "thiserror", + "thiserror 1.0.66", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -3262,14 +3964,223 @@ dependencies = [ ] [[package]] -name = "webpki-roots" +name = "webpki-root-certs" version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "e8c6dfa3ac045bc517de14c7b1384298de1dbd229d38e08e169d9ae8c170937c" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "webrtc" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b3a840e31c969844714f93b5a87e73ee49f3bc2a4094ab9132c69497eb31db" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "cfg-if", + "hex", + "interceptor", + "lazy_static", + "log", + "portable-atomic", + "rand", + "rcgen", + "regex", + "ring", + "rtcp", + "rtp", + "rustls", + "sdp", + "serde", + "serde_json", + "sha2", + "smol_str", + "stun", + "thiserror 1.0.66", + "time", + "tokio", + "turn", + "url", + "waitgroup", + "webrtc-data", + "webrtc-dtls", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-data" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b7c550f8d35867b72d511640adf5159729b9692899826fe00ba7fa74f0bf70" +dependencies = [ + "bytes", + "log", + "portable-atomic", + "thiserror 1.0.66", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-dtls" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e5eedbb0375aa04da93fc3a189b49ed3ed9ee844b6997d5aade14fc3e2c26e" +dependencies = [ + "aes", + "aes-gcm", + "async-trait", + "bincode", + "byteorder", + "cbc", + "ccm", + "der-parser 8.2.0", + "hkdf", + "hmac", + "log", + "p256", + "p384", + "portable-atomic", + "rand", + "rand_core", + "rcgen", + "ring", + "rustls", + "sec1", + "serde", + "sha1", + "sha2", + "subtle", + "thiserror 1.0.66", + "tokio", + "webrtc-util", + "x25519-dalek", + "x509-parser", +] + +[[package]] +name = "webrtc-ice" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4f0ca6d4df8d1bdd34eece61b51b62540840b7a000397bcfb53a7bfcf347c8" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "portable-atomic", + "rand", + "serde", + "serde_json", + "stun", + "thiserror 1.0.66", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0804694f3b2acfdff48f6df217979b13cb0a00377c63b5effd111daaee7e8c4" +dependencies = [ + "log", + "socket2", + "thiserror 1.0.66", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c15b20e98167b22949abc1c20eca7c6d814307d187068fe7a48f0b87a4f6d46" +dependencies = [ + "byteorder", + "bytes", + "rand", + "rtp", + "thiserror 1.0.66", +] + +[[package]] +name = "webrtc-sctp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d850daa68639b9d7bb16400676e97525d1e52b15b4928240ae2ba0e849817a5" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "portable-atomic", + "rand", + "thiserror 1.0.66", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbec5da43a62c228d321d93fb12cc9b4d9c03c9b736b0c215be89d8bd0774cfe" +dependencies = [ + "aead", + "aes", + "aes-gcm", + "byteorder", + "bytes", + "ctr", + "hmac", + "log", + "rtcp", + "rtp", + "sha1", + "subtle", + "thiserror 1.0.66", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc8d9bc631768958ed97b8d68b5d301e63054ae90b09083d43e2fefb939fd77e" +dependencies = [ + "async-trait", + "bitflags 1.3.2", + "bytes", + "ipnet", + "lazy_static", + "libc", + "log", + "nix", + "portable-atomic", + "rand", + "thiserror 1.0.66", + "tokio", + "winapi", +] + [[package]] name = "which" version = "4.4.2" @@ -3322,6 +4233,36 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -3425,6 +4366,45 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "x25519-dalek" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" +dependencies = [ + "curve25519-dalek", + "rand_core", + "serde", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs 0.6.2", + "data-encoding", + "der-parser 9.0.0", + "lazy_static", + "nom", + "oid-registry", + "ring", + "rusticata-macros", + "thiserror 1.0.66", + "time", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + [[package]] name = "yoke" version = "0.7.4" @@ -3445,8 +4425,8 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.87", + "synstructure 0.13.1", ] [[package]] @@ -3467,7 +4447,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -3487,8 +4467,8 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn", - "synstructure", + "syn 2.0.87", + "synstructure 0.13.1", ] [[package]] @@ -3496,6 +4476,20 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] [[package]] name = "zerovec" @@ -3516,33 +4510,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "zstd" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" -dependencies = [ - "cc", - "pkg-config", + "syn 2.0.87", ] diff --git a/Cargo.toml b/Cargo.toml index 87246208..c2e11031 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,15 @@ [workspace] resolver = "2" -members = [ - "packages/server" +members = [ + "packages/server", + "packages/relay/dev" ] [workspace.package] version = "0.1.0-alpha.1" repository = "https://github.com/nestriness/nestri" edition = "2021" -rust-version = "1.80" \ No newline at end of file +rust-version = "1.80" + +[workspace.dependencies] +gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", version = "0.24.0" } diff --git a/Containerfile.relay b/Containerfile.relay index 587ef6c9..7fda0ba7 100644 --- a/Containerfile.relay +++ b/Containerfile.relay @@ -4,8 +4,8 @@ COPY packages/webrtc-relay/ /builder/ RUN go build FROM docker.io/golang:1.23-alpine -COPY --from=go-build /builder/webrtcrelay /webrtcrelay/webrtcrelay -WORKDIR /webrtcrelay +COPY --from=go-build /builder/relay /relay/relay +WORKDIR /relay # ENV flags ENV VERBOSE=false @@ -17,4 +17,4 @@ ENV STUN_SERVER="stun.l.google.com:19302" EXPOSE $ENDPOINT_PORT EXPOSE $WEBRTC_UDP_START-$WEBRTC_UDP_END/udp -ENTRYPOINT ["/webrtcrelay/webrtcrelay"] \ No newline at end of file +ENTRYPOINT ["/relay/relay"] \ No newline at end of file diff --git a/Containerfile.runner b/Containerfile.runner index 42dcb8d4..cf37f689 100644 --- a/Containerfile.runner +++ b/Containerfile.runner @@ -14,7 +14,7 @@ RUN pacman -Syu --noconfirm meson pkgconf cmake git gcc make rustup \ # Setup stable rust toolchain # RUN rustup default stable # Clone nestri source # -RUN git clone -b feat/stream https://github.com/nestriness/nestri.git +RUN git clone -b feat/rooms https://github.com/nestriness/nestri.git # Build nestri # RUN cd nestri/packages/server/ && \ diff --git a/apps/www/package.json b/apps/www/package.json index a39ea727..b26b616b 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -46,7 +46,6 @@ "@typescript-eslint/parser": "7.16.1", "eslint": "8.57.0", "eslint-plugin-qwik": "^1.8.0", - "partysocket": "^1.0.2", "prettier": "3.3.3", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/apps/www/src/routes/play/[id]/index.tsx b/apps/www/src/routes/play/[id]/index.tsx index 66e6607d..d1b398e6 100644 --- a/apps/www/src/routes/play/[id]/index.tsx +++ b/apps/www/src/routes/play/[id]/index.tsx @@ -1,8 +1,6 @@ -import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; import { useLocation } from "@builder.io/qwik-city"; -import PartySocket from "partysocket"; -import {Keyboard, Mouse} from "@nestri/input" -import {WebRTCStream} from "../webrtc-stream" +import {Keyboard, Mouse, WebRTCStream} from "@nestri/input" +import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; export default component$(() => { const id = useLocation().params.id; @@ -11,45 +9,15 @@ export default component$(() => { useVisibleTask$(({ track }) => { track(() => canvas.value); - const ws = new PartySocket({ - host: "https://nestri-party.datcaptainhorse.partykit.dev", // or localhost:1999 in dev - room: id, - }); - if (!canvas.value) return; // Ensure canvas is available - document.addEventListener("pointerlockchange", (e) => { - if (!canvas.value) return; // Ensure canvas is available - // @ts-ignore - if (document.pointerLockElement && !window.nestrimouse && !window.nestrikeyboard) { - // @ts-ignore - window.nestrimouse = new Mouse({canvas: canvas.value, ws}, false); //< TODO: Make absolute mode toggleable, for now feels better? - // @ts-ignore - window.nestrikeyboard = new Keyboard({canvas: canvas.value, ws}); - // @ts-ignore - } else if (!document.pointerLockElement && window.nestrimouse && window.nestrikeyboard) { - // @ts-ignore - window.nestrimouse.dispose(); - // @ts-ignore - window.nestrimouse = undefined; - // @ts-ignore - window.nestrikeyboard.dispose(); - // @ts-ignore - window.nestrikeyboard = undefined; - } - }); - - ws.onmessage = (msg) => { - console.log(msg.data) - } - // Create video element and make it output to canvas (TODO: improve this) let video = document.getElementById("webrtc-video-player"); if (!video) { video = document.createElement("video"); video.id = "stream-video-player"; video.style.visibility = "hidden"; - const webrtc = new WebRTCStream("https://relay.dathorse.com"); // or http://localhost:8088 + const webrtc = new WebRTCStream("http://localhost:8088"); // or http://localhost:8088 webrtc.connect(id).then(() => { const mediaStream = webrtc.getMediaStream(); console.log("Setting mediastream"); @@ -85,6 +53,27 @@ export default component$(() => { requestAnimationFrame(renderer); } }); + + document.addEventListener("pointerlockchange", (e) => { + if (!canvas.value) return; // Ensure canvas is available + // @ts-ignore + if (document.pointerLockElement && !window.nestrimouse && !window.nestrikeyboard) { + // @ts-ignore + window.nestrimouse = new Mouse({canvas: canvas.value, webrtc}, false); //< TODO: Make absolute mode toggleable, for now feels better? + // @ts-ignore + window.nestrikeyboard = new Keyboard({canvas: canvas.value, webrtc}); + // @ts-ignore + } else if (!document.pointerLockElement && window.nestrimouse && window.nestrikeyboard) { + // @ts-ignore + window.nestrimouse.dispose(); + // @ts-ignore + window.nestrimouse = undefined; + // @ts-ignore + window.nestrikeyboard.dispose(); + // @ts-ignore + window.nestrikeyboard = undefined; + } + }); }; document.body.append(playbtn); diff --git a/apps/www/tsconfig.json b/apps/www/tsconfig.json index ab18d603..6a9efe3a 100644 --- a/apps/www/tsconfig.json +++ b/apps/www/tsconfig.json @@ -41,5 +41,5 @@ "./*.config.ts", "./*.config.js", "content-collections.ts" - ] +, "../../packages/input/src/webrtc-stream.ts" ] } \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 28e1f495d90107e00d7aa5e88410d9a2631f2bb0..27b216a97458397b861a1fb3b8ff72c00f4f035f 100755 GIT binary patch delta 169122 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 delta 170723 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