From c329e90bcceca84f64f58891165063273e47ad4a Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 13:43:53 +1000 Subject: [PATCH 01/27] update fe --- .vscode/settings.json | 2 +- web/.eslintignore | 5 - web/.eslintrc.json | 105 - web/.gitignore | 46 +- web/.nvmrc | 2 +- web/.prettierrc | 10 + web/eslint.config.js | 55 + web/package-lock.json | 18304 ++++------------ web/package.json | 97 +- web/postcss.config.cjs | 7 - web/public/mockServiceWorker.js | 39 +- web/src/components/AggregatedBlockSummary.tsx | 6 +- .../components/AggregatedFramesSummary.tsx | 5 +- web/src/components/AggregatedNode.tsx | 2 +- web/src/components/BYOFrameBlockSummary.tsx | 10 +- web/src/components/ConcatNode.tsx | 44 + web/src/components/Control.tsx | 10 +- web/src/components/Download.tsx | 2 +- web/src/components/Edge.tsx | 2 +- web/src/components/EditableInput.tsx | 2 +- web/src/components/FrameBlockSummary.tsx | 2 +- web/src/components/FrameSummary.tsx | 2 +- web/src/components/Icon.tsx | 2 +- web/src/components/Loading.tsx | 2 +- web/src/components/ModeToggle.tsx | 14 +- web/src/components/Ruler.tsx | 2 +- web/src/components/Share.tsx | 2 +- web/src/components/Slot.tsx | 6 +- web/src/components/SlotBoundary.tsx | 2 +- web/src/components/SnapshotMarker.tsx | 6 +- web/src/components/TimeDrag.tsx | 4 +- web/src/components/WeightedNode.tsx | 2 +- web/src/contexts/application.tsx | 43 - web/src/contexts/focus.tsx | 14 +- web/src/hooks/__tests__/useQuery.test.ts | 2 +- web/src/hooks/useActive.ts | 2 +- web/src/hooks/useGraph.ts | 17 +- web/src/hooks/useOutsideInteraction.ts | 17 +- web/src/hooks/usePointer.ts | 41 +- web/src/hooks/useQuery.ts | 2 +- web/src/index.tsx | 12 +- web/src/mocks/handlers.ts | 4 +- web/src/parts/BYOFooter.tsx | 78 +- web/src/parts/Events.tsx | 23 +- web/src/parts/FrameFooter.tsx | 5 +- web/src/parts/Graph.tsx | 30 +- web/src/parts/Selection.tsx | 4 +- web/src/parts/Stage.tsx | 4 +- web/src/styles/global.css | 4 +- web/src/utils/__tests__/functions.test.ts | 2 - web/src/utils/__tests__/graph.test.ts | 42 +- web/src/utils/darkmode.ts | 12 + web/src/utils/graph.ts | 44 +- ...tailwind.config.cjs => tailwind.config.js} | 4 +- web/tsconfig.app.json | 71 + web/tsconfig.json | 72 +- web/tsconfig.node.json | 25 +- web/tsconfig.vitest.json | 8 + web/vite.config.ts | 31 +- web/vitest.config.ts | 43 +- web/vitest.setup.ts | 2 +- 61 files changed, 5096 insertions(+), 14363 deletions(-) delete mode 100644 web/.eslintignore delete mode 100644 web/.eslintrc.json create mode 100644 web/.prettierrc create mode 100644 web/eslint.config.js delete mode 100644 web/postcss.config.cjs create mode 100644 web/src/components/ConcatNode.tsx delete mode 100644 web/src/contexts/application.tsx create mode 100644 web/src/utils/darkmode.ts rename web/{tailwind.config.cjs => tailwind.config.js} (89%) create mode 100644 web/tsconfig.app.json create mode 100644 web/tsconfig.vitest.json diff --git a/.vscode/settings.json b/.vscode/settings.json index ba80287..643408a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,4 +18,4 @@ "source.fixAll.eslint": "explicit" }, "css.lint.unknownAtRules": "ignore" -} \ No newline at end of file +} diff --git a/web/.eslintignore b/web/.eslintignore deleted file mode 100644 index d1b77f7..0000000 --- a/web/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -build -tailwind.config.js -postcss.config.js -craco.config.js diff --git a/web/.eslintrc.json b/web/.eslintrc.json deleted file mode 100644 index 6866f27..0000000 --- a/web/.eslintrc.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "root": true, - "env": { - "browser": true, - "es2021": true, - "jest": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": "latest", - "sourceType": "module" - }, - "settings": { - "import/parsers": { - "@typescript-eslint/parser": [ - ".ts", - ".tsx" - ] - }, - "import/resolver": { - "typescript": { - "alwaysTryTypes": true, - "project": "./web/tsconfig.json" - } - }, - "react": { - "version": "detect" - } - }, - "plugins": [ - "import", - "react", - "react-hooks", - "@typescript-eslint", - "prettier" - ], - "rules": { - "prettier/prettier": [ - "error", - { - "singleQuote": true, - "trailingComma": "all", - "printWidth": 100, - "proseWrap": "never" - } - ], - "radix": [ - "error", - "as-needed" - ], - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": "off", - "react/react-in-jsx-scope": "off", - "import/prefer-default-export": "off", - "import/no-duplicates": "error", - "import/order": [ - "error", - { - "groups": [ - "builtin", - "external", - "internal" - ], - "pathGroups": [ - { - "pattern": "react", - "group": "external", - "position": "before" - } - ], - "pathGroupsExcludedImportTypes": [ - "react" - ], - "newlines-between": "always", - "alphabetize": { - "order": "asc", - "caseInsensitive": true - } - } - ], - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": [ - "vite.config.ts", - "vitest.config.ts", - "vitest.setup.ts", - "**/*.test.ts", - "**/*.test.tsx", - "src/mocks/*.ts" - ] - } - ] - }, - "overrides": [] -} \ No newline at end of file diff --git a/web/.gitignore b/web/.gitignore index 0a499da..5b5d4ab 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -1,28 +1,28 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage -eslint_report.json - -# production -/build/frontend - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - +# Logs +logs +*.log npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +build +*.local -!.vscode +# Editor directories and files .vscode/* -!.vscode/settings.json \ No newline at end of file +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +*.tsbuildinfo +eslint_report.json +coverage \ No newline at end of file diff --git a/web/.nvmrc b/web/.nvmrc index 1384ff6..94c0153 100644 --- a/web/.nvmrc +++ b/web/.nvmrc @@ -1 +1 @@ -22.5.1 +23.11.0 diff --git a/web/.prettierrc b/web/.prettierrc new file mode 100644 index 0000000..160ad07 --- /dev/null +++ b/web/.prettierrc @@ -0,0 +1,10 @@ +{ + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "trailingComma": "es5", + "bracketSpacing": true, + "arrowParens": "avoid", + "printWidth": 120 +} \ No newline at end of file diff --git a/web/eslint.config.js b/web/eslint.config.js new file mode 100644 index 0000000..243d292 --- /dev/null +++ b/web/eslint.config.js @@ -0,0 +1,55 @@ +import js from '@eslint/js'; +import globals from 'globals'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import tseslint from 'typescript-eslint'; +import prettier from 'eslint-plugin-prettier/recommended'; +import vitest from '@vitest/eslint-plugin'; + +export default tseslint.config( + { + ignores: [ + 'build', + 'public', + 'tailwind.config.js', + 'craco.config.js', + 'node_modules', + 'coverage', + 'eslint_report.json' + ], + }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended, vitest.configs.recommended, prettier], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 'latest', + globals: { + ...globals.browser, + ...globals.es2025, + ...globals.jest, + }, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], + 'react/prop-types': 'off', + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + trailingComma: 'all', + printWidth: 100, + proseWrap: 'never', + }, + ], + radix: ['error', 'as-needed'], + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'off', + 'react/react-in-jsx-scope': 'off', + }, + }, +); diff --git a/web/package-lock.json b/web/package-lock.json index 8abc06d..8fc7bc2 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,73 +8,79 @@ "name": "forkchoice", "version": "0.0.0", "dependencies": { - "@headlessui/react": "2.1.2", - "@heroicons/react": "2.1.5", - "@tailwindcss/forms": "0.5.7", - "@tanstack/react-query": "5.51.15", - "@tanstack/react-query-devtools": "5.51.15", - "classnames": "2.5.1", - "graphology": "0.25.4", + "@headlessui/react": "2.2.1", + "@heroicons/react": "2.2.0", + "@tailwindcss/vite": "4.1.3", + "@tanstack/react-query": "5.72.2", + "@tanstack/react-query-devtools": "5.72.2", + "clsx": "2.1.1", + "graphology": "0.26.0", "graphology-layout": "0.6.1", "graphology-traversal": "0.3.1", - "graphology-types": "0.24.7", + "graphology-types": "0.24.8", "graphology-utils": "2.5.2", - "javascript-time-ago": "2.5.10", - "react": "18.3.1", - "react-dom": "18.3.1", - "react-router-dom": "6.25.1", + "javascript-time-ago": "2.5.11", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-router-dom": "7.5.0", "react-time-ago": "7.3.3", - "react-zoom-pan-pinch": "3.6.1", - "wouter": "3.3.1" + "react-zoom-pan-pinch": "3.7.0", + "wouter": "3.6.0" }, "devDependencies": { - "@babel/core": "7.25.2", - "@testing-library/jest-dom": "6.4.8", - "@testing-library/react": "16.0.0", - "@types/react": "18.3.3", - "@types/react-dom": "18.3.0", - "@typescript-eslint/eslint-plugin": "7.18.0", - "@typescript-eslint/parser": "7.18.0", - "@vitejs/plugin-react": "4.3.1", - "@vitest/coverage-v8": "2.0.4", - "autoprefixer": "10.4.19", - "babel-loader": "9.1.3", - "eslint-config-prettier": "9.1.0", - "eslint-config-react-app": "7.0.1", - "eslint-import-resolver-typescript": "3.6.1", - "eslint-plugin-import": "2.29.1", - "eslint-plugin-mdx": "3.1.5", - "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "7.35.0", - "eslint-plugin-react-hooks": "4.6.2", - "jsdom": "24.1.1", - "msw": "2.3.4", - "postcss": "8.4.40", - "prettier": "3.3.3", + "@eslint/js": "9.24.0", + "@testing-library/dom": "10.4.0", + "@testing-library/react": "16.3.0", + "@types/js-yaml": "4.0.9", + "@types/react": "19.1.0", + "@types/react-dom": "19.1.2", + "@vitejs/plugin-react": "4.3.4", + "@vitest/coverage-v8": "3.1.1", + "@vitest/eslint-plugin": "1.1.42", + "autoprefixer": "10.4.21", + "eslint": "9.24.0", + "eslint-config-prettier": "10.1.2", + "eslint-plugin-prettier": "5.2.6", + "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-react-refresh": "0.4.19", + "globals": "16.0.0", + "jsdom": "26.0.0", + "msw": "2.7.3", + "prettier": "3.5.3", "prop-types": "15.8.1", - "tailwindcss": "3.4.7", - "typescript": "5.5.4", - "vite": "5.3.5", - "vite-plugin-eslint": "1.8.1", - "vitest": "2.0.4", + "typescript": "5.8.3", + "typescript-eslint": "8.29.1", + "vite": "6.2.6", + "vite-tsconfig-paths": "5.1.4", + "vitest": "3.1.1", "vitest-github-actions-reporter": "0.11.1" } }, "node_modules/@actions/core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", - "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", + "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", "dev": true, "license": "MIT", "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" + "@actions/io": "^1.0.1" } }, "node_modules/@actions/http-client": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.1.tgz", - "integrity": "sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", + "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", "dev": true, "license": "MIT", "dependencies": { @@ -82,25 +88,13 @@ "undici": "^5.25.4" } }, - "node_modules/@adobe/css-tools": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", - "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "node_modules/@actions/io": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", + "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", "dev": true, "license": "MIT" }, - "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==", - "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", @@ -115,14 +109,36 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.1.tgz", + "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/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/@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==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -130,9 +146,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -140,22 +156,22 @@ } }, "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==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "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", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -170,109 +186,84 @@ "url": "https://opencollective.com/babel" } }, - "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==", + "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": "Apache-2.0", - "engines": { - "node": ">=10" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "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": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "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==", + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "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" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "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.0", - "semver": "^6.3.1" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -281,15075 +272,6280 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-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==", + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "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==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "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==", + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "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==", + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "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==", + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-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==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", "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" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.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==", + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "regenerator-runtime": "^0.14.0" }, "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==", + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "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==", + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, "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==", + "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": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "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==", + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", "dev": true, - "license": "MIT", + "license": "ISC", "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" + "cookie": "^0.7.2" } }, - "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", - "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" } }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "node_modules/@bundled-es-modules/tough-cookie/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=6" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "node_modules/@csstools/css-calc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.13.0" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "node_modules/@csstools/css-color-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-tokenizer": "^3.0.3" } }, - "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==", + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "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" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dev": true, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dev": true, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dev": true, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "dev": true, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", - "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", - "dev": true, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", - "dev": true, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dev": true, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "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": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", - "globals": "^11.1.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "node_modules/@eslint/js": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", "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": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "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", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dev": true, + "node_modules/@floating-ui/core": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dev": true, + "node_modules/@floating-ui/dom": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.9" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", - "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", - "dev": true, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-flow": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "dev": true, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", - "dev": true, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@headlessui/react": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.1.tgz", + "integrity": "sha512-daiUqVLae8CKVjEVT19P/izW0aGK0GNhMSAeMlrDebKmoVZHcRRwbxzgtnEadUVDXyBsWo9/UH4KHeniO+0tMg==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.17.1", + "@react-aria/interactions": "^3.21.3", + "@tanstack/react-virtual": "^3.11.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "dev": true, + "node_modules/@heroicons/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", + "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": ">= 16 || ^19.0.0-rc" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.18.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "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": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=12.22" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "node_modules/@inquirer/confirm": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", + "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "node_modules/@inquirer/core": { + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", + "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "node_modules/@inquirer/figures": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", + "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "node_modules/@inquirer/type": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", + "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "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": "MIT", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "node_modules/@isaacs/cliui/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", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "node_modules/@isaacs/cliui/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": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "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", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "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", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "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", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "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": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "node_modules/@mswjs/interceptors": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", + "integrity": "sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", - "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "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": { - "@babel/helper-plugin-utils": "^7.24.7" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", - "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "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", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.25.2" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", - "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "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": { - "@babel/plugin-transform-react-jsx": "^7.24.7" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", - "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "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", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" - }, + "optional": true, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "node_modules/@pkgr/core": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.2.tgz", + "integrity": "sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", - "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", - "dev": true, - "license": "MIT", + "node_modules/@react-aria/focus": { + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.1.tgz", + "integrity": "sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "@react-aria/interactions": "^3.24.1", + "@react-aria/utils": "^3.28.1", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dev": true, - "license": "MIT", + "node_modules/@react-aria/interactions": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.24.1.tgz", + "integrity": "sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "@react-aria/ssr": "^3.9.7", + "@react-aria/utils": "^3.28.1", + "@react-stately/flags": "^3.1.0", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dev": true, - "license": "MIT", + "node_modules/@react-aria/ssr": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", + "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@swc/helpers": "^0.5.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 12" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dev": true, - "license": "MIT", + "node_modules/@react-aria/utils": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.1.tgz", + "integrity": "sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "@react-aria/ssr": "^3.9.7", + "@react-stately/flags": "^3.1.0", + "@react-stately/utils": "^3.10.5", + "@react-types/shared": "^3.28.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dev": true, - "license": "MIT", + "node_modules/@react-stately/flags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.0.tgz", + "integrity": "sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@swc/helpers": "^0.5.0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", - "dev": true, - "license": "MIT", + "node_modules/@react-stately/utils": { + "version": "3.10.5", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.5.tgz", + "integrity": "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" + "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "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" - }, + "node_modules/@react-types/shared": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.28.0.tgz", + "integrity": "sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==", + "license": "Apache-2.0", "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dev": true, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dev": true, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.2.tgz", - "integrity": "sha512-Y2Vkwy3ITW4id9c6KXshVV/x5yCGK7VdJmKkzOzNsDZMojRKfSA/033rRbLqlRozmhRXCejxWHLSJOg/wUHfzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", - "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.24.7", - "@babel/plugin-transform-react-jsx-development": "^7.24.7", - "@babel/plugin-transform-react-pure-annotations": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "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.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.2.tgz", - "integrity": "sha512-s4/r+a7xTnny2O6FcZzqgT6nE4/GHEdcqj4qAeglbUOh0TeglEfmNJFAd/OLoVtGd6ZhAO8GCVvCNUO5t/VJVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "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/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cookie": "^0.5.0" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dev": true, - "license": "ISC", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", - "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "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, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], "license": "MIT", "optional": true, "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } + "darwin" + ] }, - "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==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", "cpu": [ - "arm" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "darwin" + ] }, - "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==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "freebsd" + ] }, - "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==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "freebsd" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", "cpu": [ - "arm64" + "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", "cpu": [ - "x64" + "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", "cpu": [ - "x64" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", "cpu": [ - "arm" + "loong64" ], - "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==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", "cpu": [ - "arm64" + "ppc64" ], - "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==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", "cpu": [ - "ia32" + "riscv64" ], - "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==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", "cpu": [ - "loong64" + "riscv64" ], - "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==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", "cpu": [ - "mips64el" + "s390x" ], - "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==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", "cpu": [ - "ppc64" + "x64" ], - "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==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", "cpu": [ - "riscv64" + "x64" ], - "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==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", "cpu": [ - "s390x" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "win32" + ] }, - "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==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", "cpu": [ - "x64" + "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "win32" + ] }, - "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==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "win32" + ] + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" } }, - "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, + "node_modules/@tailwindcss/node": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.3.tgz", + "integrity": "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.3" } }, - "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, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.3.tgz", + "integrity": "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==", "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==", + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-x64": "4.1.3", + "@tailwindcss/oxide-freebsd-x64": "4.1.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-x64-musl": "4.1.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.3.tgz", + "integrity": "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "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==", + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.3.tgz", + "integrity": "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==", "cpu": [ - "ia32" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "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==", + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.3.tgz", + "integrity": "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "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.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/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)", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "peer": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.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/@floating-ui/core": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz", - "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.5" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.8.tgz", - "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.5" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.26.20", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.20.tgz", - "integrity": "sha512-RixKJJG92fcIsVoqrFr4Onpzh7hlOx4U7NV4aLhMLmtvjZ5oTB/WzXaANYUZATKqXvvW7t9sCxtzejip26N5Ag==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.1", - "@floating-ui/utils": "^0.2.5", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", - "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "node": ">= 10" } }, - "node_modules/@floating-ui/utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz", - "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==", - "license": "MIT" - }, - "node_modules/@headlessui/react": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.2.tgz", - "integrity": "sha512-Kb3hgk9gRNRcTZktBrKdHhF3xFhYkca1Rk6e1/im2ENf83dgN54orMW0uSKTXFnUpZOUFZ+wcY05LlipwgZIFQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.26.16", - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@tanstack/react-virtual": "^3.8.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^18", - "react-dom": "^18" - } - }, - "node_modules/@heroicons/react": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.5.tgz", - "integrity": "sha512-FuzFN+BsHa+7OxbvAERtgBTNeZpUjgM/MIizfVkSCL2/edriN0Hx/DWRCR//aPYwO5QX/YlgLGXk+E3PcfZwjA==", - "license": "MIT", - "peerDependencies": { - "react": ">= 16" - } - }, - "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", - "peer": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "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", - "peer": true - }, - "node_modules/@inquirer/confirm": { - "version": "3.1.19", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.19.tgz", - "integrity": "sha512-dcLbnxmhx3a72c4fM6CwhydG8rS8TZCXtCYU7kUraA+qU2Ue8gNCiYOxnlhb0H0wbTKL23lUo68fX0iMP8t2Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^9.0.7", - "@inquirer/type": "^1.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.7.tgz", - "integrity": "sha512-wyqnTmlnd9p7cX6tfMlth+/Nx7vV2t/FvtO9VMSi2XjBkNy0MkPr19RSOyP3qrywdlJT+BQbEnXLPqq0wFMw3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.1", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.0.0", - "@types/wrap-ansi": "^3.0.0", - "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", - "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", - "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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==", - "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.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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==", - "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/@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==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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==", - "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/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "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/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==", - "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==", - "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", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "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==", - "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==", - "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==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/config": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-8.3.4.tgz", - "integrity": "sha512-01rtHedemDNhUXdicU7s+QYz/3JyV5Naj84cvdXGH4mgCdL+agmSYaLF4LUG4vMCLzhBO8YtS0gPpH1FGvbgAw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/package-json": "^5.1.1", - "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.2.1", - "proc-log": "^4.2.0", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/config/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/@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/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/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/@npmcli/git/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/@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/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/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/@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/package-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", - "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", - "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/package-json/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/@npmcli/package-json/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/@npmcli/package-json/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/@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/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, - "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==", - "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/@react-aria/focus": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.1.tgz", - "integrity": "sha512-N0Cy61WCIv+57mbqC7hiZAsB+3rF5n4JKabxUmg/2RTJL6lq7hJ5N4gx75ymKxkN8GnVDwt4pKZah48Wopa5jw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.22.1", - "@react-aria/utils": "^3.25.1", - "@react-types/shared": "^3.24.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@react-aria/interactions": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.1.tgz", - "integrity": "sha512-5TLzQaDAQQ5C70yG8GInbO4wIylKY67RfTIIwQPGR/4n5OIjbUD8BOj3NuSsuZ/frUPaBXo1VEBBmSO23fxkjw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.5", - "@react-aria/utils": "^3.25.1", - "@react-types/shared": "^3.24.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.5.tgz", - "integrity": "sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@react-aria/utils": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.25.1.tgz", - "integrity": "sha512-5Uj864e7T5+yj78ZfLnfHqmypLiqW2mN+nsdslog2z5ssunTqjolVeM15ootXskjISlZ7MojLpq97kIC4nlnAw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.5", - "@react-stately/utils": "^3.10.2", - "@react-types/shared": "^3.24.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@react-stately/utils": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.2.tgz", - "integrity": "sha512-fh6OTQtbeQC0ywp6LJuuKs6tKIgFvt/DlIZEcIpGho6/oZG229UnIk6TUekwxnDbumuYyan6D9EgUtEMmT8UIg==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@react-types/shared": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.24.1.tgz", - "integrity": "sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==", - "license": "Apache-2.0", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@remix-run/router": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz", - "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "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/@rollup/rollup-android-arm-eabi": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz", - "integrity": "sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz", - "integrity": "sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz", - "integrity": "sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz", - "integrity": "sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz", - "integrity": "sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz", - "integrity": "sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz", - "integrity": "sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz", - "integrity": "sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz", - "integrity": "sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz", - "integrity": "sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz", - "integrity": "sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz", - "integrity": "sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz", - "integrity": "sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz", - "integrity": "sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz", - "integrity": "sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz", - "integrity": "sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "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/@swc/helpers": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.12.tgz", - "integrity": "sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", - "license": "MIT", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.51.15", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.51.15.tgz", - "integrity": "sha512-xyobHDJ0yhPE3+UkSQ2/4X1fLSg7ICJI5J1JyU9yf7F3deQfEwSImCDrB1WSRrauJkMtXW7YIEcC0oA6ZZWt5A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/query-devtools": { - "version": "5.51.15", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.51.15.tgz", - "integrity": "sha512-1oSCl+PsCa/aBCGVM2ZdcQLuQ0QYmKXJJB264twEMVM1M0n5CI40trtywORPF+wLGuZNIZzkKL7j/98mOLAIag==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.51.15", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.51.15.tgz", - "integrity": "sha512-UgFg23SrdIYrmfTSxAUn9g+J64VQy11pb9/EefoY/u2+zWuNMeqEOnvpJhf52XQy0yztQoyM9p6x8PFyTNaxXg==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.51.15" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@tanstack/react-query-devtools": { - "version": "5.51.15", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.51.15.tgz", - "integrity": "sha512-bvGvJoncjZ3irEofoFevptj5BPkDpQrp2+dZhtFqPUZXRT6MAKPmOqtSmZPfacLR5jQLpqw/7d3Zxr173z7WDA==", - "license": "MIT", - "dependencies": { - "@tanstack/query-devtools": "5.51.15" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-query": "^5.51.15", - "react": "^18 || ^19" - } - }, - "node_modules/@tanstack/react-virtual": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.8.3.tgz", - "integrity": "sha512-9ICwbDUUzN99CJIGc373i8NLoj6zFTKI2Hlcmo0+lCSAhPQ5mxq4dGOMKmLYoEFyHcGQ64Bd6ZVbnPpM6lNK5w==", - "license": "MIT", - "dependencies": { - "@tanstack/virtual-core": "3.8.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@tanstack/virtual-core": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.8.3.tgz", - "integrity": "sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/dom/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", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/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", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/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", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/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", - "peer": true - }, - "node_modules/@testing-library/dom/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", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/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", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz", - "integrity": "sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "@babel/runtime": "^7.9.2", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/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/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/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/@testing-library/jest-dom/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/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/jest-dom/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/@testing-library/jest-dom/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/@testing-library/react": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", - "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "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/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/concat-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.3.tgz", - "integrity": "sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "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/eslint": { - "version": "8.56.11", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.11.tgz", - "integrity": "sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "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/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/is-empty": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/is-empty/-/is-empty-1.2.3.tgz", - "integrity": "sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==", - "dev": true, - "license": "MIT" - }, - "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/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/mdast/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "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/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.0.0.tgz", - "integrity": "sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.11.1" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "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/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/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/supports-color": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz", - "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.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.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "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" - } - }, - "node_modules/@typescript-eslint/experimental-utils/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" - } - }, - "node_modules/@typescript-eslint/experimental-utils/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" - } - }, - "node_modules/@typescript-eslint/experimental-utils/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 - } - } - }, - "node_modules/@typescript-eslint/experimental-utils/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" - } - }, - "node_modules/@typescript-eslint/experimental-utils/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" - } - }, - "node_modules/@typescript-eslint/experimental-utils/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/@typescript-eslint/experimental-utils/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/@typescript-eslint/experimental-utils/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/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "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 - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "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.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "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/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/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "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/@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", - "peer": true - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.0.4.tgz", - "integrity": "sha512-i4lx/Wpg5zF1h2op7j0wdwuEQxaL/YTwwQaKuKMHYj7MMh8c7I4W7PNfOptZBCSBZI0z1qwn64o0pM/pA8Tz1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.5", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.10", - "magicast": "^0.3.4", - "std-env": "^3.7.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.0.4" - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", - "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", - "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", - "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.0.4", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", - "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.4", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", - "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", - "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.0.4", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/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/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": 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/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", - "peer": true, - "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/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/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", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "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==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "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", - "peer": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "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/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "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/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "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.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/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/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": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", - "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.30001640", - "electron-to-chromium": "^1.4.820", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "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/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/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==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001643", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", - "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", - "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/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/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "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": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "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==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.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/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "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/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/cliui/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/cliui/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/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/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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/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/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "license": "ISC" - }, - "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/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "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/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", - "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "dev": true, - "license": "MIT" - }, - "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-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "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/decode-named-character-reference/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/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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", - "peer": true - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "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-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/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "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/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==", - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "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/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "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", - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.3.tgz", - "integrity": "sha512-QNdYSS5i8D9axWp/6XIezRObRHqaav/ur9z1VzCDUCH1XIFOr9WQk5xmgunhsTpjjgDy3oLxO/WMOVZlpUQrlA==", - "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==", - "license": "MIT" - }, - "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/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/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", - "peer": true - }, - "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.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "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", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-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-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "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" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "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" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-react-app/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" - } - }, - "node_modules/eslint-config-react-app/node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-react-app/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" - } - }, - "node_modules/eslint-config-react-app/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 - } - } - }, - "node_modules/eslint-config-react-app/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" - } - }, - "node_modules/eslint-config-react-app/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" - } - }, - "node_modules/eslint-config-react-app/node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-config-react-app/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/eslint-config-react-app/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/eslint-config-react-app/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/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-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "license": "ISC", - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "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": "*" - } - }, - "node_modules/eslint-mdx": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-3.1.5.tgz", - "integrity": "sha512-ynztX0k7CQ3iDL7fDEIeg3g0O/d6QPv7IBI9fdYLhXp5fAp0fi8X22xF/D3+Pk0f90R27uwqa1clHpay6t0l8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.3", - "acorn-jsx": "^5.3.2", - "espree": "^9.6.1", - "estree-util-visit": "^2.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "synckit": "^0.9.0", - "tslib": "^2.6.2", - "unified": "^11.0.4", - "unified-engine": "^11.2.0", - "unist-util-visit": "^5.0.0", - "uvu": "^0.5.6", - "vfile": "^6.0.1" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "eslint": ">=8.0.0" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "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-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "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.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/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/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" - } - }, - "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" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-jsx-a11y": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", - "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", - "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.9.1", - "axobject-query": "~3.1.1", - "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" - } - }, - "node_modules/eslint-plugin-jsx-a11y/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/eslint-plugin-jsx-a11y/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/eslint-plugin-jsx-a11y/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/eslint-plugin-markdown": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.1.tgz", - "integrity": "sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^0.8.5" - }, - "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-plugin-mdx": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-3.1.5.tgz", - "integrity": "sha512-lUE7tP7IrIRHU3gTtASDe5u4YM2SvQveYVJfuo82yn3MLh/B/v05FNySURCK4aIxIYF1QYo3IRemQG/lyQzpAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-mdx": "^3.1.5", - "eslint-plugin-markdown": "^3.0.1", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "tslib": "^2.6.2", - "unified": "^11.0.4", - "vfile": "^6.0.1" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "eslint": ">=8.0.0" - } - }, - "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.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", - "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-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" - } - }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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-testing-library": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", - "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - } - } - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "node_modules/eslint-plugin-testing-library/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/eslint-plugin-testing-library/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/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", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "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/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", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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)", - "peer": true, - "engines": { - "node": ">=10" - }, - "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/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", - "peer": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.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-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-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": "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/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/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "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/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/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-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "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==", - "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", - "peer": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "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", - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "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/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "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", - "peer": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "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==", - "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/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-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "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-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/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.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "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", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "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", - "peer": true - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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": "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/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/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/graphology": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz", - "integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==", - "license": "MIT", - "dependencies": { - "events": "^3.3.0", - "obliterator": "^2.0.2" - }, - "peerDependencies": { - "graphology-types": ">=0.24.0" - } - }, - "node_modules/graphology-indices": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", - "integrity": "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.4.2", - "mnemonist": "^0.39.0" - }, - "peerDependencies": { - "graphology-types": ">=0.20.0" - } - }, - "node_modules/graphology-layout": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/graphology-layout/-/graphology-layout-0.6.1.tgz", - "integrity": "sha512-m9aMvbd0uDPffUCFPng5ibRkb2pmfNvdKjQWeZrf71RS1aOoat5874+DcyNfMeCT4aQguKC7Lj9eCbqZj/h8Ag==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.3.0", - "pandemonium": "^2.4.0" - }, - "peerDependencies": { - "graphology-types": ">=0.19.0" - } - }, - "node_modules/graphology-traversal": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/graphology-traversal/-/graphology-traversal-0.3.1.tgz", - "integrity": "sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==", - "license": "MIT", - "dependencies": { - "graphology-indices": "^0.17.0", - "graphology-utils": "^2.0.0" - }, - "peerDependencies": { - "graphology-types": ">=0.20.0" - } - }, - "node_modules/graphology-types": { - "version": "0.24.7", - "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.7.tgz", - "integrity": "sha512-tdcqOOpwArNjEr0gNQKCXwaNCWnQJrog14nJNQPeemcLnXQUUGrsCWpWkVKt46zLjcS6/KGoayeJfHHyPDlvwA==", - "license": "MIT" - }, - "node_modules/graphology-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz", - "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==", - "license": "MIT", - "peerDependencies": { - "graphology-types": ">=0.23.0" - } - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "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": "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/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/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "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/hosted-git-info/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/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "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/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/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/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", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "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-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "peer": true, - "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", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "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/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/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.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==", - "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-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.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", - "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": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-empty": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-empty/-/is-empty-1.2.0.tgz", - "integrity": "sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "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==", - "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==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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-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-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, - "license": "MIT" - }, - "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==", - "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", - "peer": true, - "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-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "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-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/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==", - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "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==", - "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/javascript-time-ago": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.5.10.tgz", - "integrity": "sha512-EUxp4BP74QH8xiYHyeSHopx1XhMMJ9qEX4rcBdFtpVWmKRdzpxbNzz2GSbuekZr5wt0rmLehuyp0PE34EAJT9g==", - "license": "MIT", - "dependencies": { - "relative-time-format": "^1.1.6" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/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", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "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==", - "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", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "24.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", - "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "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", - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "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/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", - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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/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", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/load-plugin": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/load-plugin/-/load-plugin-6.0.3.tgz", - "integrity": "sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@npmcli/config": "^8.0.0", - "import-meta-resolve": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "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", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "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", - "peer": true - }, - "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==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "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/magicast": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", - "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.24.4", - "@babel/types": "^7.24.0", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/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/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-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.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", - "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-expression/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/mdast-util-mdx-expression/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-mdx-expression/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/mdast-util-mdx-expression/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/mdast-util-mdx-expression/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/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", - "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-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/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/mdast-util-mdx-jsx/node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mdast-util-mdx-jsx/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/mdast-util-mdx/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/mdast-util-mdx/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-mdx/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/mdast-util-mdx/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/mdast-util-mdx/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/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-mdxjs-esm/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, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.3.tgz", + "integrity": "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "*" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/mdast-util-mdxjs-esm/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, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.3.tgz", + "integrity": "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==", + "cpu": [ + "arm" + ], "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" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/mdast-util-mdxjs-esm/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, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.3.tgz", + "integrity": "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/mdast-util-mdxjs-esm/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" - } + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.3.tgz", + "integrity": "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==", + "cpu": [ + "arm64" ], "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/mdast-util-mdxjs-esm/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" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "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, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.3.tgz", + "integrity": "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/mdast-util-phrasing/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, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.3.tgz", + "integrity": "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "*" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "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, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.3.tgz", + "integrity": "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==", + "cpu": [ + "arm64" + ], "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" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/mdast-util-to-markdown/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, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.3.tgz", + "integrity": "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "*" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/mdast-util-to-markdown/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, + "node_modules/@tailwindcss/vite": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.3.tgz", + "integrity": "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0" + "@tailwindcss/node": "4.1.3", + "@tailwindcss/oxide": "4.1.3", + "tailwindcss": "4.1.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "vite": "^5.2.0 || ^6" } }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "dev": true, + "node_modules/@tanstack/query-core": { + "version": "5.72.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.72.2.tgz", + "integrity": "sha512-fxl9/0yk3mD/FwTmVEf1/H6N5B975H0luT+icKyX566w6uJG0x6o+Yl+I38wJRCaogiMkstByt+seXfDbWDAcA==", "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "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==", + "node_modules/@tanstack/query-devtools": { + "version": "5.72.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.72.2.tgz", + "integrity": "sha512-mMKnGb+iOhVBcj6jaerCFRpg8pACStdG8hmUBHPtToeZzs4ctjBUL1FajqpVn2WaMxnq8Wya+P3Q5tPFNM9jQw==", "license": "MIT", - "engines": { - "node": ">= 8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/@tanstack/react-query": { + "version": "5.72.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.72.2.tgz", + "integrity": "sha512-SVNHzyBUYiis+XiCl+8yiPZmMYei2AKYY94wM/zpvB5l1jxqOo82FQTziSJ4pBi96jtYqvYrTMxWynmbQh3XKw==", "license": "MIT", "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" + "@tanstack/query-core": "5.72.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" } }, - "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-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" - } - ], + "node_modules/@tanstack/react-query-devtools": { + "version": "5.72.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.72.2.tgz", + "integrity": "sha512-n53qr9JdHCJTCUba6OvMhwiV2CcsckngOswKEE7nM5pQBa/fW9c43qw8omw1RPT2s+aC7MuwS8fHsWT8g+j6IQ==", "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" + "@tanstack/query-devtools": "5.72.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.72.2", + "react": "^18 || ^19" } }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", - "dev": true, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.6.tgz", + "integrity": "sha512-WT7nWs8ximoQ0CDx/ngoFP7HbQF9Q2wQe4nh2NB+u2486eX3nZRE40P9g6ccCVq7ZfTSH5gFOuCoVH5DLNS/aA==", "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-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" + "@tanstack/virtual-core": "3.13.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "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, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.6", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.6.tgz", + "integrity": "sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==", "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" } }, - "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==", + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "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" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", "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" + "@babel/runtime": "^7.12.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "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==", + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "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" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "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==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "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" + "@babel/types": "^7.0.0" } }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "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-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" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.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==", + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "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" + "@babel/types": "^7.20.7" } }, - "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==", + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "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/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", + "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", "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" + "csstype": "^3.0.2" } }, - "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==", + "node_modules/@types/react-dom": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", "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" + "peerDependencies": { + "@types/react": "^19.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==", + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", + "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", "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" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/type-utils": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "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", + "typescript": ">=4.8.4 <5.9.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==", + "node_modules/@typescript-eslint/parser": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", + "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", "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" + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "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", + "typescript": ">=4.8.4 <5.9.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==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", + "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", "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" + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", + "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", "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" + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "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", + "typescript": ">=4.8.4 <5.9.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==", + "node_modules/@typescript-eslint/types": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", + "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", "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" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", + "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", "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" + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "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": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.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==", + "node_modules/@typescript-eslint/utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", + "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", "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" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1" + }, + "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", + "typescript": ">=4.8.4 <5.9.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==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", + "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", "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" + "@typescript-eslint/types": "8.29.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "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" + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", "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" + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.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==", + "node_modules/@vitest/coverage-v8": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz", + "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==", "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" + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "debug": "^4.4.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.8.1", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.1.1", + "vitest": "3.1.1" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "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==", + "node_modules/@vitest/eslint-plugin": { + "version": "1.1.42", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.42.tgz", + "integrity": "sha512-dTGNbh/angh+hoqp5L5A8YO/29mOXDXmDQ/1fzt/jiYzLvU6FvrMqJpGqMqh5g+Fz6MDoZi0AlxefnFUg93Q5A==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/utils": ">= 8.24.0", + "eslint": ">= 8.57.0", + "typescript": ">= 5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true } - ], - "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==", + "node_modules/@vitest/expect": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", + "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", "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.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" }, - "engines": { - "node": ">=8.6" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/@vitest/mocker": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", + "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@vitest/spy": "3.1.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/@vitest/pretty-format": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", + "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "tinyrainbow": "^2.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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==", + "node_modules/@vitest/runner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", + "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@vitest/utils": "3.1.1", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "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==", + "node_modules/@vitest/snapshot": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", + "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@vitest/pretty-format": "3.1.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "node_modules/@vitest/spy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", + "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", + "dev": true, "license": "MIT", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "tinyspy": "^3.0.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/vitest" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/@vitest/utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", "dev": true, "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.1", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.4.0" } }, - "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==", - "license": "MIT" - }, - "node_modules/mnemonist": { - "version": "0.39.8", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", - "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", + "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", - "dependencies": { - "obliterator": "^2.0.1" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 14" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/msw": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.4.tgz", - "integrity": "sha512-sHMlwrajgmZSA2l1o7qRSe+azm/I+x9lvVVcOxAzi4vCtH8uVPJk1K5BQYDkzGl+tt0RvM9huEXXdeGrgcc79g==", + "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, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" + "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": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.7.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/msw/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==", + "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": { - "color-convert": "^2.0.1" + "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/msw/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/msw/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" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/msw/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/msw/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==", + "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/msw/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==", + "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": { - "has-flag": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "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": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "engines": { + "node": ">=12" } }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "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.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, "bin": { - "nanoid": "bin/nanoid.cjs" + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "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/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "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/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "node_modules/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", - "peer": true + "dependencies": { + "balanced-match": "^1.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==", + "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" + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } }, - "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==", + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, - "license": "ISC", + "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": { - "abbrev": "^2.0.0" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { - "nopt": "bin/nopt.js" + "browserslist": "cli.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "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==", + "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": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, + "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "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==", + "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": ">=0.10.0" + "node": ">=6" } }, - "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==", + "node_modules/caniuse-lite": { + "version": "1.0.30001713", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", + "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "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/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "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==", + "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": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "semver": "^7.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 16" } }, - "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==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 12" } }, - "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==", + "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": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "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": "^16.14.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/cliui/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": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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==", + "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": "ISC", + "license": "MIT", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/npm-pick-manifest/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" - }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" } }, - "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==", + "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": { - "path-key": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "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==", + "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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "delayed-stream": "~1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8" } }, - "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "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/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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "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/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 0.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==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 8" } }, - "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==", + "node_modules/cssstyle": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", + "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" + "@asamuzakjp/css-color": "^3.1.1", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "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==", + "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/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "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==", + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "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" + "ms": "^2.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "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": ">=6" } }, - "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==", + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "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": ">=0.4.0" } }, - "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==", + "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", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "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==", + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "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/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/electron-to-chromium": { + "version": "1.5.136", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", + "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "wrappy": "1" - } + "license": "ISC" }, - "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==", + "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/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=12" + "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/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "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", - "peer": true, - "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": ">= 0.4" } }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true, "license": "MIT" }, - "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==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "yocto-queue": "^0.1.0" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "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==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pandemonium": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", - "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==", + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "mnemonist": "^0.39.2" + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" } }, - "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==", + "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", - "dependencies": { - "callsites": "^3.0.0" - }, "engines": { "node": ">=6" } }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "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", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" + "engines": { + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/eslint": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", + "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", "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" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.24.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "node_modules/eslint-config-prettier": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", + "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", "dev": true, "license": "MIT", - "dependencies": { - "entities": "^4.4.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "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==", + "node_modules/eslint-plugin-prettier": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", + "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.0" + }, "engines": { - "node": ">=8" + "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": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "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==", + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.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==", + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "eslint": ">=8.40" } }, - "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==", - "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==", - "license": "BlueOak-1.0.0", + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/eslint" } }, - "node_modules/path-scurry/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==", - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true, - "license": "MIT" - }, - "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==", + "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": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 14.16" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8.6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "url": "https://opencollective.com/eslint" } }, - "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==", - "license": "MIT", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 6" + "node": "*" } }, - "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==", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "find-up": "^6.3.0" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=14.16" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "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==", + "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": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "p-locate": "^6.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10" } }, - "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==", + "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": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "yocto-queue": "^1.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "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==", + "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-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": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/estree": "^1.0.0" } }, - "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==", + "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/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.8.x" } }, - "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==", + "node_modules/expect-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "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-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "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.8" + }, "engines": { - "node": ">= 0.4" + "node": ">=8.6.0" } }, - "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", - "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", + "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": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "is-glob": "^4.0.1" }, "engines": { - "node": "^10 || ^12 || >=14" + "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/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "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==", + "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": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "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" }, - "peerDependencies": { - "postcss": "^8.0.0" + "engines": { + "node": ">=8" } }, - "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==", + "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": { - "camelcase-css": "^2.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^12 || ^14 || >= 16" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "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": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "node": ">=16" } }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "license": "MIT", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, "engines": { "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, - "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==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "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", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, "engines": { - "node": ">=12.0" + "node": "*" }, - "peerDependencies": { - "postcss": "^8.2.14" + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "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==", - "license": "MIT" + "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/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "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", - "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=6.9.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==", + "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": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, + "license": "ISC", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": "6.* || 8.* || >= 10.*" } }, - "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==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "fast-diff": "^1.1.2" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">= 0.4" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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": "MIT", - "peer": true, - "engines": { - "node": ">=10" + "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/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=10" + "node": ">=10.13.0" } }, - "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==", + "node_modules/globals": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "dev": true, "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "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/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" + "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==", + "license": "ISC" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/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/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "node_modules/graphology": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.26.0.tgz", + "integrity": "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==", "license": "MIT", "dependencies": { - "performance-now": "^2.1.0" + "events": "^3.3.0" + }, + "peerDependencies": { + "graphology-types": ">=0.24.0" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "node_modules/graphology-indices": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", + "integrity": "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==", "license": "MIT", - "peer": true, "dependencies": { - "safe-buffer": "^5.1.0" + "graphology-utils": "^2.4.2", + "mnemonist": "^0.39.0" + }, + "peerDependencies": { + "graphology-types": ">=0.20.0" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/graphology-layout": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/graphology-layout/-/graphology-layout-0.6.1.tgz", + "integrity": "sha512-m9aMvbd0uDPffUCFPng5ibRkb2pmfNvdKjQWeZrf71RS1aOoat5874+DcyNfMeCT4aQguKC7Lj9eCbqZj/h8Ag==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "graphology-utils": "^2.3.0", + "pandemonium": "^2.4.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "graphology-types": ">=0.19.0" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "node_modules/graphology-traversal": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/graphology-traversal/-/graphology-traversal-0.3.1.tgz", + "integrity": "sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "graphology-indices": "^0.17.0", + "graphology-utils": "^2.0.0" }, "peerDependencies": { - "react": "^18.3.1" + "graphology-types": ">=0.20.0" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, + "node_modules/graphology-types": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz", + "integrity": "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==", + "license": "MIT" + }, + "node_modules/graphology-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz", + "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==", "license": "MIT", - "peer": true + "peerDependencies": { + "graphology-types": ">=0.23.0" + } }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "node_modules/graphql": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/react-router": { - "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz", - "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@remix-run/router": "1.18.0" - }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "react": ">=16.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-router-dom": { - "version": "6.25.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz", - "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==", + "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": { - "@remix-run/router": "1.18.0", - "react-router": "6.25.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-time-ago": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.3.3.tgz", - "integrity": "sha512-5kh2Kuu/UhHzcZrGvf3GUrF2d+IXjkIXif5MR2iDWIfSqQuBW27/ejN/tmzJBRyPiryYTgbDIG6AZFJ4RW3yfw==", + "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": { - "memoize-one": "^6.0.0", - "prop-types": "^15.8.1", - "raf": "^3.4.1" + "function-bind": "^1.1.2" }, - "peerDependencies": { - "javascript-time-ago": "^2.3.7", - "react": ">=0.16.8", - "react-dom": ">=0.16.8" - } - }, - "node_modules/react-zoom-pan-pinch": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.6.1.tgz", - "integrity": "sha512-SdPqdk7QDSV7u/WulkFOi+cnza8rEZ0XX4ZpeH7vx3UZEg7DoyuAy3MCmm+BWv/idPQL2Oe73VoC0EhfCN+sZQ==", - "license": "MIT", "engines": { - "node": ">=8", - "npm": ">=5" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "node": ">= 0.4" } }, - "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==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/read-package-json-fast/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==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "MIT" }, - "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==", + "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">=8.10.0" + "node": ">= 14" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "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", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "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", - "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": ">= 4" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "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", - "dependencies": { - "@babel/runtime": "^7.8.4" + "engines": { + "node": ">=0.8.19" } }, - "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==", + "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", - "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": ">=0.10.0" } }, - "node_modules/regexparam": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", - "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", + "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/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "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": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } + "license": "MIT" }, - "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==", + "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, - "bin": { - "jsesc": "bin/jsesc" + "license": "MIT", + "engines": { + "node": ">=0.12.0" } }, - "node_modules/relative-time-format": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.1.6.tgz", - "integrity": "sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, "license": "MIT" }, - "node_modules/remark-mdx": { + "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/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "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==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/remark-parse/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==", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@types/unist": "*" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/remark-parse/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==", + "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": "MIT", + "license": "BlueOak-1.0.0", "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" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/remark-parse/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, + "node_modules/javascript-time-ago": { + "version": "2.5.11", + "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.5.11.tgz", + "integrity": "sha512-Zeyf5R7oM1fSMW9zsU3YgAYwE0bimEeF54Udn2ixGd8PUwu+z1Yc5t4Y8YScJDMHD6uCx6giLt3VJR5K4CMwbg==", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "relative-time-format": "^1.1.6" } }, - "node_modules/remark-parse/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" - } - ], + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "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/remark-parse/node_modules/unist-util-stringify-position": { + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { "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==", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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": { - "@types/unist": "^3.0.0" + "argparse": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", + "node_modules/jsdom": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/remark-stringify/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==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "*" + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, - "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==", + "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", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "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==", + "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", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "node_modules/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/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, "bin": { - "resolve": "bin/resolve" + "json5": "lib/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "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==", + "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", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "dependencies": { + "json-buffer": "3.0.1" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "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": ">= 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==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", "dependencies": { - "glob": "^7.1.3" + "detect-libc": "^2.0.3" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.1.tgz", - "integrity": "sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">= 12.0.0" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.19.1", - "@rollup/rollup-android-arm64": "4.19.1", - "@rollup/rollup-darwin-arm64": "4.19.1", - "@rollup/rollup-darwin-x64": "4.19.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.19.1", - "@rollup/rollup-linux-arm-musleabihf": "4.19.1", - "@rollup/rollup-linux-arm64-gnu": "4.19.1", - "@rollup/rollup-linux-arm64-musl": "4.19.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.1", - "@rollup/rollup-linux-riscv64-gnu": "4.19.1", - "@rollup/rollup-linux-s390x-gnu": "4.19.1", - "@rollup/rollup-linux-x64-gnu": "4.19.1", - "@rollup/rollup-linux-x64-musl": "4.19.1", - "@rollup/rollup-win32-arm64-msvc": "4.19.1", - "@rollup/rollup-win32-ia32-msvc": "4.19.1", - "@rollup/rollup-win32-x64-msvc": "4.19.1", - "fsevents": "~2.3.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true, - "license": "MIT" + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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" - }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" ], - "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" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=v12.22.7" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12.13.0" + "node": ">= 12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/parcel" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "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": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "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/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==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, "license": "MIT" }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "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", - "bin": { - "semver": "bin/semver.js" - } - }, - "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", - "peer": true, "dependencies": { - "randombytes": "^2.1.0" + "yallist": "^3.0.2" } }, - "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==", + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "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" + "bin": { + "lz-string": "bin/bin.js" } }, - "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==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "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" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "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==", + "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": { - "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==", - "license": "MIT", - "engines": { - "node": ">=8" + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" } }, - "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==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "semver": "^7.5.3" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "license": "ISC" - }, - "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==", - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "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": ">= 8" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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": "BSD-3-Clause", - "peer": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "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==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "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==", + "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": "Apache-2.0", + "license": "ISC", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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": "CC-BY-3.0" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/spdx-expression-parse": { + "node_modules/mitt": { "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, + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mnemonist": { + "version": "0.39.8", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", + "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "obliterator": "^2.0.1" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "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/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/msw": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.3.tgz", + "integrity": "sha512-+mycXv8l2fEAjFZ5sjrtjJDmm2ceKGjrNbBr1durRg6VkU9fNUE/gsmQ51hWbHqs+l35W1iM+ZsmOD9Fd6lspw==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.1", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.37.0", + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.26.1", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "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, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">= 0.4" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "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/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-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, - "node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "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", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "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==", + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true, + "license": "MIT" + }, + "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==", "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "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==", + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", "license": "MIT" }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "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", - "engines": { - "node": ">=12" + "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" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true, "license": "MIT" }, - "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==", + "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": { - "ansi-regex": "^6.0.1" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "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" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "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" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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/pandemonium": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", + "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==", "license": "MIT", "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "mnemonist": "^0.39.2" } }, - "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==", + "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": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "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==", + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "entities": "^4.5.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/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==", + "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": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/path-scurry/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/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/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "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" + "engines": { + "node": ">= 14.16" } }, - "node_modules/stringify-entities/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==", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "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": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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": { - "ansi-regex": "^5.0.1" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" } }, - "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==", + "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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "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==", + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "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==", + "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", - "engines": { - "node": ">=12" + "dependencies": { + "fast-diff": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.0.0" } }, - "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==", + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=8" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "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==", "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" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/sucrase/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==", - "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/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, - "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==", + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "punycode": "^2.3.1" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/lupomontero" } }, - "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==", + "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true, "license": "MIT" }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "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/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "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" + "performance-now": "^2.1.0" } }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/tailwindcss": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", - "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==", + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "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" + "scheduler": "^0.26.0" }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" + "peerDependencies": { + "react": "^19.1.0" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/terser": { - "version": "5.31.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", - "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "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" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, + "node_modules/react-router": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz", + "integrity": "sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==", "license": "MIT", - "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=20.0.0" }, "peerDependencies": { - "webpack": "^5.1.0" + "react": ">=18", + "react-dom": ">=18" }, "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { + "react-dom": { "optional": true } } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, + "node_modules/react-router-dom": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.0.tgz", + "integrity": "sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==", "license": "MIT", - "peer": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "react-router": "7.5.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=20.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" } }, - "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, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "license": "MIT", - "peer": true - }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, "engines": { "node": ">=18" } }, - "node_modules/test-exclude/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/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", - "peer": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/react-time-ago": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.3.3.tgz", + "integrity": "sha512-5kh2Kuu/UhHzcZrGvf3GUrF2d+IXjkIXif5MR2iDWIfSqQuBW27/ejN/tmzJBRyPiryYTgbDIG6AZFJ4RW3yfw==", "license": "MIT", "dependencies": { - "any-promise": "^1.0.0" + "memoize-one": "^6.0.0", + "prop-types": "^15.8.1", + "raf": "^3.4.1" + }, + "peerDependencies": { + "javascript-time-ago": "^2.3.7", + "react": ">=0.16.8", + "react-dom": ">=0.16.8" } }, - "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==", + "node_modules/react-zoom-pan-pinch": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.7.0.tgz", + "integrity": "sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==", "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, "engines": { - "node": ">=0.8" + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true, "license": "MIT" }, - "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", - "dev": true, + "node_modules/regexparam": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", + "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", "license": "MIT", "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=8" } }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "node_modules/relative-time-format": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.1.6.tgz", + "integrity": "sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==", + "license": "MIT" + }, + "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": ">=14.0.0" + "node": ">=0.10.0" } }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "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": ">=14.0.0" + "node": ">=4" } }, - "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==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=8.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.2" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "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": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" + "queue-microtask": "^1.2.2" } }, - "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==", + "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", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "license": "MIT" }, - "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==", + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "engines": { + "node": ">=v12.22.7" } }, - "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==", - "license": "Apache-2.0" - }, - "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/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, - "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==", + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, + "license": "ISC", "bin": { - "json5": "lib/cli.js" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "license": "0BSD" + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "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": { - "tslib": "^1.8.1" + "shebang-regex": "^3.0.0" }, "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": ">=8" } }, - "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/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "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": ">=0.6.11 <=0.7.0 || >=0.7.3" + "node": ">=8" } }, - "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==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } + "license": "ISC" }, - "node_modules/type-fest": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", - "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "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": "(MIT OR CC0-1.0)", + "license": "ISC", "engines": { - "node": ">=16" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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" - }, + "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==", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "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==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "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", - "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": ">= 0.8" } }, - "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==", + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "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": { - "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" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "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" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "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/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "node_modules/string-width-cjs/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": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=14.17" + "node": ">=8" } }, - "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==", + "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": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "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": { - "@fastify/busboy": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=14.0" + "node": ">=8" } }, - "node_modules/undici-types": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", - "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/strip-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": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "node": ">=12" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "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": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "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": ">=4" + "node": ">=8" } }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, - "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" - } + "license": "MIT" }, - "node_modules/unified-engine": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/unified-engine/-/unified-engine-11.2.1.tgz", - "integrity": "sha512-xBAdZ8UY2X4R9Hm6X6kMne4Nz0PlpOc1oE6DPeqJnewr5Imkb8uT5Eyvy1h7xNekPL3PSWh3ZJyNrMW6jnNQBg==", + "node_modules/synckit": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.3.tgz", + "integrity": "sha512-szhWDqNNI9etJUvbZ1/cx1StnZx8yMmFxme48SwR4dty4ioSY50KEZlpv0qAfgc1fpRzuh9hBXEzoCpJ779dLg==", "dev": true, "license": "MIT", "dependencies": { - "@types/concat-stream": "^2.0.0", - "@types/debug": "^4.0.0", - "@types/is-empty": "^1.0.0", - "@types/node": "^20.0.0", - "@types/unist": "^3.0.0", - "concat-stream": "^2.0.0", - "debug": "^4.0.0", - "extend": "^3.0.0", - "glob": "^10.0.0", - "ignore": "^5.0.0", - "is-empty": "^1.0.0", - "is-plain-obj": "^4.0.0", - "load-plugin": "^6.0.0", - "parse-json": "^7.0.0", - "trough": "^2.0.0", - "unist-util-inspect": "^8.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0", - "vfile-reporter": "^8.0.0", - "vfile-statistics": "^3.0.0", - "yaml": "^2.0.0" + "@pkgr/core": "^0.2.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/synckit" } }, - "node_modules/unified-engine/node_modules/@types/node": { - "version": "20.14.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.13.tgz", - "integrity": "sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==", - "dev": true, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz", + "integrity": "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" + "engines": { + "node": ">=6" } }, - "node_modules/unified-engine/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==", + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "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" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" } }, - "node_modules/unified-engine/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==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/unified-engine/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/unified-engine/node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "node_modules/unified-engine/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==", + "node_modules/tldts": { + "version": "6.1.85", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.85.tgz", + "integrity": "sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=14.16" + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.85" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/unified-engine/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "node_modules/tldts-core": { + "version": "6.1.85", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.85.tgz", + "integrity": "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==", "dev": true, "license": "MIT" }, - "node_modules/unified-engine/node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "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": "ISC", - "bin": { - "yaml": "bin.mjs" + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8.0" } }, - "node_modules/unist-util-inspect": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.1.0.tgz", - "integrity": "sha512-mOlg8Mp33pR0eeFpo5d2902ojqFFOKMMG2hF8bmH7ZlhnmjFgh0NI3/ZDwdaBJNbvrS7LZFVrBVtIE9KZ9s7vQ==", + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@types/unist": "^3.0.0" + "tldts": "^6.1.32" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=16" } }, - "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==", + "node_modules/tr46": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", + "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "punycode": "^2.3.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" + "engines": { + "node": ">=18.12" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "node_modules/tsconfck": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", + "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" + "bin": { + "tsconfck": "bin/tsconfck.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "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": { - "@types/unist": "^2.0.2" + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "4.39.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", + "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unist-util-stringify-position/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } }, - "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==", + "node_modules/typescript-eslint": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.1.tgz", + "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "@typescript-eslint/eslint-plugin": "8.29.1", + "@typescript-eslint/parser": "8.29.1", + "@typescript-eslint/utils": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "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==", + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" + "@fastify/busboy": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=14.0" } }, "node_modules/universalify": { @@ -15363,9 +6559,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -15383,8 +6579,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -15399,7 +6595,6 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -15411,228 +6606,34 @@ "dev": true, "license": "MIT", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "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-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.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", - "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-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/vfile-message/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/vfile-reporter": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-8.1.1.tgz", - "integrity": "sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/supports-color": "^8.0.0", - "string-width": "^6.0.0", - "supports-color": "^9.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0", - "vfile-sort": "^4.0.0", - "vfile-statistics": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-reporter/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/vfile-reporter/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/vfile-sort": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-4.0.0.tgz", - "integrity": "sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-statistics": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-3.0.0.tgz", - "integrity": "sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile/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" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "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, + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", + "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -15641,18 +6642,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -15662,6 +6670,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -15670,105 +6681,101 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vite-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", - "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", + "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/vite-plugin-eslint": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz", - "integrity": "sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==", + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^4.2.1", - "@types/eslint": "^8.4.5", - "rollup": "^2.77.2" + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" }, "peerDependencies": { - "eslint": ">=7", - "vite": ">=2" - } - }, - "node_modules/vite-plugin-eslint/node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" + "vite": "*" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependenciesMeta": { + "vite": { + "optional": true + } } }, "node_modules/vitest": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", - "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.4", - "@vitest/pretty-format": "^2.0.4", - "@vitest/runner": "2.0.4", - "@vitest/snapshot": "2.0.4", - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.4", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", + "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.1.1", + "@vitest/mocker": "3.1.1", + "@vitest/pretty-format": "^3.1.1", + "@vitest/runner": "3.1.1", + "@vitest/snapshot": "3.1.1", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.1", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.1", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.4", - "@vitest/ui": "2.0.4", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.1.1", + "@vitest/ui": "3.1.1", "happy-dom": "*", "jsdom": "*" }, @@ -15776,6 +6783,9 @@ "@edge-runtime/vm": { "optional": true }, + "@types/debug": { + "optional": true + }, "@types/node": { "optional": true }, @@ -15822,28 +6832,6 @@ "node": ">=18" } }, - "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/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -15854,112 +6842,6 @@ "node": ">=12" } }, - "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/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", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/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", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -15984,13 +6866,13 @@ } }, "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { - "tr46": "^5.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { @@ -16001,6 +6883,7 @@ "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" @@ -16012,89 +6895,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "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/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -16118,15 +6918,14 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/wouter": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.3.1.tgz", - "integrity": "sha512-Fea/W5OHl8WOLgxpqx5jCheWjXXHYHaq33UNfgs7ewS9hXA+cBhvFTf3atxS/M5RBa1dQTXHZLE2J++9QKSkPA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.6.0.tgz", + "integrity": "sha512-l11eR4urCc+CbY8+pV8HKFHxEqMgffss9aVB1XwiSkLDtH3cI6XpCa50cOzREzL0KwQqrwCVE5dCyeNcCgFpPg==", "license": "Unlicense", "dependencies": { "mitt": "^3.0.1", @@ -16157,6 +6956,7 @@ "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", @@ -16170,49 +6970,18 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, "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", @@ -16223,42 +6992,19 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/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==", + "node_modules/wrap-ansi-cjs/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": { - "color-convert": "^2.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -16281,18 +7027,23 @@ "node": ">=8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "node_modules/wrap-ansi/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": "ISC", - "peer": true + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, "license": "MIT", "engines": { @@ -16345,16 +7096,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -16406,13 +7147,25 @@ "node": ">=8" } }, + "node_modules/yargs/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/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", - "peer": true, "engines": { "node": ">=10" }, @@ -16432,17 +7185,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/web/package.json b/web/package.json index 133d29b..42295ed 100644 --- a/web/package.json +++ b/web/package.json @@ -4,72 +4,69 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "build": "tsc -b && vite build", "dev:mock": "VITE_MOCK=true vite", - "build": "tsc && vite build", - "lint": "eslint .", + "dev": "vite", + "generate": "NODE_OPTIONS=--experimental-strip-types NODE_NO_WARNINGS=1 node dataset-generate.ts", "lint:report": "eslint --output-file eslint_report.json --format json src", + "lint": "eslint .", "preview": "vite preview", - "test": "vitest", - "test:coverage": "vitest run --coverage" + "test:coverage": "vitest run --coverage", + "test": "vitest" }, "dependencies": { - "@headlessui/react": "2.1.2", - "@heroicons/react": "2.1.5", - "@tailwindcss/forms": "0.5.7", - "@tanstack/react-query": "5.51.15", - "@tanstack/react-query-devtools": "5.51.15", - "classnames": "2.5.1", - "graphology": "0.25.4", + "@headlessui/react": "2.2.1", + "@heroicons/react": "2.2.0", + "@tailwindcss/vite": "4.1.3", + "@tanstack/react-query": "5.72.2", + "@tanstack/react-query-devtools": "5.72.2", + "clsx": "2.1.1", + "graphology": "0.26.0", "graphology-layout": "0.6.1", "graphology-traversal": "0.3.1", - "graphology-types": "0.24.7", + "graphology-types": "0.24.8", "graphology-utils": "2.5.2", - "javascript-time-ago": "2.5.10", - "react": "18.3.1", - "react-dom": "18.3.1", - "react-router-dom": "6.25.1", + "javascript-time-ago": "2.5.11", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-router-dom": "7.5.0", "react-time-ago": "7.3.3", - "react-zoom-pan-pinch": "3.6.1", - "wouter": "3.3.1" + "react-zoom-pan-pinch": "3.7.0", + "wouter": "3.6.0" }, "devDependencies": { - "@babel/core": "7.25.2", - "@testing-library/jest-dom": "6.4.8", - "@testing-library/react": "16.0.0", - "@types/react": "18.3.3", - "@types/react-dom": "18.3.0", - "@typescript-eslint/eslint-plugin": "7.18.0", - "@typescript-eslint/parser": "7.18.0", - "@vitejs/plugin-react": "4.3.1", - "@vitest/coverage-v8": "2.0.4", - "autoprefixer": "10.4.19", - "babel-loader": "9.1.3", - "eslint-config-prettier": "9.1.0", - "eslint-config-react-app": "7.0.1", - "eslint-import-resolver-typescript": "3.6.1", - "eslint-plugin-import": "2.29.1", - "eslint-plugin-mdx": "3.1.5", - "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "7.35.0", - "eslint-plugin-react-hooks": "4.6.2", - "jsdom": "24.1.1", - "msw": "2.3.4", - "postcss": "8.4.40", - "prettier": "3.3.3", + "@eslint/js": "9.24.0", + "@testing-library/dom": "10.4.0", + "@testing-library/react": "16.3.0", + "@types/js-yaml": "4.0.9", + "@types/react": "19.1.0", + "@types/react-dom": "19.1.2", + "@vitejs/plugin-react": "4.3.4", + "@vitest/coverage-v8": "3.1.1", + "@vitest/eslint-plugin": "1.1.42", + "autoprefixer": "10.4.21", + "eslint": "9.24.0", + "eslint-config-prettier": "10.1.2", + "eslint-plugin-prettier": "5.2.6", + "eslint-plugin-react-hooks": "5.2.0", + "eslint-plugin-react-refresh": "0.4.19", + "globals": "16.0.0", + "jsdom": "26.0.0", + "msw": "2.7.3", + "prettier": "3.5.3", "prop-types": "15.8.1", - "tailwindcss": "3.4.7", - "typescript": "5.5.4", - "vite": "5.3.5", - "vite-plugin-eslint": "1.8.1", - "vitest": "2.0.4", + "typescript": "5.8.3", + "typescript-eslint": "8.29.1", + "vite": "6.2.6", + "vite-tsconfig-paths": "5.1.4", + "vitest": "3.1.1", "vitest-github-actions-reporter": "0.11.1" }, "volta": { - "node": "22.5.1", - "npm": "10.8.2" + "node": "23.11.0", + "npm": "10.9.2" }, "msw": { "workerDirectory": "public" } -} \ No newline at end of file +} diff --git a/web/postcss.config.cjs b/web/postcss.config.cjs deleted file mode 100644 index 9f23996..0000000 --- a/web/postcss.config.cjs +++ /dev/null @@ -1,7 +0,0 @@ -// eslint-disable-next-line no-undef -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/web/public/mockServiceWorker.js b/web/public/mockServiceWorker.js index cbd28e5..34057e8 100644 --- a/web/public/mockServiceWorker.js +++ b/web/public/mockServiceWorker.js @@ -8,8 +8,8 @@ * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.3.4' -const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423' +const PACKAGE_VERSION = '2.7.3' +const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() @@ -62,7 +62,12 @@ self.addEventListener('message', async function (event) { sendToClient(client, { type: 'MOCKING_ENABLED', - payload: true, + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, }) break } @@ -155,6 +160,10 @@ async function handleRequest(event, requestId) { async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) + if (activeClientIds.has(event.clientId)) { + return client + } + if (client?.frameType === 'top-level') { return client } @@ -183,12 +192,26 @@ async function getResponse(event, client, requestId) { const requestClone = request.clone() function passthrough() { - const headers = Object.fromEntries(requestClone.headers.entries()) + // Cast the request headers to a new Headers instance + // so the headers can be manipulated with. + const headers = new Headers(requestClone.headers) + + // Remove the "accept" header value that marked this request as passthrough. + // This prevents request alteration and also keeps it compliant with the + // user-defined CORS policies. + const acceptHeader = headers.get('accept') + if (acceptHeader) { + const values = acceptHeader.split(',').map((value) => value.trim()) + const filteredValues = values.filter( + (value) => value !== 'msw/passthrough', + ) - // Remove internal MSW request header so the passthrough request - // complies with any potential CORS preflight checks on the server. - // Some servers forbid unknown request headers. - delete headers['x-msw-intention'] + if (filteredValues.length > 0) { + headers.set('accept', filteredValues.join(', ')) + } else { + headers.delete('accept') + } + } return fetch(requestClone, { headers }) } diff --git a/web/src/components/AggregatedBlockSummary.tsx b/web/src/components/AggregatedBlockSummary.tsx index 0a98dc6..dce6230 100644 --- a/web/src/components/AggregatedBlockSummary.tsx +++ b/web/src/components/AggregatedBlockSummary.tsx @@ -4,7 +4,7 @@ import { XCircleIcon, ArrowTopRightOnSquareIcon, } from '@heroicons/react/20/solid'; -import classNames from 'classnames'; +import classNames from 'clsx'; import { Link } from 'wouter'; import { ProcessedData, WeightedNodeAttributes } from '@app/types/graph'; @@ -19,7 +19,7 @@ export default function AggregatedBlockSummary({ frameIds, blockRoot }: Aggregat const { slotsPerEpoch } = useEthereum(); const { clearAll, setFrameBlock } = useSelection(); const results = useFrameQueries(frameIds); - if (results.some((r) => r.isLoading)) { + if (results.some(r => r.isLoading)) { return ; } @@ -29,7 +29,7 @@ export default function AggregatedBlockSummary({ frameIds, blockRoot }: Aggregat return acc; }, []), ); - const nodeId = graph.nodes().find((id) => graph.getNodeAttribute(id, 'blockRoot') === blockRoot); + const nodeId = graph.nodes().find(id => graph.getNodeAttribute(id, 'blockRoot') === blockRoot); const node = nodeId ? graph.getNodeAttributes(nodeId) : undefined; if (!node) { diff --git a/web/src/components/AggregatedFramesSummary.tsx b/web/src/components/AggregatedFramesSummary.tsx index 5c7717a..40923e5 100644 --- a/web/src/components/AggregatedFramesSummary.tsx +++ b/web/src/components/AggregatedFramesSummary.tsx @@ -1,10 +1,9 @@ import { MagnifyingGlassIcon, ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; -import classNames from 'classnames'; +import classNames from 'clsx'; import ReactTimeAgo from 'react-time-ago'; import { Link } from 'wouter'; import { ProcessedData, WeightedNodeAttributes } from '@app/types/graph'; -import { truncateHash } from '@app/utils/strings'; import Download from '@components/Download'; import Loading from '@components/Loading'; import useSelection from '@contexts/selection'; @@ -14,7 +13,7 @@ import { aggregateProcessedData } from '@utils/graph'; export default function AggregatedFramesSummary({ ids }: { ids: string[] }) { const { clearAll } = useSelection(); const results = useFrameQueries(ids); - if (results.some((r) => r.isLoading)) { + if (results.some(r => r.isLoading)) { return ; } diff --git a/web/src/components/AggregatedNode.tsx b/web/src/components/AggregatedNode.tsx index b5a0335..9fc7dd4 100644 --- a/web/src/components/AggregatedNode.tsx +++ b/web/src/components/AggregatedNode.tsx @@ -1,7 +1,7 @@ import { useState, memo } from 'react'; import { EyeIcon, CheckIcon, FlagIcon } from '@heroicons/react/20/solid'; -import classNames from 'classnames'; +import classNames from 'clsx'; import ProgressCircle from '@components/ProgressCircle'; diff --git a/web/src/components/BYOFrameBlockSummary.tsx b/web/src/components/BYOFrameBlockSummary.tsx index 269f8b7..87ec687 100644 --- a/web/src/components/BYOFrameBlockSummary.tsx +++ b/web/src/components/BYOFrameBlockSummary.tsx @@ -1,17 +1,13 @@ -import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; import ReactTimeAgo from 'react-time-ago'; -import { Link } from 'wouter'; import Download from '@components/Download'; import Loading from '@components/Loading'; import useEthereum from '@contexts/ethereum'; import useFocus from '@contexts/focus'; -import useSelection, { FrameBlock } from '@contexts/selection'; -import { useFrameQuery } from '@hooks/useQuery'; +import { FrameBlock } from '@contexts/selection'; import { truncateHash } from '@utils/strings'; -export default function BYOFrameBlockSummary({ frameId, blockRoot }: FrameBlock) { - const { clearAll } = useSelection(); +export default function BYOFrameBlockSummary({ blockRoot }: FrameBlock) { const { byoData: data } = useFocus(); const { slotsPerEpoch } = useEthereum(); @@ -19,7 +15,7 @@ export default function BYOFrameBlockSummary({ frameId, blockRoot }: FrameBlock) return ; } - const node = data.frame?.data?.fork_choice_nodes?.find((n) => n.block_root === blockRoot); + const node = data.frame?.data?.fork_choice_nodes?.find(n => n.block_root === blockRoot); if (!node) { return ; diff --git a/web/src/components/ConcatNode.tsx b/web/src/components/ConcatNode.tsx new file mode 100644 index 0000000..506c789 --- /dev/null +++ b/web/src/components/ConcatNode.tsx @@ -0,0 +1,44 @@ +import classNames from 'clsx'; + +function ConcatNode({ + id, + slotStart, + slotEnd, + x, + y, + radius, + className, +}: { + id?: string; + slotStart: number; + slotEnd: number; + x: number; + y: number; + radius: number; + className?: string; +}) { + return ( +
+

CONCAT

+

+ {slotStart} → {slotEnd} +

+
+ ); +} + +export default ConcatNode; diff --git a/web/src/components/Control.tsx b/web/src/components/Control.tsx index 2d50f45..5ee1f9a 100644 --- a/web/src/components/Control.tsx +++ b/web/src/components/Control.tsx @@ -16,9 +16,9 @@ function TimelineControl() { const controlRef = useRef(null); const blurAllInputs = () => { const inputs = controlRef.current?.querySelectorAll('input'); - inputs?.forEach((input) => input.blur()); + inputs?.forEach(input => input.blur()); }; - useOutsideInteraction(controlRef, blurAllInputs); + useOutsideInteraction(controlRef as React.RefObject, blurAllInputs); const { setTime: setFocusedTime, @@ -71,7 +71,7 @@ function TimelineControl() { setCurrentSlot(value)} + onChange={value => setCurrentSlot(value)} type="number" /> @@ -85,7 +85,7 @@ function TimelineControl() { setCurrentEpoch(value)} + onChange={value => setCurrentEpoch(value)} type="number" /> @@ -100,7 +100,7 @@ function TimelineControl() { setFocusedTime(value)} + onChange={value => setFocusedTime(value)} type="datetime-local" /> diff --git a/web/src/components/Download.tsx b/web/src/components/Download.tsx index 3da4687..02705ff 100644 --- a/web/src/components/Download.tsx +++ b/web/src/components/Download.tsx @@ -1,5 +1,5 @@ import { ArrowDownTrayIcon } from '@heroicons/react/20/solid'; -import classNames from 'classnames'; +import classNames from 'clsx'; export default function Download({ data, diff --git a/web/src/components/Edge.tsx b/web/src/components/Edge.tsx index 4278e05..746a94f 100644 --- a/web/src/components/Edge.tsx +++ b/web/src/components/Edge.tsx @@ -1,6 +1,6 @@ import { memo } from 'react'; -import classNames from 'classnames'; +import classNames from 'clsx'; function Edge({ x1, diff --git a/web/src/components/EditableInput.tsx b/web/src/components/EditableInput.tsx index f6609b3..b833458 100644 --- a/web/src/components/EditableInput.tsx +++ b/web/src/components/EditableInput.tsx @@ -79,7 +79,7 @@ function EditableInput({ value, onChange, type, id }: Props type={type} className="pl-2 bg-stone-100 dark:bg-stone-500 block w-full rounded-md border-0 py-1 text-stone-900 dark:text-stone-100 shadow-sm ring-1 ring-inset ring-stone-300 dark:ring-stone-700 placeholder:text-stone-400 focus:ring-2 focus:ring-inset focus:ring-stone-600 text-sm leading-6" value={formattedValue(inputValue)} - onChange={(e) => setInputValue(e.target.value as unknown as ValueType[T])} + onChange={e => setInputValue(e.target.value as unknown as ValueType[T])} onBlur={handleSave} step="1" onKeyDownCapture={handleKeyPress} diff --git a/web/src/components/FrameBlockSummary.tsx b/web/src/components/FrameBlockSummary.tsx index fb96478..63f0ead 100644 --- a/web/src/components/FrameBlockSummary.tsx +++ b/web/src/components/FrameBlockSummary.tsx @@ -21,7 +21,7 @@ export default function FrameBlockSummary({ frameId, blockRoot }: FrameBlock) { return ; } - const node = data.frame?.data?.fork_choice_nodes?.find((n) => n.block_root === blockRoot); + const node = data.frame?.data?.fork_choice_nodes?.find(n => n.block_root === blockRoot); if (!node) { return ; diff --git a/web/src/components/FrameSummary.tsx b/web/src/components/FrameSummary.tsx index 057f447..3c04868 100644 --- a/web/src/components/FrameSummary.tsx +++ b/web/src/components/FrameSummary.tsx @@ -76,7 +76,7 @@ export default function FrameSummary({ id }: { id: string }) {
Labels
- {data.frame.metadata.labels?.map((label) => { + {data.frame.metadata.labels?.map(label => { const [key, value] = parseLabel(label); return (
diff --git a/web/src/components/Icon.tsx b/web/src/components/Icon.tsx index 317e6a0..e4f7bca 100644 --- a/web/src/components/Icon.tsx +++ b/web/src/components/Icon.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -import classNames from 'classnames'; +import classNames from 'clsx'; export default function Icon({ className, diff --git a/web/src/components/Loading.tsx b/web/src/components/Loading.tsx index b0bde28..37ea360 100644 --- a/web/src/components/Loading.tsx +++ b/web/src/components/Loading.tsx @@ -1,4 +1,4 @@ -import classNames from 'classnames'; +import classNames from 'clsx'; import Logo from '@assets/forky_logo.png'; diff --git a/web/src/components/ModeToggle.tsx b/web/src/components/ModeToggle.tsx index 53e75d1..e342929 100644 --- a/web/src/components/ModeToggle.tsx +++ b/web/src/components/ModeToggle.tsx @@ -1,19 +1,7 @@ import { useEffect } from 'react'; import { MoonIcon, SunIcon } from '@heroicons/react/20/solid'; - -export function hasDarkPreference() { - if (window.matchMedia) { - const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); - return darkModeMediaQuery.matches; - } - return false; -} - -export function hasDarkLocalStorage() { - if (!window.localStorage) return false; - return window.localStorage.isDarkMode === 'true'; -} +import { hasDarkLocalStorage, hasDarkPreference } from '@utils/darkmode'; export function ModeToggle() { useEffect(() => { diff --git a/web/src/components/Ruler.tsx b/web/src/components/Ruler.tsx index 8991194..f11f7bd 100644 --- a/web/src/components/Ruler.tsx +++ b/web/src/components/Ruler.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import classNames from 'classnames'; +import classNames from 'clsx'; interface RulerProps { summary: string; diff --git a/web/src/components/Share.tsx b/web/src/components/Share.tsx index fc875f7..c6c5965 100644 --- a/web/src/components/Share.tsx +++ b/web/src/components/Share.tsx @@ -25,7 +25,7 @@ function Share() { if (open) { setOpen(false); } - }, [location]); + }, [location, open]); return ( <> diff --git a/web/src/components/Slot.tsx b/web/src/components/Slot.tsx index 015a7b9..40771f8 100644 --- a/web/src/components/Slot.tsx +++ b/web/src/components/Slot.tsx @@ -1,6 +1,6 @@ import React, { useMemo, ReactNode } from 'react'; -import classNames from 'classnames'; +import classNames from 'clsx'; import { FrameMetaData } from '@app/types/api'; import Ruler from '@components/Ruler'; @@ -28,7 +28,7 @@ function Slot({ subMarks, slot, shouldFetch = false, segments }: Props) { const { data, isLoading, error } = useMetadataQuery({ slot }, shouldFetch); // prefetch framess - useFrameQueries(data?.map((frame) => frame.id) ?? [], Boolean(data) && shouldFetch); + useFrameQueries(data?.map(frame => frame.id) ?? [], Boolean(data) && shouldFetch); const groupedMarkers = useMemo(() => { const groupSize = 100 / segments; @@ -50,7 +50,7 @@ function Slot({ subMarks, slot, shouldFetch = false, segments }: Props) { return Object.entries(groups).map(([group, metadata]) => ( )); - }, [data?.map(({ id }) => id).join('-') ?? '', node, JSON.stringify(ids)]); + }, [data, slotStart, secondsPerSlot, segments, node, ids]); return ( {segments} - {metadata.map((meta) => ( + {metadata.map(meta => (
{ if (playing) stopTimer(); @@ -90,7 +90,7 @@ const TimeDrag = ({ multiplier, children }: { multiplier: number; children?: Rea requestIdRef.current = null; } setDragging(true); - }, [playing]); + }, [playing, stopTimer]); return (
(undefined); - -export type Data = { - frames?: FrameMetaData[]; - lastFetched: number; -}; - -export interface State { - padding: number; -} - -export interface HookProps { - padding: number; -} - -function useFrameMeta(props: HookProps): State { - const [padding, setPadding] = useState(props.padding); - - return { - padding, - }; -} - -interface Props extends HookProps { - children: ReactNode; -} - -export function Provider({ children, padding }: Props) { - const frameMeta = useFrameMeta({ padding }); - return {children}; -} - -export default function useContext() { - const context = reactUseContext(Context); - if (context === undefined) { - throw new Error('FrameMeta context must be used within a FrameMeta provider'); - } - return context; -} diff --git a/web/src/contexts/focus.tsx b/web/src/contexts/focus.tsx index 1a66bda..6bb2a2d 100644 --- a/web/src/contexts/focus.tsx +++ b/web/src/contexts/focus.tsx @@ -63,15 +63,15 @@ export function useValue(props: ValueProps): State { useEffect(() => { if (props.node !== node) setNode(props.node); - }, [props.node]); + }, [props.node, node]); useEffect(() => { if (props.byo !== byo) setBYO(props.byo); - }, [props.byo]); + }, [props.byo, byo]); useEffect(() => { if (props.frameId !== frameId) setFrameId(props.frameId); - }, [props.frameId]); + }, [props.frameId, frameId]); const setTimeWrapper = useCallback( (update: number) => { @@ -88,13 +88,13 @@ export function useValue(props: ValueProps): State { const shiftTime = useCallback( (delta: number) => { - setTime((prevTime) => { + setTime(prevTime => { const newTime = prevTime + delta; if (newTime < genesisTime) return prevTime; return newTime; }); }, - [setTime], + [setTime, genesisTime], ); const step = useCallback(() => { @@ -145,7 +145,7 @@ export function useValue(props: ValueProps): State { setTime(genesisTime + targetEpoch * slotsPerEpoch * secondsPerSlot * 1000); if (playing) timer.current = requestAnimationFrame(step); }, - [setTime, genesisTime, secondsPerSlot, slotsPerEpoch, playing], + [setTime, genesisTime, secondsPerSlot, slotsPerEpoch, step, playing], ); const setBYOData = useCallback( @@ -160,7 +160,7 @@ export function useValue(props: ValueProps): State { return () => { stop(); }; - }, [playing]); + }, [playing, play, stop]); useEffect(() => { return () => { diff --git a/web/src/hooks/__tests__/useQuery.test.ts b/web/src/hooks/__tests__/useQuery.test.ts index 12cafa9..9923a43 100644 --- a/web/src/hooks/__tests__/useQuery.test.ts +++ b/web/src/hooks/__tests__/useQuery.test.ts @@ -25,7 +25,7 @@ describe('useQuery', () => { }); }); - describe('useNowQuery', () => { + describe('useSpecQuery', () => { it('should return metadata', async () => { const { result } = renderHook(() => useSpecQuery(), { wrapper: ProviderWrapper(), diff --git a/web/src/hooks/useActive.ts b/web/src/hooks/useActive.ts index cb186e4..a30d1d4 100644 --- a/web/src/hooks/useActive.ts +++ b/web/src/hooks/useActive.ts @@ -15,7 +15,7 @@ export function findLatestFrameIdPerNode( focusedNode?: string, ): State { // Filter metadata - metadata = metadata.filter((frame) => { + metadata = metadata.filter(frame => { // only frames with fetched_at before focusedTime if (new Date(frame.fetched_at).getTime() >= focusedTime) return false; diff --git a/web/src/hooks/useGraph.ts b/web/src/hooks/useGraph.ts index 9d93f71..09239f6 100644 --- a/web/src/hooks/useGraph.ts +++ b/web/src/hooks/useGraph.ts @@ -45,7 +45,7 @@ function generateNodeData({ spacingX: number; spacingY: number; }): NodeData[] { - return graph.mapNodes((node) => { + return graph.mapNodes(node => { return { id: node, x: @@ -66,7 +66,7 @@ function generateEdgeData({ spacingX: number; spacingY: number; }): EdgeData[] { - return graph.mapEdges((edge) => { + return graph.mapEdges(edge => { return { id: edge, canonical: graph.getSourceAttribute(edge, 'canonical'), @@ -91,11 +91,11 @@ function generateEdgeData({ function generateOffsetData(graph: Graph): OffsetData { const minOffset = graph - .mapNodes((node) => graph.getNodeAttribute(node, 'offset')) + .mapNodes(node => graph.getNodeAttribute(node, 'offset')) .reduce((min, offset) => Math.min(min, offset), 0) ?? 0; const maxOffset = graph - .mapNodes((node) => graph.getNodeAttribute(node, 'offset')) + .mapNodes(node => graph.getNodeAttribute(node, 'offset')) .reduce((max, offset) => Math.max(max, offset), 0) ?? 0; return { minOffset, @@ -112,17 +112,12 @@ export default function useGraph({ spacingX: number; spacingY: number; }) { - const dataId = data - .map((d) => d.graph.getAttribute('id')) - .sort() - .join('_'); - const { edges, nodes, offset, attributes, type } = useMemo<{ edges: EdgeData[]; nodes: NodeData[]; offset: OffsetData; attributes: GraphAttributes; - type: 'aggregated' | 'weighted' | 'empty'; + type: 'aggregated' | 'weighted' | 'concat' | 'empty'; }>(() => { let graph: Graph; let type: 'aggregated' | 'weighted' | 'empty' = 'empty'; @@ -150,7 +145,7 @@ export default function useGraph({ attributes: graph.getAttributes(), type, }; - }, [dataId, spacingX, spacingY]); + }, [spacingX, spacingY, data]); return { ...attributes, ...offset, edges, nodes, type }; } diff --git a/web/src/hooks/useOutsideInteraction.ts b/web/src/hooks/useOutsideInteraction.ts index aa35d2a..d256abe 100644 --- a/web/src/hooks/useOutsideInteraction.ts +++ b/web/src/hooks/useOutsideInteraction.ts @@ -1,11 +1,14 @@ -import { useEffect, RefObject } from 'react'; +import { useEffect, RefObject, useCallback } from 'react'; const useOutsideInteraction = (ref: RefObject, callback: () => void): void => { - const handleInteractionOutside = (event: MouseEvent | TouchEvent) => { - if (ref.current && !ref.current.contains(event.target as Node)) { - callback(); - } - }; + const handleInteractionOutside = useCallback( + (event: MouseEvent | TouchEvent) => { + if (ref.current && !ref.current.contains(event.target as Node)) { + callback(); + } + }, + [ref, callback], + ); useEffect(() => { document.addEventListener('mousedown', handleInteractionOutside); @@ -15,7 +18,7 @@ const useOutsideInteraction = (ref: RefObject, callback: () => void document.removeEventListener('mousedown', handleInteractionOutside); document.removeEventListener('touchstart', handleInteractionOutside); }; - }, [ref, callback]); + }, [handleInteractionOutside]); }; export default useOutsideInteraction; diff --git a/web/src/hooks/usePointer.ts b/web/src/hooks/usePointer.ts index 037cd5a..8d44ec2 100644 --- a/web/src/hooks/usePointer.ts +++ b/web/src/hooks/usePointer.ts @@ -13,32 +13,31 @@ const defaultPointerState: PointerState = { x: null, up: false, }; - export default function usePointer({ listen }: PointerProps): PointerState { const [pointerState, setPointerState] = useState(defaultPointerState); - function handlePointerEvent(event: MouseEvent | TouchEvent) { - if (event instanceof MouseEvent) { - if (pointerState.x === event.clientX && pointerState.up === (event.type === 'mouseup')) { - return; - } - setPointerState({ - x: event.clientX, - up: event.type === 'mouseup', - }); - } else if (event instanceof TouchEvent) { - const touch = event.touches[0] as Touch | undefined; - if (pointerState.x === touch?.clientX && pointerState.up === (event.type === 'touchend')) { - return; + useEffect(() => { + function handlePointerEvent(event: MouseEvent | TouchEvent) { + if (event instanceof MouseEvent) { + if (pointerState.x === event.clientX && pointerState.up === (event.type === 'mouseup')) { + return; + } + setPointerState({ + x: event.clientX, + up: event.type === 'mouseup', + }); + } else if (event instanceof TouchEvent) { + const touch = event.touches[0] as Touch | undefined; + if (pointerState.x === touch?.clientX && pointerState.up === (event.type === 'touchend')) { + return; + } + setPointerState({ + x: touch?.clientX ?? pointerState.x, + up: event.type === 'touchend', + }); } - setPointerState({ - x: touch?.clientX ?? pointerState.x, - up: event.type === 'touchend', - }); } - } - useEffect(() => { if (listen) { document.addEventListener('mousemove', handlePointerEvent); document.addEventListener('mouseup', handlePointerEvent); @@ -56,7 +55,7 @@ export default function usePointer({ listen }: PointerProps): PointerState { document.removeEventListener('touchmove', handlePointerEvent); document.removeEventListener('touchend', handlePointerEvent); }; - }, [listen]); + }, [listen, pointerState.x, pointerState.up]); return pointerState; } diff --git a/web/src/hooks/useQuery.ts b/web/src/hooks/useQuery.ts index 3d48543..7c7aae8 100644 --- a/web/src/hooks/useQuery.ts +++ b/web/src/hooks/useQuery.ts @@ -58,7 +58,7 @@ export function useFrameQuery(id: string, enabled = true) { export function useFrameQueries(ids: string[], enabled = true) { return useQueries({ - queries: ids.map((id) => ({ + queries: ids.map(id => ({ queryKey: ['frame', id], queryFn: () => fetchFrame(id), enabled, diff --git a/web/src/index.tsx b/web/src/index.tsx index 78bb254..caad2d9 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -1,4 +1,4 @@ -import '@styles/global.css'; +import './styles/global.css'; import React from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; @@ -26,8 +26,14 @@ ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( {() => } - {({ node }) => } - {({ node }) => } + + {params => { + const pathParts = params['*'].split('/'); + const hasEvents = pathParts[pathParts.length - 1] === 'events'; + const nodePath = hasEvents ? pathParts.slice(0, -1).join('/') : params['*']; + return ; + }} + {({ id }) => } diff --git a/web/src/mocks/handlers.ts b/web/src/mocks/handlers.ts index dba0886..73965c7 100644 --- a/web/src/mocks/handlers.ts +++ b/web/src/mocks/handlers.ts @@ -45,7 +45,7 @@ export const handlers: Array = [ http.post(`${BASE_URL}api/v1/metadata/nodes`, () => { return HttpResponse.json({ data: nodes }); }), - http.post(`${BASE_URL}api/v1/metadata`, async ({ request }) => { + http.post(`${BASE_URL}api/v1/metadata`, async () => { const { slot, epoch } = getNow(); const data: Response = { data: { @@ -66,7 +66,7 @@ export const handlers: Array = [ }; return HttpResponse.json(data); }), - http.get(`${BASE_URL}api/v1/frames/:id`, ({ request, params, cookies }) => { + http.get(`${BASE_URL}api/v1/frames/:id`, ({ params }) => { const id = Array.isArray(params.id) ? params.id[0] : params.id; const { slot, epoch } = getNow(); const data: Response = { diff --git a/web/src/parts/BYOFooter.tsx b/web/src/parts/BYOFooter.tsx index 5e1cd40..3bdec89 100644 --- a/web/src/parts/BYOFooter.tsx +++ b/web/src/parts/BYOFooter.tsx @@ -1,4 +1,4 @@ -import { memo, useRef, useState, useEffect } from 'react'; +import { memo, useRef, useState, useEffect, useCallback } from 'react'; import { DocumentArrowUpIcon } from '@heroicons/react/24/solid'; @@ -96,43 +96,47 @@ function BYOFooter() { const fileInputRef = useRef(null); const { setBYOData } = useFocus(); - const readFile = (file: File) => { - const reader = new FileReader(); - - reader.onload = (e) => { - const text = e.target?.result; - try { - const jsonData = JSON.parse(text as string); - const validation = validateForkChoiceData(jsonData); - - if (validation.isValid) { - const frame: Required = { - metadata: { - id: `${Math.random()}`, - node: 'byo', - fetched_at: new Date().toISOString(), - wall_clock_slot: 0, - wall_clock_epoch: 0, - }, - data: jsonData, - }; - setBYOData(processForkChoiceData(frame)); - } else { - setError(`Invalid fork choice json format: ${validation.message}`); + const readFile = useCallback( + (file: File) => { + const reader = new FileReader(); + + reader.onload = e => { + const text = e.target?.result; + try { + const jsonData = JSON.parse(text as string); + const validation = validateForkChoiceData(jsonData); + + if (validation.isValid) { + const frame: Required = { + metadata: { + id: `${Math.random()}`, + node: 'byo', + fetched_at: new Date().toISOString(), + wall_clock_slot: 0, + wall_clock_epoch: 0, + }, + data: jsonData, + }; + setBYOData(processForkChoiceData(frame)); + } else { + setError(`Invalid fork choice json format: ${validation.message}`); + } + } catch (error) { + // Not valid JSON + setError('The file is not valid JSON.'); } - } catch (error) { - // Not valid JSON - setError('The file is not valid JSON.'); - } - }; + }; - reader.onerror = (e) => { - console.error('Error reading file:', e); - setError('Error reading file'); - }; + reader.onerror = e => { + console.error('Error reading file:', e); + setError('Error reading file'); + }; + + reader.readAsText(file); // Read the file as text + }, + [setBYOData], + ); - reader.readAsText(file); // Read the file as text - }; useEffect(() => { const handleDragOver = (event: DragEvent) => { event.preventDefault(); @@ -167,7 +171,7 @@ function BYOFooter() { document.removeEventListener('drop', handleDrop); document.removeEventListener('dragleave', handleDragLeave); }; - }, []); + }, [readFile]); const handleFileInputChange = (event: React.ChangeEvent) => { const files = event.target.files; @@ -208,7 +212,7 @@ function BYOFooter() { e.stopPropagation()} + onClick={e => e.stopPropagation()} target="_blank" rel="noreferrer" > diff --git a/web/src/parts/Events.tsx b/web/src/parts/Events.tsx index d294ddb..f9bbef9 100644 --- a/web/src/parts/Events.tsx +++ b/web/src/parts/Events.tsx @@ -16,7 +16,7 @@ import { } from '@headlessui/react'; import { ArrowTopRightOnSquareIcon, CheckIcon, ChevronUpDownIcon } from '@heroicons/react/20/solid'; import { XMarkIcon } from '@heroicons/react/24/outline'; -import classNames from 'classnames'; +import classNames from 'clsx'; import ReactTimeAgo from 'react-time-ago'; import { useLocation, Link } from 'wouter'; @@ -26,11 +26,6 @@ import useEthereum from '@contexts/ethereum'; import useFocus from '@contexts/focus'; import { useMetadataQuery } from '@hooks/useQuery'; -const eventMap: Record = { - BEACON_API_ETH_V1_DEBUG_FORK_CHOICE_REORG: 'Reorg', - BEACON_API_ETH_V1_DEBUG_FORK_CHOICE_REORG_V2: 'Reorg', -}; - const colorMap: Record = { Reorg: 'text-red-600 dark:text-red-400', }; @@ -104,7 +99,7 @@ export default function Selection() { const previousLocation = useRef(isEventRoute ? '/' : location); useEffect(() => { if (!isEventRoute) previousLocation.current = location; - }, [location]); + }, [location, isEventRoute]); useEffect(() => { if (queryType.name === 'Relative') { @@ -157,7 +152,7 @@ export default function Selection() { } > >((acc, event) => { - const sharedEventId = event.labels?.find((label) => label.startsWith('xatu_event_id=')); + const sharedEventId = event.labels?.find(label => label.startsWith('xatu_event_id=')); const time = new Date(event.fetched_at).getTime(); if (event.event_source === 'xatu_reorg_event' && sharedEventId) { const isBefore = event.labels?.includes('xatu_reorg_frame_timing=before'); @@ -202,7 +197,7 @@ export default function Selection() { } return b.time - a.time; }); - }, [isEventRoute, data?.length]); + }, [isEventRoute, data]); return (
@@ -267,7 +262,7 @@ export default function Selection() {
- {queryOptions.map((option) => ( + {queryOptions.map(option => ( - {queryRelativeOptions.map((option) => ( + {queryRelativeOptions.map(option => ( @@ -368,7 +363,7 @@ export default function Selection() { setQuerySlot(value)} + onChange={value => setQuerySlot(value)} type="text" />
@@ -379,7 +374,7 @@ export default function Selection() { setQueryEpoch(value)} + onChange={value => setQueryEpoch(value)} type="text" />
@@ -435,7 +430,7 @@ export default function Selection() { - {events.map((event) => { + {events.map(event => { if (!event) return null; const time = new Date(event.time); const timeDiff = (time.getTime() - genesisTime) / 1000; diff --git a/web/src/parts/FrameFooter.tsx b/web/src/parts/FrameFooter.tsx index 3721726..e4da499 100644 --- a/web/src/parts/FrameFooter.tsx +++ b/web/src/parts/FrameFooter.tsx @@ -1,7 +1,7 @@ import { memo } from 'react'; import { RectangleGroupIcon, RectangleStackIcon } from '@heroicons/react/24/solid'; -import { useLocation, Link } from 'wouter'; +import { Link } from 'wouter'; import Download from '@components/Download'; import useAction from '@hooks/useActive'; @@ -9,8 +9,7 @@ import { useFrameQuery } from '@hooks/useQuery'; function FrameFooter() { const { ids } = useAction(); - const [location, setLocation] = useLocation(); - const { data, isLoading } = useFrameQuery(ids[0], ids.length > 0); + const { data } = useFrameQuery(ids[0], ids.length > 0); return (
(null); - const { nodes, edges, type, id, slotEnd, slotStart, head } = useGraph({ + const { nodes, edges, type, slotEnd, slotStart, head } = useGraph({ data, spacingX: SPACING_X, spacingY: SPACING_Y, @@ -59,7 +59,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un useEffect(() => { if (focused) ref.current?.zoomToElement('head', scaleMultiplier); - }, [nodes]); + }, [nodes, focused, scaleMultiplier]); const slotWidth = slotEnd - slotStart; @@ -84,18 +84,18 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un /> ); }); - }, [slotEnd, slotStart]); + }, [slotStart, slotsPerEpoch, slotWidth]); const handleFocus = useCallback(() => { ref.current?.resetTransform(); setScale(scaleMultiplier); ref.current?.zoomToElement('head', scaleMultiplier); setFocused(true); - }, [focused, ref.current, setFocused]); + }, [setFocused, scaleMultiplier]); const handleNavigateAggregatedView = useCallback(() => { navigate(`/`); - }, []); + }, [navigate]); const formattedSummary = useMemo(() => { return data @@ -147,14 +147,14 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un ); }); - }, [unique]); + }, [data, head]); const { formattedNodes, formattedEdges } = useMemo(() => { let newNodes: ReactNode[] = []; - const newEdges = edges.map((edge) => ( + const newEdges = edges.map(edge => ( { + newNodes = nodes.map(node => { const { canonical, blockRoot, @@ -201,8 +201,8 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un finalizedCheckpoints={finalizedCheckpoints} justifiedCheckpoints={justifiedCheckpoints} orphans={orphaned.length} - valid={validities.filter((v) => ['valid', 'optimistic'].includes(v.validity)).length} - optimistic={validities.filter((v) => v.validity === 'optimistic').length} + valid={validities.filter(v => ['valid', 'optimistic'].includes(v.validity)).length} + optimistic={validities.filter(v => v.validity === 'optimistic').length} total={data.length} type={type} hash={blockRoot} @@ -217,7 +217,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un ); }); } else if (type === 'weighted') { - newNodes = nodes.map((node) => { + newNodes = nodes.map(node => { const { canonical, checkpoint, @@ -256,7 +256,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un } return { formattedNodes: newNodes, formattedEdges: newEdges }; - }, [id, nodes, edges, slotEnd, type]); + }, [unique]); return ( <> @@ -331,7 +331,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un 1 * scaleMultiplier } minScale={0.1} - onZoom={(ref) => { + onZoom={ref => { if (focused) setFocused(false); setScale(ref.state.scale); }} diff --git a/web/src/parts/Selection.tsx b/web/src/parts/Selection.tsx index bb8caf2..09d563f 100644 --- a/web/src/parts/Selection.tsx +++ b/web/src/parts/Selection.tsx @@ -2,7 +2,7 @@ import { Fragment, useEffect } from 'react'; import { Dialog, Transition, TransitionChild, DialogPanel, DialogTitle } from '@headlessui/react'; import { XMarkIcon } from '@heroicons/react/24/outline'; -import classNames from 'classnames'; +import classNames from 'clsx'; import { useLocation } from 'wouter'; import AggregatedBlockSummary from '@components/AggregatedBlockSummary'; @@ -18,7 +18,7 @@ export default function Selection() { const [location] = useLocation(); const isBYO = location.startsWith('/byo'); - useEffect(clearAll, [location]); + useEffect(clearAll, [location, clearAll]); return (
diff --git a/web/src/parts/Stage.tsx b/web/src/parts/Stage.tsx index a268ee7..b27c7ae 100644 --- a/web/src/parts/Stage.tsx +++ b/web/src/parts/Stage.tsx @@ -16,9 +16,9 @@ export default function Stage() { }, [byo, stop]); useEffect(() => { if (byoData) stop(); - }, [byoData]); + }, [byoData, stop]); - const isLoading = !byo && results.every((result) => result.isLoading); + const isLoading = !byo && results.every(result => result.isLoading); let data: { frames: ProcessedData[]; loadedIds: string[] } = { frames: byoData ? [byoData] : [], loadedIds: byoData ? [byoData.frame.metadata.id] : [], diff --git a/web/src/styles/global.css b/web/src/styles/global.css index 85dd483..8429253 100644 --- a/web/src/styles/global.css +++ b/web/src/styles/global.css @@ -1,6 +1,4 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss"; /* fix for safari https://github.com/mdn/browser-compat-data/issues/17726 */ .drop-shadow-sm, diff --git a/web/src/utils/__tests__/functions.test.ts b/web/src/utils/__tests__/functions.test.ts index 3b772d9..7ca2e8f 100644 --- a/web/src/utils/__tests__/functions.test.ts +++ b/web/src/utils/__tests__/functions.test.ts @@ -1,5 +1,3 @@ -import { vi } from 'vitest'; - import { randomHex, randomInt, randomBigInt } from '@utils/functions'; describe('functions', () => { diff --git a/web/src/utils/__tests__/graph.test.ts b/web/src/utils/__tests__/graph.test.ts index a5e6044..bfe76aa 100644 --- a/web/src/utils/__tests__/graph.test.ts +++ b/web/src/utils/__tests__/graph.test.ts @@ -271,9 +271,13 @@ describe('graph', () => { * | * B * | \ - * C D + * C | * | | - * E F + * | D + * | | + * E | + * | + * F */ graph.addEdge('A', 'B'); graph.addEdge('B', 'C'); @@ -325,9 +329,15 @@ describe('graph', () => { * | * B —— * | \ - * D C + * | C + * | | + * D | * | \ | - * G F E + * | | E + * | | + * | F + * | + * G * | * H */ @@ -373,9 +383,15 @@ describe('graph', () => { * | * B —— * | \ \ - * C D F - * | | - * E G + * C | | + * | | | + * | D | + * | | | + * E | | + * | | + * | F + * | + * G */ expect(graph.getNodeAttribute('A', 'offset')).toBe(currentOffset); expect(graph.getNodeAttribute('B', 'offset')).toBe(currentOffset); @@ -416,7 +432,9 @@ describe('graph', () => { * | * B * | \ - * C D + * C \ + * | \ + * | D * | * E */ @@ -455,7 +473,9 @@ describe('graph', () => { * | * C * / | - * D E + * D | + * | + * E */ expect(graph.getNodeAttribute('A', 'offset')).toBe(currentOffset); expect(graph.getNodeAttribute('B', 'offset')).toBe(currentOffset); @@ -494,7 +514,9 @@ describe('graph', () => { * | * C * / | - * D E + * D | + * | + * E */ expect(graph.getNodeAttribute('A', 'offset')).toBe(currentOffset); expect(graph.getNodeAttribute('B', 'offset')).toBe(currentOffset); diff --git a/web/src/utils/darkmode.ts b/web/src/utils/darkmode.ts new file mode 100644 index 0000000..67c2ef3 --- /dev/null +++ b/web/src/utils/darkmode.ts @@ -0,0 +1,12 @@ +export function hasDarkPreference() { + if (window.matchMedia) { + const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + return darkModeMediaQuery.matches; + } + return false; +} + +export function hasDarkLocalStorage() { + if (!window.localStorage) return false; + return window.localStorage.isDarkMode === 'true'; +} diff --git a/web/src/utils/graph.ts b/web/src/utils/graph.ts index af10d48..c25fadb 100644 --- a/web/src/utils/graph.ts +++ b/web/src/utils/graph.ts @@ -42,7 +42,7 @@ export function getLastSlotFromNode(graph: Graph, node: string): number { if (children.length === 0) { return graph.getNodeAttribute(node, 'slot'); } - return Math.max(...children.map((child) => getLastSlotFromNode(graph, child))); + return Math.max(...children.map(child => getLastSlotFromNode(graph, child))); } export function countForksFromNode(graph: Graph, node: string): number { @@ -51,7 +51,7 @@ export function countForksFromNode(graph: Graph, node: string): number { return 0; } return ( - children.map((child) => countForksFromNode(graph, child)).reduce((a, b) => a + b, 0) + + children.map(child => countForksFromNode(graph, child)).reduce((a, b) => a + b, 0) + children.length - 1 ); @@ -104,7 +104,7 @@ export function applyNodeAttributeToAllChildren( ): void { const neighbors = graph.outNeighbors(id); - neighbors.forEach((childId) => { + neighbors.forEach(childId => { graph.updateNodeAttribute(childId, key, () => value); applyNodeAttributeToAllChildren(graph, childId, key, value); }); @@ -121,7 +121,7 @@ export function applyNodeOffsetToAllChildren( if (children.length === 0) return; if (children.length === 1) { - graph.updateNodeAttributes(children[0], (attributes) => ({ + graph.updateNodeAttributes(children[0], attributes => ({ ...attributes, canonical: false, offset: currentOffset, @@ -131,7 +131,7 @@ export function applyNodeOffsetToAllChildren( } const ordered = children - .map((child) => ({ + .map(child => ({ blockRoot: child, height: 1 + countForksFromNode(graph, child), lastSlot: getLastSlotFromNode(graph, child), @@ -148,7 +148,7 @@ export function applyNodeOffsetToAllChildren( ordered.reduce((acc, { blockRoot, height }) => { const offset = currentOffset + acc * direction; - graph.updateNodeAttributes(blockRoot, (attributes) => ({ + graph.updateNodeAttributes(blockRoot, attributes => ({ ...attributes, canonical: false, offset: offset, @@ -208,7 +208,7 @@ export function applyForkNodeOffset( const previousOverlappingForks = forkReferences .slice(0, index) .reverse() - .filter((fork) => { + .filter(fork => { // find if there is a fork later than current if (fork.parentSlot <= lastSlot) { return true; @@ -256,7 +256,7 @@ export function applyForkNodeOffset( forkReferences.forEach(({ nodeId, slot, lastSlot }) => { const offset = initialForkOffset[nodeId]; - graph.updateNodeAttributes(nodeId, (attributes) => ({ + graph.updateNodeAttributes(nodeId, attributes => ({ ...attributes, offset, })); @@ -288,7 +288,7 @@ export function processForkChoiceData(frame: Required): ProcessedData { const { data, metadata } = frame; const graph = new Graphology(); - graph.updateAttributes((current) => ({ + graph.updateAttributes(current => ({ ...current, slotStart: 0, slotEnd: 0, @@ -379,7 +379,7 @@ export function processForkChoiceData(frame: Required): ProcessedData { const orphanedNodes: OrphanReference[] = []; // iterate over nodes again and add edges - graph.forEachNode((nodeId) => { + graph.forEachNode(nodeId => { const forkChoiceNode = forkChoiceNodes[nodeId]; if ( forkChoiceNode.parent_root && @@ -409,12 +409,12 @@ export function processForkChoiceData(frame: Required): ProcessedData { // find all forks along the canonical chain // sort by slot to move along the graph in order to know if a node is canonical - graph.nodes().forEach((nodeId) => { + graph.nodes().forEach(nodeId => { const forkChoiceNode = forkChoiceNodes[nodeId]; const neighbors = graph.outNeighbors(nodeId); if (neighbors.length > 1) { const highestWeightedNeighor = highestWeightedNode(graph, neighbors); - neighbors.forEach((childNodeId) => { + neighbors.forEach(childNodeId => { if (graph.getNodeAttribute(nodeId, 'canonical')) { if (highestWeightedNeighor === childNodeId) return; } @@ -456,7 +456,7 @@ export function processForkChoiceData(frame: Required): ProcessedData { ); } - graph.updateAttributes((attributes) => ({ + graph.updateAttributes(attributes => ({ ...attributes, forks: attributes.forks + 1, })); @@ -486,12 +486,12 @@ export function aggregateProcessedData(data: ProcessedData[]): AggregatedGraph { AggregatedGraphAttributes >(); - graph.updateAttributes((attributes) => ({ + graph.updateAttributes(attributes => ({ ...attributes, slotStart: 0, slotEnd: 0, nodes: [], - id: data.map((d) => d.frame.metadata.id).join('-'), + id: data.map(d => d.frame.metadata.id).join('-'), type: 'aggregated', })); @@ -501,7 +501,7 @@ export function aggregateProcessedData(data: ProcessedData[]): AggregatedGraph { data.forEach(({ frame: { metadata, data: frameData }, graph: weightedGraph }) => { const nodeMap: Record = {}; let head: WeightedNodeAttributes | undefined; - weightedGraph.nodes().forEach((blockRoot) => { + weightedGraph.nodes().forEach(blockRoot => { const node = weightedGraph.getNodeAttributes(blockRoot); if (node.slot > (head?.slot ?? 0) && node.canonical) { head = node; @@ -512,7 +512,7 @@ export function aggregateProcessedData(data: ProcessedData[]): AggregatedGraph { // handle duplicate nodes if (graph.hasNode(nodeId)) { - graph.updateNodeAttributes(nodeId, (attributes) => ({ + graph.updateNodeAttributes(nodeId, attributes => ({ ...attributes, canonical: attributes.canonical || node.canonical, checkpoints: node.checkpoint @@ -566,7 +566,7 @@ export function aggregateProcessedData(data: ProcessedData[]): AggregatedGraph { }); } }); - graph.updateAttribute('nodes', (attribute) => { + graph.updateAttribute('nodes', attribute => { return [ ...(attribute ?? []), { @@ -581,18 +581,18 @@ export function aggregateProcessedData(data: ProcessedData[]): AggregatedGraph { }); // check if orphaned nodes are actually connected to the graph after iterating through all the nodes - orphanedNodes = orphanedNodes.filter((node) => graph.hasEdge(node.nodeId)); + orphanedNodes = orphanedNodes.filter(node => graph.hasEdge(node.nodeId)); const forks: ForkReference[] = []; graph .nodes() .sort((a, b) => graph.getNodeAttribute(a, 'slot') - graph.getNodeAttribute(b, 'slot')) - .forEach((node) => { + .forEach(node => { const neighbors = graph.outNeighbors(node); if (neighbors.length > 1) { const highestAggegatedNeighor = highestAggregatedNode(graph, neighbors); - neighbors.forEach((child) => { + neighbors.forEach(child => { if (graph.getNodeAttribute(node, 'canonical')) { if (highestAggegatedNeighor === child) return; } @@ -623,7 +623,7 @@ export function aggregateProcessedData(data: ProcessedData[]): AggregatedGraph { // find canonical head const head = data - .map((d) => d.graph.getAttribute('head')) + .map(d => d.graph.getAttribute('head')) // head is prefixed by slot so reverse sort to get highest slot .sort((a, b) => { if (a === undefined) { diff --git a/web/tailwind.config.cjs b/web/tailwind.config.js similarity index 89% rename from web/tailwind.config.cjs rename to web/tailwind.config.js index ca77a6a..76f410d 100644 --- a/web/tailwind.config.cjs +++ b/web/tailwind.config.js @@ -1,7 +1,5 @@ /** @type {import('tailwindcss').Config} */ -/* eslint-env node */ -// TODO: upgrade to ESM -module.exports = { +export default { content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], theme: { extend: { diff --git a/web/tsconfig.app.json b/web/tsconfig.app.json new file mode 100644 index 0000000..77233bc --- /dev/null +++ b/web/tsconfig.app.json @@ -0,0 +1,71 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "moduleDetection": "force", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "paths": { + "@app/*": [ + "src/*" + ], + "@api/*": [ + "src/api/*" + ], + "@styles/*": [ + "src/styles/*" + ], + "@public/*": [ + "public/*" + ], + "@parts/*": [ + "src/parts/*" + ], + "@components/*": [ + "src/components/*" + ], + "@hooks/*": [ + "src/hooks/*" + ], + "@assets/*": [ + "src/assets/*" + ], + "@utils/*": [ + "src/utils/*" + ], + "@providers/*": [ + "src/providers/*" + ], + "@contexts/*": [ + "src/contexts/*" + ] + } + }, + "include": [ + "src", + "vitest.setup.ts" + ], + "exclude": [ + "src/**/__tests__/*" + ] +} diff --git a/web/tsconfig.json b/web/tsconfig.json index d13cd18..08c8a90 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,70 +1,8 @@ { - "compilerOptions": { - "baseUrl": ".", - "target": "ESNext", - "useDefineForClassFields": true, - "lib": [ - "DOM", - "DOM.Iterable", - "ESNext" - ], - "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "paths": { - "@app/*": [ - "src/*" - ], - "@api/*": [ - "src/api/*" - ], - "@styles/*": [ - "src/styles/*" - ], - "@public/*": [ - "public/*" - ], - "@parts/*": [ - "src/parts/*" - ], - "@components/*": [ - "src/components/*" - ], - "@hooks/*": [ - "src/hooks/*" - ], - "@assets/*": [ - "src/assets/*" - ], - "@utils/*": [ - "src/utils/*" - ], - "@providers/*": [ - "src/providers/*" - ], - "@contexts/*": [ - "src/contexts/*" - ] - } - }, - "include": [ - "src" - ], - "exclude": [ - "**/__tests__/**" - ], + "files": [], "references": [ - { - "path": "./tsconfig.node.json" - } + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.vitest.json" } ] -} \ No newline at end of file +} diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json index dcfd137..0d3d714 100644 --- a/web/tsconfig.node.json +++ b/web/tsconfig.node.json @@ -1,11 +1,22 @@ { "compilerOptions": { - "composite": true, + "target": "ES2022", + "lib": ["ES2023"], "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true }, - "include": [ - "vite.config.ts" - ] -} \ No newline at end of file + "include": ["vite.config.ts"] +} diff --git a/web/tsconfig.vitest.json b/web/tsconfig.vitest.json new file mode 100644 index 0000000..45adf1e --- /dev/null +++ b/web/tsconfig.vitest.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "composite": true, + "types": ["vitest/globals"] + }, + "exclude": [] +} diff --git a/web/vite.config.ts b/web/vite.config.ts index cba853b..3a461ae 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,33 +1,24 @@ -import path from 'path'; - import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; -import eslint from 'vite-plugin-eslint'; +import tailwindcss from '@tailwindcss/vite'; +import tsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - resolve: { - alias: { - '@app': path.resolve(__dirname, './src'), - '@api': path.resolve(__dirname, './src/api'), - '@components': path.resolve(__dirname, './src/components'), - '@hooks': path.resolve(__dirname, './src/hooks'), - '@parts': path.resolve(__dirname, './src/parts'), - '@public': path.resolve(__dirname, './public'), - '@styles': path.resolve(__dirname, './src/styles'), - '@assets': path.resolve(__dirname, './src/assets'), - '@utils': path.resolve(__dirname, './src/utils'), - '@providers': path.resolve(__dirname, './src/providers'), - '@contexts': path.resolve(__dirname, './src/contexts'), - }, - }, - plugins: [react(), eslint()], + plugins: [react(), tsconfigPaths(), tailwindcss()], build: { outDir: 'build/frontend', }, server: { proxy: { + // '/api': { + // target: 'https://forky.mainnet.ethpandaops.io', + // changeOrigin: true, + // secure: false, + // }, '/api': { - target: 'http://localhost:5555', + target: 'http://localhost:5556', + changeOrigin: true, + secure: false, }, }, }, diff --git a/web/vitest.config.ts b/web/vitest.config.ts index ef0c1fb..8a30e6a 100644 --- a/web/vitest.config.ts +++ b/web/vitest.config.ts @@ -1,29 +1,20 @@ -import path from 'path'; - -import { defineConfig } from 'vitest/config'; +import tsconfigPaths from 'vite-tsconfig-paths'; +import { defineConfig, mergeConfig } from 'vitest/config'; import GithubActionsReporter from 'vitest-github-actions-reporter'; +import viteConfig from './vite.config.js'; -export default defineConfig({ - resolve: { - alias: { - '@app': path.resolve(__dirname, './src'), - '@api': path.resolve(__dirname, './src/api'), - '@components': path.resolve(__dirname, './src/components'), - '@hooks': path.resolve(__dirname, './src/hooks'), - '@parts': path.resolve(__dirname, './src/parts'), - '@public': path.resolve(__dirname, './public'), - '@styles': path.resolve(__dirname, './src/styles'), - '@assets': path.resolve(__dirname, './src/assets'), - '@utils': path.resolve(__dirname, './src/utils'), - '@providers': path.resolve(__dirname, './src/providers'), - '@contexts': path.resolve(__dirname, './src/contexts'), +export default mergeConfig( + viteConfig, + defineConfig({ + plugins: [tsconfigPaths()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: 'vitest.setup.ts', + reporters: process.env.GITHUB_ACTIONS + ? ['default', new GithubActionsReporter()] + : ['default'], + coverage: {}, }, - }, - test: { - globals: true, - environment: 'jsdom', - setupFiles: 'vitest.setup.ts', - reporters: process.env.GITHUB_ACTIONS ? ['default', new GithubActionsReporter()] : 'default', - coverage: {}, - }, -}); + }), +); diff --git a/web/vitest.setup.ts b/web/vitest.setup.ts index 995d8e7..ee15108 100644 --- a/web/vitest.setup.ts +++ b/web/vitest.setup.ts @@ -1,5 +1,5 @@ import { cleanup } from '@testing-library/react'; -import { expect, afterEach, beforeAll, afterAll } from 'vitest'; +import { afterEach, beforeAll, afterAll } from 'vitest'; import { server } from '@app/mocks/server'; From d93e3a8ce0c6df50b71cf959eea45fe415181a60 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 15:51:49 +1000 Subject: [PATCH 02/27] add multipart batch endpoint --- pkg/forky/api/http.go | 129 +++ pkg/forky/api/http/routing.go | 22 +- web/package-lock.json | 1669 ++++++++++++++----------------- web/package.json | 40 +- web/public/mockServiceWorker.js | 2 +- web/src/api/frames.ts | 80 ++ web/src/hooks/useQuery.ts | 97 +- web/src/parts/Graph.tsx | 2 +- web/src/utils/api.ts | 65 ++ 9 files changed, 1158 insertions(+), 948 deletions(-) diff --git a/pkg/forky/api/http.go b/pkg/forky/api/http.go index 8a64396..fe7e46c 100644 --- a/pkg/forky/api/http.go +++ b/pkg/forky/api/http.go @@ -1,9 +1,16 @@ package api import ( + "bytes" // Added "context" + "encoding/json" + "fmt" // Added + "io" + "mime/multipart" // Added "net/http" + "net/textproto" // Added + // Added fhttp "github.com/ethpandaops/forky/pkg/forky/api/http" "github.com/pkg/errors" @@ -42,6 +49,7 @@ func (h *HTTP) BindToRouter(_ context.Context, router *httprouter.Router) error router.GET("/api/v1/frames/:id", h.wrappedHandler(h.handleV1GetFrame)) + router.POST("/api/v1/frames/batch", h.wrappedHandler(h.handleV1GetFramesBatch)) router.POST("/api/v1/metadata", h.wrappedHandler(h.handleV1MetadataList)) router.POST("/api/v1/metadata/nodes", h.wrappedHandler(h.handleV1MetadataListNodes)) router.POST("/api/v1/metadata/slots", h.wrappedHandler(h.handleV1MetadataListSlots)) @@ -56,3 +64,124 @@ func (h *HTTP) wrappedHandler(handler func(ctx context.Context, r *http.Request, fhttp.WrappedHandler(h.log, h.metrics, handler)(w, r, p) } } + +// handleV1GetFramesBatch handles requests to fetch multiple frames by their IDs. +// GetFramesBatchRequest defines the structure for the batch frame request body. +type GetFramesBatchRequest struct { + IDs []string `json:"ids"` +} + +// handleV1GetFramesBatch handles requests to fetch multiple frames by their IDs. +// It expects a POST request with a JSON body containing an array of frame IDs, like {"ids": ["id1", "id2"]}. +// It returns a multipart/mixed response containing the requested frames. +func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { + log := h.log.WithField("handler", "handleV1GetFramesBatch") + log.Info("Processing batch frame request") + + if r.Body == nil { + log.Warn("Request body is empty") + return fhttp.NewBadRequestResponse(nil), errors.New("request body is empty") // Pass nil resolvers for error responses + } + defer r.Body.Close() + + bodyBytes, err := io.ReadAll(r.Body) + if err != nil { + log.WithError(err).Error("Failed to read request body") + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to read request body") + } + + var req GetFramesBatchRequest + if err := json.Unmarshal(bodyBytes, &req); err != nil { + log.WithError(err).Warn("Failed to decode JSON request body") + return fhttp.NewBadRequestResponse(nil), errors.Wrap(err, "invalid JSON request body") + } + + if len(req.IDs) == 0 { + log.Warn("Request contains no frame IDs") + return fhttp.NewBadRequestResponse(nil), errors.New("no frame IDs provided in request") + } + + log.WithField("num_ids", len(req.IDs)).Info("Parsed frame IDs from request") + + // --- Start fetching and bundling --- + var bodyBuf bytes.Buffer + mpWriter := multipart.NewWriter(&bodyBuf) + + foundFrames := 0 + for _, id := range req.IDs { + frame, err := h.svc.GetFrame(ctx, id) + if err != nil { + if errors.Is(err, service.ErrFrameNotFound) { + log.WithField("id", id).Warn("Frame not found, skipping") + continue // Skip this frame + } + // For other errors, log and continue for now. + log.WithField("id", id).WithError(err).Error("Failed to get frame, skipping") + continue + } + + // --- Get frame content as gzipped JSON --- + frameContent, err := frame.AsGzipJSON() + if err != nil { + log.WithField("id", id).WithError(err).Error("Failed to serialize frame to gzipped JSON, skipping") + continue + } + + frameFileName := fmt.Sprintf("%s.json.gz", frame.Metadata.ID) + frameContentType := "application/gzip" // Content is gzipped JSON + // --- End frame content --- + + partHeaders := make(textproto.MIMEHeader) + partHeaders.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, frameFileName)) + partHeaders.Set("Content-Type", frameContentType) + partHeaders.Set("Content-ID", fmt.Sprintf("<%s>", frame.Metadata.ID)) // Use frame ID for Content-ID + partHeaders.Set("Content-Encoding", "gzip") // Explicitly set Content-Encoding to gzip + + partWriter, err := mpWriter.CreatePart(partHeaders) + if err != nil { + log.WithError(err).Error("Failed to create multipart part") + mpWriter.Close() // Attempt cleanup + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to create multipart part") + } + + if _, err = partWriter.Write(frameContent); err != nil { + log.WithError(err).Error("Failed to write frame content to multipart part") + mpWriter.Close() // Attempt cleanup + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to write frame content to part") + } + foundFrames++ + log.WithField("id", id).Debug("Added frame to multipart response") + } + + // Close the multipart writer to finalize the body + if err := mpWriter.Close(); err != nil { + log.WithError(err).Error("Failed to close multipart writer") + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to close multipart writer") + } + + if foundFrames == 0 { + log.Warn("No frames found for the provided IDs") + return fhttp.NewNotFoundResponse(nil), errors.New("no frames found for the provided IDs") + } + + log.WithField("found_frames", foundFrames).Info("Finished bundling frames") + + // Create a custom response with direct multipart data + // This bypasses the JSON marshaling that's causing errors + response := &fhttp.Response{ + StatusCode: http.StatusOK, + Headers: map[string]string{ + "Content-Type": fmt.Sprintf("multipart/mixed; boundary=%s", mpWriter.Boundary()), + }, + ExtraData: map[string]interface{}{ + "_raw_content": bodyBuf.Bytes(), // Store raw content to be retrieved by the handler + }, + } + + // Optional: Add cache headers if applicable + if h.config.EdgeCacheConfig.Enabled { + response.Headers["Cache-Control"] = fmt.Sprintf("public, max-age=%[1]v, s-maxage=%[1]v", h.config.EdgeCacheConfig.FrameTTL.Seconds()) + } + + return response, nil +} diff --git a/pkg/forky/api/http/routing.go b/pkg/forky/api/http/routing.go index e5ac4c6..8449a3c 100644 --- a/pkg/forky/api/http/routing.go +++ b/pkg/forky/api/http/routing.go @@ -54,6 +54,24 @@ func WrappedHandler(log logrus.FieldLogger, metrics *Metrics, handler func(ctx c return } + // Set headers before any potential content processing + for header, value := range response.Headers { + w.Header().Set(header, value) + } + + // Special case: Check for raw multipart content (stored as _raw_content in ExtraData) + if rawContent, ok := response.ExtraData["_raw_content"]; ok { + if rawBytes, ok := rawContent.([]byte); ok { + // Raw content handling - write directly to response + w.WriteHeader(response.StatusCode) + if _, err := w.Write(rawBytes); err != nil { + log.WithError(err).Error("Failed to write raw content") + } + return + } + } + + // Standard flow - marshal response based on content type data, err := response.MarshalAs(contentType) if err != nil { if writeErr := WriteErrorResponse(w, err.Error(), http.StatusInternalServerError); writeErr != nil { @@ -63,10 +81,6 @@ func WrappedHandler(log logrus.FieldLogger, metrics *Metrics, handler func(ctx c return } - for header, value := range response.Headers { - w.Header().Set(header, value) - } - if err := WriteContentAwareResponse(w, data, contentType); err != nil { log.WithError(err).Error("Failed to write response") } diff --git a/web/package-lock.json b/web/package-lock.json index 8fc7bc2..5bde9da 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,11 +8,12 @@ "name": "forkchoice", "version": "0.0.0", "dependencies": { - "@headlessui/react": "2.2.1", + "@headlessui/react": "2.2.2", "@heroicons/react": "2.2.0", - "@tailwindcss/vite": "4.1.3", - "@tanstack/react-query": "5.72.2", - "@tanstack/react-query-devtools": "5.72.2", + "@tailwindcss/vite": "4.1.5", + "@tanstack/react-query": "5.75.0", + "@tanstack/react-query-devtools": "5.75.0", + "@types/pako": "2.0.3", "clsx": "2.1.1", "graphology": "0.26.0", "graphology-layout": "0.6.1", @@ -20,39 +21,40 @@ "graphology-types": "0.24.8", "graphology-utils": "2.5.2", "javascript-time-ago": "2.5.11", + "pako": "2.1.0", "react": "19.1.0", "react-dom": "19.1.0", - "react-router-dom": "7.5.0", + "react-router-dom": "7.5.3", "react-time-ago": "7.3.3", "react-zoom-pan-pinch": "3.7.0", - "wouter": "3.6.0" + "wouter": "3.7.0" }, "devDependencies": { - "@eslint/js": "9.24.0", + "@eslint/js": "9.25.1", "@testing-library/dom": "10.4.0", "@testing-library/react": "16.3.0", "@types/js-yaml": "4.0.9", - "@types/react": "19.1.0", - "@types/react-dom": "19.1.2", - "@vitejs/plugin-react": "4.3.4", - "@vitest/coverage-v8": "3.1.1", - "@vitest/eslint-plugin": "1.1.42", + "@types/react": "19.1.2", + "@types/react-dom": "19.1.3", + "@vitejs/plugin-react": "4.4.1", + "@vitest/coverage-v8": "3.1.2", + "@vitest/eslint-plugin": "1.1.44", "autoprefixer": "10.4.21", - "eslint": "9.24.0", + "eslint": "9.25.1", "eslint-config-prettier": "10.1.2", "eslint-plugin-prettier": "5.2.6", "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-react-refresh": "0.4.19", + "eslint-plugin-react-refresh": "0.4.20", "globals": "16.0.0", - "jsdom": "26.0.0", - "msw": "2.7.3", + "jsdom": "26.1.0", + "msw": "2.7.5", "prettier": "3.5.3", "prop-types": "15.8.1", "typescript": "5.8.3", - "typescript-eslint": "8.29.1", - "vite": "6.2.6", + "typescript-eslint": "8.31.1", + "vite": "6.3.4", "vite-tsconfig-paths": "5.1.4", - "vitest": "3.1.1", + "vitest": "3.1.2", "vitest-github-actions-reporter": "0.11.1" } }, @@ -110,14 +112,14 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.1.tgz", - "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.5.tgz", + "integrity": "sha512-w7AmVyTTiU41fNLsFDf+gA2Dwtbx2EJtn2pbJNAGSRAg50loXy1uLXA3hEpD8+eydcomTurw09tq5/AyceCaGg==", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.2", - "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" @@ -131,24 +133,24 @@ "license": "ISC" }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", + "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", "dev": true, "license": "MIT", "engines": { @@ -156,22 +158,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -197,14 +199,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -214,14 +216,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", + "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -241,29 +243,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -273,9 +275,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -283,9 +285,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -293,9 +295,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -303,9 +305,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -313,27 +315,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", + "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -343,13 +345,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -359,13 +361,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -375,45 +377,42 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "dev": true, "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", + "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -432,14 +431,14 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -523,9 +522,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", - "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", + "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", "dev": true, "funding": [ { @@ -547,9 +546,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", - "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", + "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", "dev": true, "funding": [ { @@ -564,7 +563,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.2" + "@csstools/css-calc": "^2.1.3" }, "engines": { "node": ">=18" @@ -618,9 +617,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", + "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", "cpu": [ "ppc64" ], @@ -634,9 +633,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", + "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", "cpu": [ "arm" ], @@ -650,9 +649,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", + "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", "cpu": [ "arm64" ], @@ -666,9 +665,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", + "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", "cpu": [ "x64" ], @@ -682,9 +681,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", + "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", "cpu": [ "arm64" ], @@ -698,9 +697,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", + "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", "cpu": [ "x64" ], @@ -714,9 +713,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", + "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", "cpu": [ "arm64" ], @@ -730,9 +729,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", + "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", "cpu": [ "x64" ], @@ -746,9 +745,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", + "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", "cpu": [ "arm" ], @@ -762,9 +761,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", + "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", "cpu": [ "arm64" ], @@ -778,9 +777,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", + "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", "cpu": [ "ia32" ], @@ -794,9 +793,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", + "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", "cpu": [ "loong64" ], @@ -810,9 +809,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", + "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", "cpu": [ "mips64el" ], @@ -826,9 +825,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", + "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", "cpu": [ "ppc64" ], @@ -842,9 +841,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", + "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", "cpu": [ "riscv64" ], @@ -858,9 +857,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", + "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", "cpu": [ "s390x" ], @@ -874,9 +873,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", + "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", "cpu": [ "x64" ], @@ -890,9 +889,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", + "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", "cpu": [ "arm64" ], @@ -906,9 +905,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", + "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", "cpu": [ "x64" ], @@ -922,9 +921,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", + "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", "cpu": [ "arm64" ], @@ -938,9 +937,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", + "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", "cpu": [ "x64" ], @@ -954,9 +953,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", + "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", "cpu": [ "x64" ], @@ -970,9 +969,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", + "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", "cpu": [ "arm64" ], @@ -986,9 +985,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", + "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", "cpu": [ "ia32" ], @@ -1002,9 +1001,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", + "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", "cpu": [ "x64" ], @@ -1018,9 +1017,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", "dev": true, "license": "MIT", "dependencies": { @@ -1086,9 +1085,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1096,9 +1095,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", - "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1170,9 +1169,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", - "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "version": "9.25.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", + "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", "dev": true, "license": "MIT", "engines": { @@ -1203,19 +1202,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "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", @@ -1280,15 +1266,16 @@ "license": "MIT" }, "node_modules/@headlessui/react": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.1.tgz", - "integrity": "sha512-daiUqVLae8CKVjEVT19P/izW0aGK0GNhMSAeMlrDebKmoVZHcRRwbxzgtnEadUVDXyBsWo9/UH4KHeniO+0tMg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.2.tgz", + "integrity": "sha512-zbniWOYBQ8GHSUIOPY7BbdIn6PzUOq0z41RFrF30HbjsxG6Rrfk+6QulR8Kgf2Vwj2a/rE6i62q5vo+2gI5dJA==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.16", "@react-aria/focus": "^3.17.1", "@react-aria/interactions": "^3.21.3", - "@tanstack/react-virtual": "^3.11.1" + "@tanstack/react-virtual": "^3.13.6", + "use-sync-external-store": "^1.5.0" }, "engines": { "node": ">=10" @@ -1656,27 +1643,27 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.2.tgz", - "integrity": "sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@react-aria/focus": { - "version": "3.20.1", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.1.tgz", - "integrity": "sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.2.tgz", + "integrity": "sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.24.1", - "@react-aria/utils": "^3.28.1", - "@react-types/shared": "^3.28.0", + "@react-aria/interactions": "^3.25.0", + "@react-aria/utils": "^3.28.2", + "@react-types/shared": "^3.29.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, @@ -1686,15 +1673,15 @@ } }, "node_modules/@react-aria/interactions": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.24.1.tgz", - "integrity": "sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.0.tgz", + "integrity": "sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==", "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.7", - "@react-aria/utils": "^3.28.1", - "@react-stately/flags": "^3.1.0", - "@react-types/shared": "^3.28.0", + "@react-aria/ssr": "^3.9.8", + "@react-aria/utils": "^3.28.2", + "@react-stately/flags": "^3.1.1", + "@react-types/shared": "^3.29.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -1703,9 +1690,9 @@ } }, "node_modules/@react-aria/ssr": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", - "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==", + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz", + "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -1718,15 +1705,15 @@ } }, "node_modules/@react-aria/utils": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.1.tgz", - "integrity": "sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==", + "version": "3.28.2", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.2.tgz", + "integrity": "sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==", "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.7", - "@react-stately/flags": "^3.1.0", - "@react-stately/utils": "^3.10.5", - "@react-types/shared": "^3.28.0", + "@react-aria/ssr": "^3.9.8", + "@react-stately/flags": "^3.1.1", + "@react-stately/utils": "^3.10.6", + "@react-types/shared": "^3.29.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, @@ -1736,18 +1723,18 @@ } }, "node_modules/@react-stately/flags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.0.tgz", - "integrity": "sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.1.tgz", + "integrity": "sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@react-stately/utils": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.5.tgz", - "integrity": "sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==", + "version": "3.10.6", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.6.tgz", + "integrity": "sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -1757,18 +1744,18 @@ } }, "node_modules/@react-types/shared": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.28.0.tgz", - "integrity": "sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==", + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.29.0.tgz", + "integrity": "sha512-IDQYu/AHgZimObzCFdNl1LpZvQW/xcfLt3v20sorl5qRucDVj4S9os98sVTZ4IRIBjmS+MkjqpR5E70xan7ooA==", "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", - "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", + "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", "cpu": [ "arm" ], @@ -1779,9 +1766,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", - "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", + "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", "cpu": [ "arm64" ], @@ -1792,9 +1779,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", - "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", + "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", "cpu": [ "arm64" ], @@ -1805,9 +1792,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", - "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", + "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", "cpu": [ "x64" ], @@ -1818,9 +1805,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", - "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", + "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", "cpu": [ "arm64" ], @@ -1831,9 +1818,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", - "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", + "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", "cpu": [ "x64" ], @@ -1844,9 +1831,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", - "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", + "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", "cpu": [ "arm" ], @@ -1857,9 +1844,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", - "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", + "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", "cpu": [ "arm" ], @@ -1870,9 +1857,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", - "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", + "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", "cpu": [ "arm64" ], @@ -1883,9 +1870,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", - "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", + "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", "cpu": [ "arm64" ], @@ -1896,9 +1883,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", - "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", + "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", "cpu": [ "loong64" ], @@ -1909,9 +1896,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", - "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", + "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", "cpu": [ "ppc64" ], @@ -1922,9 +1909,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", - "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", + "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", "cpu": [ "riscv64" ], @@ -1935,9 +1922,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", - "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", + "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", "cpu": [ "riscv64" ], @@ -1948,9 +1935,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", - "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", + "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", "cpu": [ "s390x" ], @@ -1961,9 +1948,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", - "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", + "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", "cpu": [ "x64" ], @@ -1974,9 +1961,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", - "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", + "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", "cpu": [ "x64" ], @@ -1987,9 +1974,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", - "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", + "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", "cpu": [ "arm64" ], @@ -2000,9 +1987,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", - "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", + "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", "cpu": [ "ia32" ], @@ -2013,9 +2000,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", - "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", + "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", "cpu": [ "x64" ], @@ -2026,52 +2013,53 @@ ] }, "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" } }, "node_modules/@tailwindcss/node": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.3.tgz", - "integrity": "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", + "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", "license": "MIT", "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.29.2", - "tailwindcss": "4.1.3" + "tailwindcss": "4.1.5" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.3.tgz", - "integrity": "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", + "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", "license": "MIT", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.3", - "@tailwindcss/oxide-darwin-arm64": "4.1.3", - "@tailwindcss/oxide-darwin-x64": "4.1.3", - "@tailwindcss/oxide-freebsd-x64": "4.1.3", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", - "@tailwindcss/oxide-linux-x64-musl": "4.1.3", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" + "@tailwindcss/oxide-android-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-x64": "4.1.5", + "@tailwindcss/oxide-freebsd-x64": "4.1.5", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-x64-musl": "4.1.5", + "@tailwindcss/oxide-wasm32-wasi": "4.1.5", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.3.tgz", - "integrity": "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", + "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", "cpu": [ "arm64" ], @@ -2085,9 +2073,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.3.tgz", - "integrity": "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", + "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", "cpu": [ "arm64" ], @@ -2101,9 +2089,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.3.tgz", - "integrity": "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", + "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", "cpu": [ "x64" ], @@ -2117,9 +2105,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.3.tgz", - "integrity": "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", + "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", "cpu": [ "x64" ], @@ -2133,9 +2121,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.3.tgz", - "integrity": "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", + "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", "cpu": [ "arm" ], @@ -2149,9 +2137,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.3.tgz", - "integrity": "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", + "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", "cpu": [ "arm64" ], @@ -2165,9 +2153,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.3.tgz", - "integrity": "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", + "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", "cpu": [ "arm64" ], @@ -2181,9 +2169,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.3.tgz", - "integrity": "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", + "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", "cpu": [ "x64" ], @@ -2197,9 +2185,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.3.tgz", - "integrity": "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", + "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", "cpu": [ "x64" ], @@ -2212,10 +2200,39 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", + "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.9", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.3.tgz", - "integrity": "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", + "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", "cpu": [ "arm64" ], @@ -2229,9 +2246,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.3.tgz", - "integrity": "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", + "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", "cpu": [ "x64" ], @@ -2245,23 +2262,23 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.3.tgz", - "integrity": "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.5.tgz", + "integrity": "sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.1.3", - "@tailwindcss/oxide": "4.1.3", - "tailwindcss": "4.1.3" + "@tailwindcss/node": "4.1.5", + "@tailwindcss/oxide": "4.1.5", + "tailwindcss": "4.1.5" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "node_modules/@tanstack/query-core": { - "version": "5.72.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.72.2.tgz", - "integrity": "sha512-fxl9/0yk3mD/FwTmVEf1/H6N5B975H0luT+icKyX566w6uJG0x6o+Yl+I38wJRCaogiMkstByt+seXfDbWDAcA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.75.0.tgz", + "integrity": "sha512-rk8KQuCdhoRkzjRVF3QxLgAfFUyS0k7+GCQjlGEpEGco+qazJ0eMH6aO1DjDjibH7/ik383nnztua3BG+lOnwg==", "license": "MIT", "funding": { "type": "github", @@ -2269,9 +2286,9 @@ } }, "node_modules/@tanstack/query-devtools": { - "version": "5.72.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.72.2.tgz", - "integrity": "sha512-mMKnGb+iOhVBcj6jaerCFRpg8pACStdG8hmUBHPtToeZzs4ctjBUL1FajqpVn2WaMxnq8Wya+P3Q5tPFNM9jQw==", + "version": "5.74.7", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.74.7.tgz", + "integrity": "sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==", "license": "MIT", "funding": { "type": "github", @@ -2279,12 +2296,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.72.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.72.2.tgz", - "integrity": "sha512-SVNHzyBUYiis+XiCl+8yiPZmMYei2AKYY94wM/zpvB5l1jxqOo82FQTziSJ4pBi96jtYqvYrTMxWynmbQh3XKw==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.75.0.tgz", + "integrity": "sha512-H+TNgxmTbzH8qQ5MT5xsZEhQ8BG1tUYduDSfeAOzroVZgd/AEjg1rRYSP/9Tl9/hPobZ7iZzV401n77kStrbKw==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.72.2" + "@tanstack/query-core": "5.75.0" }, "funding": { "type": "github", @@ -2295,19 +2312,19 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.72.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.72.2.tgz", - "integrity": "sha512-n53qr9JdHCJTCUba6OvMhwiV2CcsckngOswKEE7nM5pQBa/fW9c43qw8omw1RPT2s+aC7MuwS8fHsWT8g+j6IQ==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.75.0.tgz", + "integrity": "sha512-ogTsCCONHPq8opyeU/NJZlus8+g36KnK+cybC1cs0Knr8iO/wAYgnciz+3DVNq38kRflBb0iJhHkUexp/7WfcQ==", "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.72.2" + "@tanstack/query-devtools": "5.74.7" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.72.2", + "@tanstack/react-query": "^5.75.0", "react": "^18 || ^19" } }, @@ -2442,6 +2459,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, "license": "MIT" }, "node_modules/@types/estree": { @@ -2464,10 +2482,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/pako": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==", + "license": "MIT" + }, "node_modules/@types/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", - "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", + "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", "dev": true, "license": "MIT", "dependencies": { @@ -2475,9 +2499,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", - "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz", + "integrity": "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2499,17 +2523,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", - "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", + "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/type-utils": "8.29.1", - "@typescript-eslint/utils": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/type-utils": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2529,16 +2553,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", - "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", + "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4" }, "engines": { @@ -2554,14 +2578,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", - "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", + "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1" + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2572,14 +2596,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", - "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", + "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/utils": "8.31.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -2596,9 +2620,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", - "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", + "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", "dev": true, "license": "MIT", "engines": { @@ -2610,14 +2634,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", - "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", + "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2637,16 +2661,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", - "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", + "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1" + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2661,13 +2685,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", - "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", + "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/types": "8.31.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2692,17 +2716,17 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", + "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.0", + "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -2712,9 +2736,9 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz", - "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.2.tgz", + "integrity": "sha512-XDdaDOeaTMAMYW7N63AqoK32sYUWbXnTkC6tEbVcu3RlU1bB9of32T+PGf8KZvxqLNqeXhafDFqCkwpf2+dyaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2727,7 +2751,7 @@ "istanbul-reports": "^3.1.7", "magic-string": "^0.30.17", "magicast": "^0.3.5", - "std-env": "^3.8.1", + "std-env": "^3.9.0", "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" }, @@ -2735,8 +2759,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.1.1", - "vitest": "3.1.1" + "@vitest/browser": "3.1.2", + "vitest": "3.1.2" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -2745,9 +2769,9 @@ } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.1.42", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.42.tgz", - "integrity": "sha512-dTGNbh/angh+hoqp5L5A8YO/29mOXDXmDQ/1fzt/jiYzLvU6FvrMqJpGqMqh5g+Fz6MDoZi0AlxefnFUg93Q5A==", + "version": "1.1.44", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.44.tgz", + "integrity": "sha512-m4XeohMT+Dj2RZfxnbiFR+Cv5dEC0H7C6TlxRQT7GK2556solm99kxgzJp/trKrZvanZcOFyw7aABykUTfWyrg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2759,18 +2783,21 @@ "peerDependenciesMeta": { "typescript": { "optional": true + }, + "vitest": { + "optional": true } } }, "node_modules/@vitest/expect": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", - "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz", + "integrity": "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@vitest/spy": "3.1.2", + "@vitest/utils": "3.1.2", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -2779,13 +2806,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", - "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz", + "integrity": "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.1.1", + "@vitest/spy": "3.1.2", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -2806,9 +2833,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", - "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz", + "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==", "dev": true, "license": "MIT", "dependencies": { @@ -2819,13 +2846,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", - "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz", + "integrity": "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.1.1", + "@vitest/utils": "3.1.2", "pathe": "^2.0.3" }, "funding": { @@ -2833,13 +2860,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", - "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz", + "integrity": "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.1.1", + "@vitest/pretty-format": "3.1.2", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -2848,9 +2875,9 @@ } }, "node_modules/@vitest/spy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", - "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz", + "integrity": "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==", "dev": true, "license": "MIT", "dependencies": { @@ -2861,13 +2888,13 @@ } }, "node_modules/@vitest/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz", + "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.1.1", + "@vitest/pretty-format": "3.1.2", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, @@ -3007,13 +3034,6 @@ "node": ">=12" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, "node_modules/autoprefixer": { "version": "10.4.21", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -3125,20 +3145,6 @@ "node": ">=8" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3150,9 +3156,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001713", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", - "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "version": "1.0.30001716", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", + "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", "dev": true, "funding": [ { @@ -3321,19 +3327,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3374,13 +3367,13 @@ } }, "node_modules/cssstyle": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", - "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", + "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^3.1.1", + "@asamuzakjp/css-color": "^3.1.2", "rrweb-cssom": "^0.8.0" }, "engines": { @@ -3450,16 +3443,6 @@ "dev": true, "license": "MIT" }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3471,9 +3454,9 @@ } }, "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==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -3486,21 +3469,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3509,9 +3477,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.136", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", - "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", + "version": "1.5.149", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", + "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", "dev": true, "license": "ISC" }, @@ -3536,9 +3504,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -3548,66 +3516,17 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "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-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", + "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -3617,31 +3536,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" + "@esbuild/aix-ppc64": "0.25.3", + "@esbuild/android-arm": "0.25.3", + "@esbuild/android-arm64": "0.25.3", + "@esbuild/android-x64": "0.25.3", + "@esbuild/darwin-arm64": "0.25.3", + "@esbuild/darwin-x64": "0.25.3", + "@esbuild/freebsd-arm64": "0.25.3", + "@esbuild/freebsd-x64": "0.25.3", + "@esbuild/linux-arm": "0.25.3", + "@esbuild/linux-arm64": "0.25.3", + "@esbuild/linux-ia32": "0.25.3", + "@esbuild/linux-loong64": "0.25.3", + "@esbuild/linux-mips64el": "0.25.3", + "@esbuild/linux-ppc64": "0.25.3", + "@esbuild/linux-riscv64": "0.25.3", + "@esbuild/linux-s390x": "0.25.3", + "@esbuild/linux-x64": "0.25.3", + "@esbuild/netbsd-arm64": "0.25.3", + "@esbuild/netbsd-x64": "0.25.3", + "@esbuild/openbsd-arm64": "0.25.3", + "@esbuild/openbsd-x64": "0.25.3", + "@esbuild/sunos-x64": "0.25.3", + "@esbuild/win32-arm64": "0.25.3", + "@esbuild/win32-ia32": "0.25.3", + "@esbuild/win32-x64": "0.25.3" } }, "node_modules/escalade": { @@ -3668,20 +3587,20 @@ } }, "node_modules/eslint": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", - "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "version": "9.25.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", + "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.0", - "@eslint/core": "^0.12.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.24.0", - "@eslint/plugin-kit": "^0.2.7", + "@eslint/js": "9.25.1", + "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -3786,9 +3705,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", - "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4117,22 +4036,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -4161,16 +4064,6 @@ "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/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4191,45 +4084,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -4284,19 +4138,6 @@ "dev": true, "license": "MIT" }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -4377,9 +4218,9 @@ } }, "node_modules/graphql": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", - "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", "dev": true, "license": "MIT", "engines": { @@ -4396,48 +4237,6 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "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/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/headers-polyfill": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", @@ -4715,16 +4514,15 @@ } }, "node_modules/jsdom": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", - "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.1", + "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", @@ -4734,12 +4532,12 @@ "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^5.0.0", + "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.0", + "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, @@ -5154,16 +4952,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", @@ -5194,29 +4982,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -5266,9 +5031,9 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.3.tgz", - "integrity": "sha512-+mycXv8l2fEAjFZ5sjrtjJDmm2ceKGjrNbBr1durRg6VkU9fNUE/gsmQ51hWbHqs+l35W1iM+ZsmOD9Fd6lspw==", + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.5.tgz", + "integrity": "sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5448,6 +5213,12 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" + }, "node_modules/pandemonium": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", @@ -5471,13 +5242,13 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -5784,9 +5555,9 @@ "license": "MIT" }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -5794,12 +5565,11 @@ } }, "node_modules/react-router": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz", - "integrity": "sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", + "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", "license": "MIT", "dependencies": { - "@types/cookie": "^0.6.0", "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0", "turbo-stream": "2.4.0" @@ -5818,12 +5588,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.0.tgz", - "integrity": "sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz", + "integrity": "sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A==", "license": "MIT", "dependencies": { - "react-router": "7.5.0" + "react-router": "7.5.3" }, "engines": { "node": ">=20.0.0" @@ -5872,13 +5642,6 @@ "react-dom": "*" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, "node_modules/regexparam": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", @@ -5933,9 +5696,9 @@ } }, "node_modules/rollup": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", - "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", + "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", "license": "MIT", "dependencies": { "@types/estree": "1.0.7" @@ -5948,26 +5711,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.39.0", - "@rollup/rollup-android-arm64": "4.39.0", - "@rollup/rollup-darwin-arm64": "4.39.0", - "@rollup/rollup-darwin-x64": "4.39.0", - "@rollup/rollup-freebsd-arm64": "4.39.0", - "@rollup/rollup-freebsd-x64": "4.39.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", - "@rollup/rollup-linux-arm-musleabihf": "4.39.0", - "@rollup/rollup-linux-arm64-gnu": "4.39.0", - "@rollup/rollup-linux-arm64-musl": "4.39.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-musl": "4.39.0", - "@rollup/rollup-linux-s390x-gnu": "4.39.0", - "@rollup/rollup-linux-x64-gnu": "4.39.0", - "@rollup/rollup-linux-x64-musl": "4.39.0", - "@rollup/rollup-win32-arm64-msvc": "4.39.0", - "@rollup/rollup-win32-ia32-msvc": "4.39.0", - "@rollup/rollup-win32-x64-msvc": "4.39.0", + "@rollup/rollup-android-arm-eabi": "4.40.1", + "@rollup/rollup-android-arm64": "4.40.1", + "@rollup/rollup-darwin-arm64": "4.40.1", + "@rollup/rollup-darwin-x64": "4.40.1", + "@rollup/rollup-freebsd-arm64": "4.40.1", + "@rollup/rollup-freebsd-x64": "4.40.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", + "@rollup/rollup-linux-arm-musleabihf": "4.40.1", + "@rollup/rollup-linux-arm64-gnu": "4.40.1", + "@rollup/rollup-linux-arm64-musl": "4.40.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-musl": "4.40.1", + "@rollup/rollup-linux-s390x-gnu": "4.40.1", + "@rollup/rollup-linux-x64-gnu": "4.40.1", + "@rollup/rollup-linux-x64-musl": "4.40.1", + "@rollup/rollup-win32-arm64-msvc": "4.40.1", + "@rollup/rollup-win32-ia32-msvc": "4.40.1", + "@rollup/rollup-win32-x64-msvc": "4.40.1", "fsevents": "~2.3.2" } }, @@ -6261,13 +6024,13 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.3.tgz", - "integrity": "sha512-szhWDqNNI9etJUvbZ1/cx1StnZx8yMmFxme48SwR4dty4ioSY50KEZlpv0qAfgc1fpRzuh9hBXEzoCpJ779dLg==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", + "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.1", + "@pkgr/core": "^0.2.3", "tslib": "^2.8.1" }, "engines": { @@ -6284,9 +6047,9 @@ "license": "MIT" }, "node_modules/tailwindcss": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz", - "integrity": "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", + "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", "license": "MIT" }, "node_modules/tapable": { @@ -6327,6 +6090,48 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinypool": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", @@ -6358,22 +6163,22 @@ } }, "node_modules/tldts": { - "version": "6.1.85", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.85.tgz", - "integrity": "sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.85" + "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.85", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.85.tgz", - "integrity": "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==", + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, "license": "MIT" }, @@ -6404,9 +6209,9 @@ } }, "node_modules/tr46": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", - "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { @@ -6486,9 +6291,9 @@ } }, "node_modules/type-fest": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", - "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", + "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -6513,15 +6318,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.1.tgz", - "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", + "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.29.1", - "@typescript-eslint/parser": "8.29.1", - "@typescript-eslint/utils": "8.29.1" + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "@typescript-eslint/utils": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6620,14 +6425,17 @@ } }, "node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", + "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -6691,9 +6499,9 @@ } }, "node_modules/vite-node": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", - "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz", + "integrity": "sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==", "dev": true, "license": "MIT", "dependencies": { @@ -6733,32 +6541,59 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vitest": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", - "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz", + "integrity": "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.1.1", - "@vitest/mocker": "3.1.1", - "@vitest/pretty-format": "^3.1.1", - "@vitest/runner": "3.1.1", - "@vitest/snapshot": "3.1.1", - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", + "@vitest/expect": "3.1.2", + "@vitest/mocker": "3.1.2", + "@vitest/pretty-format": "^3.1.2", + "@vitest/runner": "3.1.2", + "@vitest/snapshot": "3.1.2", + "@vitest/spy": "3.1.2", + "@vitest/utils": "3.1.2", "chai": "^5.2.0", "debug": "^4.4.0", - "expect-type": "^1.2.0", + "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "std-env": "^3.8.1", + "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.13", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.1", + "vite-node": "3.1.2", "why-is-node-running": "^2.3.0" }, "bin": { @@ -6774,8 +6609,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.1.1", - "@vitest/ui": "3.1.1", + "@vitest/browser": "3.1.2", + "@vitest/ui": "3.1.2", "happy-dom": "*", "jsdom": "*" }, @@ -6923,9 +6758,9 @@ } }, "node_modules/wouter": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.6.0.tgz", - "integrity": "sha512-l11eR4urCc+CbY8+pV8HKFHxEqMgffss9aVB1XwiSkLDtH3cI6XpCa50cOzREzL0KwQqrwCVE5dCyeNcCgFpPg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.7.0.tgz", + "integrity": "sha512-ElkqESy10WgRRbdd22uQkSSO6LmG6vxI50pxPKry2TLebbdXvgtp7rJ48KafjUvsKcQQmIewxgRCGixPfk58tw==", "license": "Unlicense", "dependencies": { "mitt": "^3.0.1", diff --git a/web/package.json b/web/package.json index 42295ed..f288f32 100644 --- a/web/package.json +++ b/web/package.json @@ -15,11 +15,12 @@ "test": "vitest" }, "dependencies": { - "@headlessui/react": "2.2.1", + "@headlessui/react": "2.2.2", "@heroicons/react": "2.2.0", - "@tailwindcss/vite": "4.1.3", - "@tanstack/react-query": "5.72.2", - "@tanstack/react-query-devtools": "5.72.2", + "@tailwindcss/vite": "4.1.5", + "@tanstack/react-query": "5.75.0", + "@tanstack/react-query-devtools": "5.75.0", + "@types/pako": "2.0.3", "clsx": "2.1.1", "graphology": "0.26.0", "graphology-layout": "0.6.1", @@ -27,39 +28,40 @@ "graphology-types": "0.24.8", "graphology-utils": "2.5.2", "javascript-time-ago": "2.5.11", + "pako": "2.1.0", "react": "19.1.0", "react-dom": "19.1.0", - "react-router-dom": "7.5.0", + "react-router-dom": "7.5.3", "react-time-ago": "7.3.3", "react-zoom-pan-pinch": "3.7.0", - "wouter": "3.6.0" + "wouter": "3.7.0" }, "devDependencies": { - "@eslint/js": "9.24.0", + "@eslint/js": "9.25.1", "@testing-library/dom": "10.4.0", "@testing-library/react": "16.3.0", "@types/js-yaml": "4.0.9", - "@types/react": "19.1.0", - "@types/react-dom": "19.1.2", - "@vitejs/plugin-react": "4.3.4", - "@vitest/coverage-v8": "3.1.1", - "@vitest/eslint-plugin": "1.1.42", + "@types/react": "19.1.2", + "@types/react-dom": "19.1.3", + "@vitejs/plugin-react": "4.4.1", + "@vitest/coverage-v8": "3.1.2", + "@vitest/eslint-plugin": "1.1.44", "autoprefixer": "10.4.21", - "eslint": "9.24.0", + "eslint": "9.25.1", "eslint-config-prettier": "10.1.2", "eslint-plugin-prettier": "5.2.6", "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-react-refresh": "0.4.19", + "eslint-plugin-react-refresh": "0.4.20", "globals": "16.0.0", - "jsdom": "26.0.0", - "msw": "2.7.3", + "jsdom": "26.1.0", + "msw": "2.7.5", "prettier": "3.5.3", "prop-types": "15.8.1", "typescript": "5.8.3", - "typescript-eslint": "8.29.1", - "vite": "6.2.6", + "typescript-eslint": "8.31.1", + "vite": "6.3.4", "vite-tsconfig-paths": "5.1.4", - "vitest": "3.1.1", + "vitest": "3.1.2", "vitest-github-actions-reporter": "0.11.1" }, "volta": { diff --git a/web/public/mockServiceWorker.js b/web/public/mockServiceWorker.js index 34057e8..8b841ba 100644 --- a/web/public/mockServiceWorker.js +++ b/web/public/mockServiceWorker.js @@ -8,7 +8,7 @@ * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.7.3' +const PACKAGE_VERSION = '2.7.5' const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() diff --git a/web/src/api/frames.ts b/web/src/api/frames.ts index 2f22462..579ed4a 100644 --- a/web/src/api/frames.ts +++ b/web/src/api/frames.ts @@ -2,6 +2,7 @@ import { Response, V1GetFrameResponse, Frame } from '@app/types/api'; import { ProcessedData } from '@app/types/graph'; import { BASE_URL } from '@utils/environment'; import { processForkChoiceData } from '@utils/graph'; +import { parseMultipartMixed } from '@utils/api'; export async function fetchFrame(id: string): Promise { const response = await fetch(`${BASE_URL}api/v1/frames/${id}`); @@ -18,3 +19,82 @@ export async function fetchFrame(id: string): Promise { return processForkChoiceData(frame as Required); } +export async function fetchFramesBatch(ids: string[]): Promise> { + if (ids.length === 0) { + return {}; + } + + if (ids.length === 1) { + const result: Record = {}; + try { + result[ids[0]] = await fetchFrame(ids[0]); + } catch (error) { + console.error(`Error fetching single frame ${ids[0]}:`, error); + } + return result; + } + + try { + console.log(`Fetching ${ids.length} frames in batch`); + const response = await fetch(`${BASE_URL}api/v1/frames/batch`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ ids }), + }); + + if (!response.ok) { + throw new Error(`Failed to fetch frames batch: ${response.status} ${response.statusText}`); + } + + const contentType = response.headers.get('Content-Type') || ''; + if (!contentType.includes('multipart/mixed')) { + throw new Error('Expected multipart/mixed response'); + } + + const boundaryMatch = contentType.match(/boundary=([^;]+)/); + if (!boundaryMatch) { + throw new Error('Could not determine multipart boundary'); + } + const boundary = boundaryMatch[1]; + + const buffer = await response.arrayBuffer(); + const result: Record = {}; + const frames = await parseMultipartMixed(buffer, boundary); + + for (const [id, frameData] of Object.entries(frames)) { + try { + if (!frameData) { + console.warn(`No data for frame ${id}`); + continue; + } + + result[id] = processForkChoiceData(frameData as Required); + } catch (error) { + console.error(`Failed to process frame ${id}:`, error); + } + } + + if (Object.keys(result).length > 0) { + return result; + } + + throw new Error('Failed to parse any frames from batch response'); + } catch (error) { + console.warn('Batch fetch failed, falling back to individual requests:', error); + + const result: Record = {}; + await Promise.all( + ids.map(async id => { + try { + result[id] = await fetchFrame(id); + } catch (error) { + console.error(`Failed to fetch frame ${id}:`, error); + } + }), + ); + + return result; + } +} diff --git a/web/src/hooks/useQuery.ts b/web/src/hooks/useQuery.ts index 7c7aae8..dfd15d9 100644 --- a/web/src/hooks/useQuery.ts +++ b/web/src/hooks/useQuery.ts @@ -1,7 +1,7 @@ import { useQuery, useQueries } from '@tanstack/react-query'; import { fetchNow, fetchSpec, Spec } from '@api/ethereum'; -import { fetchFrame } from '@api/frames'; +import { fetchFrame, fetchFramesBatch } from '@api/frames'; import { fetchMetadataList, fetchMetadataNodes } from '@api/metadata'; import { FrameFilter, FrameMetaData, V1GetEthereumNowResponse } from '@app/types/api'; import { ProcessedData } from '@app/types/graph'; @@ -56,13 +56,98 @@ export function useFrameQuery(id: string, enabled = true) { }); } +export function useFramesBatchQuery(ids: string[], enabled = true) { + return useQuery< + Record, + unknown, + Record, + [string, string[]] + >({ + queryKey: ['frames-batch', ids], + queryFn: () => fetchFramesBatch(ids), + enabled: enabled && ids.length > 0, + staleTime: 120_000, + }); +} + +// Split an array into chunks of a specified size +function chunkArray(array: T[], chunkSize: number): T[][] { + const result: T[][] = []; + for (let i = 0; i < array.length; i += chunkSize) { + result.push(array.slice(i, i + chunkSize)); + } + return result; +} + export function useFrameQueries(ids: string[], enabled = true) { - return useQueries({ - queries: ids.map(id => ({ - queryKey: ['frame', id], - queryFn: () => fetchFrame(id), - enabled, + // Define the maximum number of IDs to send in a single batch request + const BATCH_SIZE = 10; + + // Split IDs into chunks to avoid overwhelming the server + const idChunks = ids.length > 1 ? chunkArray(ids, BATCH_SIZE) : [ids]; + + // Create a batch query for each chunk + const batchQueries = useQueries({ + queries: idChunks.map(chunk => ({ + queryKey: ['frames-batch', chunk], + queryFn: () => fetchFramesBatch(chunk), + enabled: enabled && chunk.length > 0, staleTime: 120_000, })), }); + + // If not enabled or no IDs, return empty results + if (!enabled || ids.length === 0) { + return ids.map(id => ({ + data: undefined, + isLoading: false, + error: null, + })); + } + + // If any batch is still loading, show loading state + const isLoading = batchQueries.some(query => query.isLoading); + + // If all batches are done, combine the results + if (!isLoading && batchQueries.every(query => query.data)) { + // Merge all batch results into a single map + const mergedData: Record = {}; + batchQueries.forEach(query => { + if (query.data) { + Object.assign(mergedData, query.data); + } + }); + + // Map results back to the original order of IDs + return ids.map(id => ({ + data: mergedData[id], + isLoading: false, + error: !mergedData[id] ? new Error(`Frame ${id} not found`) : null, + })); + } + + // If batches are still loading or failed, return loading/error state + return ids.map(id => { + // Find which batch this ID belongs to + const batchIndex = idChunks.findIndex(chunk => chunk.includes(id)); + if (batchIndex === -1) { + return { data: undefined, isLoading: false, error: new Error('ID not found in any batch') }; + } + + const batchQuery = batchQueries[batchIndex]; + + if (batchQuery.isLoading) { + return { data: undefined, isLoading: true, error: null }; + } + + if (batchQuery.error) { + return { data: undefined, isLoading: false, error: batchQuery.error }; + } + + return { + data: batchQuery.data?.[id], + isLoading: false, + error: !batchQuery.data?.[id] ? new Error(`Frame ${id} not found in batch`) : null, + }; + }); } diff --git a/web/src/parts/Graph.tsx b/web/src/parts/Graph.tsx index 931931b..9c9bc91 100644 --- a/web/src/parts/Graph.tsx +++ b/web/src/parts/Graph.tsx @@ -256,7 +256,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un } return { formattedNodes: newNodes, formattedEdges: newEdges }; - }, [unique]); + }, [unique]); // eslint-disable-line react-hooks/exhaustive-deps return ( <> diff --git a/web/src/utils/api.ts b/web/src/utils/api.ts index 5110902..87285da 100644 --- a/web/src/utils/api.ts +++ b/web/src/utils/api.ts @@ -1,5 +1,7 @@ import { ForkChoiceData, ForkChoiceNode } from '@app/types/api'; import { randomHex, randomBigInt, randomInt } from '@utils/functions'; +import { Frame } from '@app/types/api'; +import pako from 'pako'; export function equalForkChoiceNode(a?: ForkChoiceNode, b?: ForkChoiceNode) { if (a === b) return true; @@ -209,3 +211,66 @@ export function generateRandomForkChoiceData({ ), }; } + +export async function parseMultipartMixed( + buffer: ArrayBuffer, + boundary: string, +): Promise> { + const data = new Uint8Array(buffer); + const result: Record = {}; + const boundaryString = `--${boundary}`; + const boundaryBytes = new TextEncoder().encode(boundaryString); + + const boundaryPositions: number[] = []; + for (let i = 0; i < data.length - boundaryBytes.length; i++) { + let match = true; + for (let j = 0; j < boundaryBytes.length; j++) { + if (data[i + j] !== boundaryBytes[j]) { + match = false; + break; + } + } + if (match) { + boundaryPositions.push(i); + } + } + + for (let i = 0; i < boundaryPositions.length - 1; i++) { + const start = boundaryPositions[i] + boundaryBytes.length; + const end = boundaryPositions[i + 1]; + const partData = data.slice(start, end); + const partText = new TextDecoder().decode(partData); + + const headerEndPos = partText.indexOf('\r\n\r\n'); + if (headerEndPos === -1) continue; + + const headersText = partText.substring(0, headerEndPos); + const headers: Record = {}; + + headersText.split('\r\n').forEach(line => { + if (!line.includes(':')) return; + const [name, value] = line.split(':', 2); + headers[name.trim().toLowerCase()] = value.trim(); + }); + + const contentId = headers['content-id']; + if (!contentId) continue; + + const id = contentId.replace(/[<>]/g, ''); + const contentStart = start + headerEndPos + 4; + const contentEnd = end - 2; + const contentData = data.slice(contentStart, contentEnd); + + try { + const decompressed = pako.inflate(contentData); + const jsonString = new TextDecoder().decode(decompressed); + const frameData = JSON.parse(jsonString) as Frame; + result[id] = frameData; + } catch (error) { + console.error(`Failed to decompress/parse frame ${id}:`, error); + result[id] = null; + } + } + + return result; +} From 06106b9ca7d4da5155a431961f188f6280e63cba Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 15:54:52 +1000 Subject: [PATCH 03/27] cleanup --- web/tsconfig.node.json | 4 ---- web/vite.config.ts | 9 +-------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json index 0d3d714..8e5b203 100644 --- a/web/tsconfig.node.json +++ b/web/tsconfig.node.json @@ -4,15 +4,11 @@ "lib": ["ES2023"], "module": "ESNext", "skipLibCheck": true, - - /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, "isolatedModules": true, "moduleDetection": "force", "noEmit": true, - - /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, diff --git a/web/vite.config.ts b/web/vite.config.ts index 3a461ae..5d02fec 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -10,15 +10,8 @@ export default defineConfig({ }, server: { proxy: { - // '/api': { - // target: 'https://forky.mainnet.ethpandaops.io', - // changeOrigin: true, - // secure: false, - // }, '/api': { - target: 'http://localhost:5556', - changeOrigin: true, - secure: false, + target: 'http://localhost:5555', }, }, }, From 3397e691b135131d797389f8dd1a6698ff8da8f0 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 15:57:37 +1000 Subject: [PATCH 04/27] cleanup --- pkg/forky/api/frames.go | 114 +++++++++++++++++++++++++++++++++- pkg/forky/api/http.go | 133 ++-------------------------------------- 2 files changed, 117 insertions(+), 130 deletions(-) diff --git a/pkg/forky/api/frames.go b/pkg/forky/api/frames.go index 74e4bd5..b587991 100644 --- a/pkg/forky/api/frames.go +++ b/pkg/forky/api/frames.go @@ -1,11 +1,16 @@ package api import ( + "bytes" "context" "encoding/json" - "errors" "fmt" + "io" + "mime/multipart" "net/http" + "net/textproto" + + "github.com/pkg/errors" fhttp "github.com/ethpandaops/forky/pkg/forky/api/http" "github.com/ethpandaops/forky/pkg/forky/service" @@ -13,6 +18,10 @@ import ( "github.com/julienschmidt/httprouter" ) +type GetFramesBatchRequest struct { + IDs []string `json:"ids"` +} + func (h *HTTP) handleV1GetFrame(ctx context.Context, _ *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { return fhttp.NewUnsupportedMediaTypeResponse(nil), err @@ -48,3 +57,106 @@ func (h *HTTP) handleV1GetFrame(ctx context.Context, _ *http.Request, p httprout return response, nil } +func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { + log := h.log.WithField("handler", "handleV1GetFramesBatch") + log.Info("Processing batch frame request") + + if r.Body == nil { + log.Warn("Request body is empty") + return fhttp.NewBadRequestResponse(nil), errors.New("request body is empty") + } + defer r.Body.Close() + + bodyBytes, err := io.ReadAll(r.Body) + if err != nil { + log.WithError(err).Error("Failed to read request body") + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to read request body") + } + + var req GetFramesBatchRequest + if err := json.Unmarshal(bodyBytes, &req); err != nil { + log.WithError(err).Warn("Failed to decode JSON request body") + return fhttp.NewBadRequestResponse(nil), errors.Wrap(err, "invalid JSON request body") + } + + if len(req.IDs) == 0 { + log.Warn("Request contains no frame IDs") + return fhttp.NewBadRequestResponse(nil), errors.New("no frame IDs provided in request") + } + + log.WithField("num_ids", len(req.IDs)).Info("Parsed frame IDs from request") + + var bodyBuf bytes.Buffer + mpWriter := multipart.NewWriter(&bodyBuf) + + foundFrames := 0 + for _, id := range req.IDs { + frame, err := h.svc.GetFrame(ctx, id) + if err != nil { + if errors.Is(err, service.ErrFrameNotFound) { + log.WithField("id", id).Warn("Frame not found, skipping") + continue + } + log.WithField("id", id).WithError(err).Error("Failed to get frame, skipping") + continue + } + + frameContent, err := frame.AsGzipJSON() + if err != nil { + log.WithField("id", id).WithError(err).Error("Failed to serialize frame to gzipped JSON, skipping") + continue + } + + frameFileName := fmt.Sprintf("%s.json.gz", frame.Metadata.ID) + frameContentType := "application/gzip" + + partHeaders := make(textproto.MIMEHeader) + partHeaders.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, frameFileName)) + partHeaders.Set("Content-Type", frameContentType) + partHeaders.Set("Content-ID", fmt.Sprintf("<%s>", frame.Metadata.ID)) + partHeaders.Set("Content-Encoding", "gzip") + + partWriter, err := mpWriter.CreatePart(partHeaders) + if err != nil { + log.WithError(err).Error("Failed to create multipart part") + mpWriter.Close() + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to create multipart part") + } + + if _, err = partWriter.Write(frameContent); err != nil { + log.WithError(err).Error("Failed to write frame content to multipart part") + mpWriter.Close() + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to write frame content to part") + } + foundFrames++ + log.WithField("id", id).Debug("Added frame to multipart response") + } + + if err := mpWriter.Close(); err != nil { + log.WithError(err).Error("Failed to close multipart writer") + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to close multipart writer") + } + + if foundFrames == 0 { + log.Warn("No frames found for the provided IDs") + return fhttp.NewNotFoundResponse(nil), errors.New("no frames found for the provided IDs") + } + + log.WithField("found_frames", foundFrames).Info("Finished bundling frames") + + response := &fhttp.Response{ + StatusCode: http.StatusOK, + Headers: map[string]string{ + "Content-Type": fmt.Sprintf("multipart/mixed; boundary=%s", mpWriter.Boundary()), + }, + ExtraData: map[string]interface{}{ + "_raw_content": bodyBuf.Bytes(), + }, + } + + if h.config.EdgeCacheConfig.Enabled { + response.Headers["Cache-Control"] = fmt.Sprintf("public, max-age=%[1]v, s-maxage=%[1]v", h.config.EdgeCacheConfig.FrameTTL.Seconds()) + } + + return response, nil +} diff --git a/pkg/forky/api/http.go b/pkg/forky/api/http.go index fe7e46c..266a6b6 100644 --- a/pkg/forky/api/http.go +++ b/pkg/forky/api/http.go @@ -1,15 +1,11 @@ package api import ( - "bytes" // Added - "context" - "encoding/json" - "fmt" // Added - "io" - "mime/multipart" // Added + // Added + "context" // Added + // Added "net/http" - "net/textproto" // Added - + // Added // Added fhttp "github.com/ethpandaops/forky/pkg/forky/api/http" "github.com/pkg/errors" @@ -64,124 +60,3 @@ func (h *HTTP) wrappedHandler(handler func(ctx context.Context, r *http.Request, fhttp.WrappedHandler(h.log, h.metrics, handler)(w, r, p) } } - -// handleV1GetFramesBatch handles requests to fetch multiple frames by their IDs. -// GetFramesBatchRequest defines the structure for the batch frame request body. -type GetFramesBatchRequest struct { - IDs []string `json:"ids"` -} - -// handleV1GetFramesBatch handles requests to fetch multiple frames by their IDs. -// It expects a POST request with a JSON body containing an array of frame IDs, like {"ids": ["id1", "id2"]}. -// It returns a multipart/mixed response containing the requested frames. -func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - log := h.log.WithField("handler", "handleV1GetFramesBatch") - log.Info("Processing batch frame request") - - if r.Body == nil { - log.Warn("Request body is empty") - return fhttp.NewBadRequestResponse(nil), errors.New("request body is empty") // Pass nil resolvers for error responses - } - defer r.Body.Close() - - bodyBytes, err := io.ReadAll(r.Body) - if err != nil { - log.WithError(err).Error("Failed to read request body") - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to read request body") - } - - var req GetFramesBatchRequest - if err := json.Unmarshal(bodyBytes, &req); err != nil { - log.WithError(err).Warn("Failed to decode JSON request body") - return fhttp.NewBadRequestResponse(nil), errors.Wrap(err, "invalid JSON request body") - } - - if len(req.IDs) == 0 { - log.Warn("Request contains no frame IDs") - return fhttp.NewBadRequestResponse(nil), errors.New("no frame IDs provided in request") - } - - log.WithField("num_ids", len(req.IDs)).Info("Parsed frame IDs from request") - - // --- Start fetching and bundling --- - var bodyBuf bytes.Buffer - mpWriter := multipart.NewWriter(&bodyBuf) - - foundFrames := 0 - for _, id := range req.IDs { - frame, err := h.svc.GetFrame(ctx, id) - if err != nil { - if errors.Is(err, service.ErrFrameNotFound) { - log.WithField("id", id).Warn("Frame not found, skipping") - continue // Skip this frame - } - // For other errors, log and continue for now. - log.WithField("id", id).WithError(err).Error("Failed to get frame, skipping") - continue - } - - // --- Get frame content as gzipped JSON --- - frameContent, err := frame.AsGzipJSON() - if err != nil { - log.WithField("id", id).WithError(err).Error("Failed to serialize frame to gzipped JSON, skipping") - continue - } - - frameFileName := fmt.Sprintf("%s.json.gz", frame.Metadata.ID) - frameContentType := "application/gzip" // Content is gzipped JSON - // --- End frame content --- - - partHeaders := make(textproto.MIMEHeader) - partHeaders.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, frameFileName)) - partHeaders.Set("Content-Type", frameContentType) - partHeaders.Set("Content-ID", fmt.Sprintf("<%s>", frame.Metadata.ID)) // Use frame ID for Content-ID - partHeaders.Set("Content-Encoding", "gzip") // Explicitly set Content-Encoding to gzip - - partWriter, err := mpWriter.CreatePart(partHeaders) - if err != nil { - log.WithError(err).Error("Failed to create multipart part") - mpWriter.Close() // Attempt cleanup - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to create multipart part") - } - - if _, err = partWriter.Write(frameContent); err != nil { - log.WithError(err).Error("Failed to write frame content to multipart part") - mpWriter.Close() // Attempt cleanup - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to write frame content to part") - } - foundFrames++ - log.WithField("id", id).Debug("Added frame to multipart response") - } - - // Close the multipart writer to finalize the body - if err := mpWriter.Close(); err != nil { - log.WithError(err).Error("Failed to close multipart writer") - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to close multipart writer") - } - - if foundFrames == 0 { - log.Warn("No frames found for the provided IDs") - return fhttp.NewNotFoundResponse(nil), errors.New("no frames found for the provided IDs") - } - - log.WithField("found_frames", foundFrames).Info("Finished bundling frames") - - // Create a custom response with direct multipart data - // This bypasses the JSON marshaling that's causing errors - response := &fhttp.Response{ - StatusCode: http.StatusOK, - Headers: map[string]string{ - "Content-Type": fmt.Sprintf("multipart/mixed; boundary=%s", mpWriter.Boundary()), - }, - ExtraData: map[string]interface{}{ - "_raw_content": bodyBuf.Bytes(), // Store raw content to be retrieved by the handler - }, - } - - // Optional: Add cache headers if applicable - if h.config.EdgeCacheConfig.Enabled { - response.Headers["Cache-Control"] = fmt.Sprintf("public, max-age=%[1]v, s-maxage=%[1]v", h.config.EdgeCacheConfig.FrameTTL.Seconds()) - } - - return response, nil -} From c6009d634276ae68ba51eb1fb93f86214193b606 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 16:10:48 +1000 Subject: [PATCH 05/27] lint --- .golangci.yml | 2 +- pkg/forky/api/frames.go | 21 +++++++------- pkg/forky/api/http/routing.go | 2 ++ pkg/forky/db/frame_metadata.go | 10 +++++-- pkg/forky/db/indexer.go | 1 + pkg/forky/db/indexer_test.go | 50 +++++++++++++++++++++++---------- pkg/forky/ethereum/ethereum.go | 1 + pkg/forky/source/beacon_node.go | 38 +++++++++++++++++++++---- web/vite.config.ts | 5 ++++ 9 files changed, 95 insertions(+), 35 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index aaccdc9..98caad7 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -29,7 +29,7 @@ linters: - durationcheck - errcheck - errname - - exportloopref + - copyloopvar - gocritic - gocyclo - gofmt diff --git a/pkg/forky/api/frames.go b/pkg/forky/api/frames.go index b587991..0b41e53 100644 --- a/pkg/forky/api/frames.go +++ b/pkg/forky/api/frames.go @@ -59,10 +59,9 @@ func (h *HTTP) handleV1GetFrame(ctx context.Context, _ *http.Request, p httprout } func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { log := h.log.WithField("handler", "handleV1GetFramesBatch") - log.Info("Processing batch frame request") + log.Debug("Processing batch frame request") if r.Body == nil { - log.Warn("Request body is empty") return fhttp.NewBadRequestResponse(nil), errors.New("request body is empty") } defer r.Body.Close() @@ -75,35 +74,35 @@ func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p ht var req GetFramesBatchRequest if err := json.Unmarshal(bodyBytes, &req); err != nil { - log.WithError(err).Warn("Failed to decode JSON request body") return fhttp.NewBadRequestResponse(nil), errors.Wrap(err, "invalid JSON request body") } if len(req.IDs) == 0 { - log.Warn("Request contains no frame IDs") return fhttp.NewBadRequestResponse(nil), errors.New("no frame IDs provided in request") } - log.WithField("num_ids", len(req.IDs)).Info("Parsed frame IDs from request") + log.WithField("num_ids", len(req.IDs)).Debug("Processing frame IDs") var bodyBuf bytes.Buffer mpWriter := multipart.NewWriter(&bodyBuf) foundFrames := 0 + for _, id := range req.IDs { frame, err := h.svc.GetFrame(ctx, id) if err != nil { if errors.Is(err, service.ErrFrameNotFound) { - log.WithField("id", id).Warn("Frame not found, skipping") + log.WithField("id", id).Debug("Frame not found, skipping") continue } - log.WithField("id", id).WithError(err).Error("Failed to get frame, skipping") + + log.WithField("id", id).WithError(err).Debug("Failed to get frame, skipping") continue } frameContent, err := frame.AsGzipJSON() if err != nil { - log.WithField("id", id).WithError(err).Error("Failed to serialize frame to gzipped JSON, skipping") + log.WithField("id", id).WithError(err).Debug("Failed to serialize frame to gzipped JSON, skipping") continue } @@ -111,7 +110,7 @@ func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p ht frameContentType := "application/gzip" partHeaders := make(textproto.MIMEHeader) - partHeaders.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, frameFileName)) + partHeaders.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%q"`, frameFileName)) partHeaders.Set("Content-Type", frameContentType) partHeaders.Set("Content-ID", fmt.Sprintf("<%s>", frame.Metadata.ID)) partHeaders.Set("Content-Encoding", "gzip") @@ -128,6 +127,7 @@ func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p ht mpWriter.Close() return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to write frame content to part") } + foundFrames++ log.WithField("id", id).Debug("Added frame to multipart response") } @@ -138,11 +138,10 @@ func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p ht } if foundFrames == 0 { - log.Warn("No frames found for the provided IDs") return fhttp.NewNotFoundResponse(nil), errors.New("no frames found for the provided IDs") } - log.WithField("found_frames", foundFrames).Info("Finished bundling frames") + log.WithField("found_frames", foundFrames).Debug("Finished bundling frames") response := &fhttp.Response{ StatusCode: http.StatusOK, diff --git a/pkg/forky/api/http/routing.go b/pkg/forky/api/http/routing.go index 8449a3c..e829c30 100644 --- a/pkg/forky/api/http/routing.go +++ b/pkg/forky/api/http/routing.go @@ -64,9 +64,11 @@ func WrappedHandler(log logrus.FieldLogger, metrics *Metrics, handler func(ctx c if rawBytes, ok := rawContent.([]byte); ok { // Raw content handling - write directly to response w.WriteHeader(response.StatusCode) + if _, err := w.Write(rawBytes); err != nil { log.WithError(err).Error("Failed to write raw content") } + return } } diff --git a/pkg/forky/db/frame_metadata.go b/pkg/forky/db/frame_metadata.go index 53967bb..17425c3 100644 --- a/pkg/forky/db/frame_metadata.go +++ b/pkg/forky/db/frame_metadata.go @@ -39,9 +39,11 @@ func (f *FrameMetadata) AsFrameMetadata() *types.FrameMetadata { l := FrameMetadataLabels(f.Labels) return &types.FrameMetadata{ - ID: f.ID, - Node: f.Node, - WallClockSlot: phase0.Slot(f.WallClockSlot), + ID: f.ID, + Node: f.Node, + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 + WallClockSlot: phase0.Slot(f.WallClockSlot), + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 WallClockEpoch: phase0.Epoch(f.WallClockEpoch), FetchedAt: f.FetchedAt, Labels: l.AsStrings(), @@ -53,7 +55,9 @@ func (f *FrameMetadata) AsFrameMetadata() *types.FrameMetadata { func (f *FrameMetadata) FromFrameMetadata(metadata *types.FrameMetadata) *FrameMetadata { f.ID = metadata.ID f.Node = metadata.Node + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 f.WallClockSlot = int64(metadata.WallClockSlot) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 f.WallClockEpoch = int64(metadata.WallClockEpoch) f.FetchedAt = metadata.FetchedAt diff --git a/pkg/forky/db/indexer.go b/pkg/forky/db/indexer.go index 0c0fa7c..b4d186f 100644 --- a/pkg/forky/db/indexer.go +++ b/pkg/forky/db/indexer.go @@ -563,6 +563,7 @@ func (i *Indexer) DeleteFrameMetadataLabelsByName(ctx context.Context, name stri return 0, result.Error } + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 return uint64(result.RowsAffected), nil } diff --git a/pkg/forky/db/indexer_test.go b/pkg/forky/db/indexer_test.go index 1153631..3c08563 100644 --- a/pkg/forky/db/indexer_test.go +++ b/pkg/forky/db/indexer_test.go @@ -69,7 +69,9 @@ func TestFrame_AsFrameMetadata(t *testing.T) { assert.Equal(t, frame.ID, metadata.ID) assert.Equal(t, frame.Node, metadata.Node) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 assert.Equal(t, phase0.Slot(frame.WallClockSlot), metadata.WallClockSlot) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 assert.Equal(t, phase0.Epoch(frame.WallClockEpoch), metadata.WallClockEpoch) assert.Equal(t, frame.FetchedAt, metadata.FetchedAt) l := FrameMetadataLabels(frame.Labels) @@ -258,6 +260,7 @@ func TestIndexer_ListFrames(t *testing.T) { } assert.Len(t, frames, 1) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 assert.Equal(t, int64(frame.WallClockSlot), frames[0].WallClockSlot) }) @@ -292,6 +295,7 @@ func TestIndexer_ListFrames(t *testing.T) { } assert.Len(t, frames, 1) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 assert.Equal(t, int64(frame.WallClockEpoch), frames[0].WallClockEpoch) }) @@ -435,8 +439,10 @@ func TestIndexer_ListFrames(t *testing.T) { id := uuid.New().String() node := fmt.Sprintf("node-%d", i) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 slot := phase0.Slot(testRandIntn(1000)) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 epoch := phase0.Epoch(testRandIntn(100)) labels := []string{fmt.Sprintf("label%d", testRandIntn(10)), fmt.Sprintf("label%d", testRandIntn(10))} @@ -483,10 +489,12 @@ func TestIndexer_ListFrames(t *testing.T) { } if testRandIntn(2) == 1 { + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 filter.AddSlot(uint64(testRandIntn(1000))) } if testRandIntn(2) == 1 { + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 filter.AddEpoch(uint64(testRandIntn(100))) } @@ -527,10 +535,12 @@ func TestIndexer_ListFrames(t *testing.T) { t.Fatalf("expected FetchedAt after %s, got %s", *filter.After, frame.FetchedAt) } + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 if filter.Slot != nil && *filter.Slot != uint64(frame.WallClockSlot) { t.Fatalf("expected WallClockSlot %d, got %d", *filter.Slot, frame.WallClockSlot) } + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 if filter.Epoch != nil && *filter.Epoch != uint64(frame.WallClockEpoch) { t.Fatalf("expected WallClockEpoch %d, got %d", *filter.Epoch, frame.WallClockEpoch) } @@ -577,9 +587,11 @@ func TestIndexer_ListFrames(t *testing.T) { // Add a few random frames for i := 0; i < 10; i++ { frame := &types.FrameMetadata{ - ID: uuid.New().String(), - Node: fmt.Sprintf("node%d", i), - WallClockSlot: phase0.Slot(testRandIntn(1000)), + ID: uuid.New().String(), + Node: fmt.Sprintf("node%d", i), + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 + WallClockSlot: phase0.Slot(testRandIntn(1000)), + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 WallClockEpoch: phase0.Epoch(testRandIntn(100)), FetchedAt: time.Now(), Labels: []string{fmt.Sprintf("label%d", testRandIntn(10))}, @@ -624,9 +636,11 @@ func TestIndexer_ListNodesWithFrames(t *testing.T) { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ - ID: uuid.New().String(), - Node: node, - WallClockSlot: phase0.Slot(testRandIntn(1000)), + ID: uuid.New().String(), + Node: node, + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 + WallClockSlot: phase0.Slot(testRandIntn(1000)), + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 WallClockEpoch: phase0.Epoch(testRandIntn(100)), FetchedAt: time.Now(), Labels: []string{fmt.Sprintf("label%d", testRandIntn(10))}, @@ -666,9 +680,11 @@ func TestIndexer_ListNodesWithFrames(t *testing.T) { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ - ID: uuid.New().String(), - Node: node, - WallClockSlot: phase0.Slot(testRandIntn(1000)), + ID: uuid.New().String(), + Node: node, + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 + WallClockSlot: phase0.Slot(testRandIntn(1000)), + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 WallClockEpoch: phase0.Epoch(testRandIntn(100)), FetchedAt: time.Now(), Labels: []string{fmt.Sprintf("label%d", testRandIntn(10))}, @@ -719,9 +735,11 @@ func TestIndexer_DeleteFrameMetadata(t *testing.T) { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ - ID: uuid.New().String(), - Node: node, - WallClockSlot: phase0.Slot(testRandIntn(1000)), + ID: uuid.New().String(), + Node: node, + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 + WallClockSlot: phase0.Slot(testRandIntn(1000)), + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 WallClockEpoch: phase0.Epoch(testRandIntn(100)), FetchedAt: time.Now(), Labels: []string{fmt.Sprintf("label%d", testRandIntn(10))}, @@ -765,9 +783,11 @@ func TestIndexer_DeleteFrameMetadata(t *testing.T) { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ - ID: uuid.New().String(), - Node: node, - WallClockSlot: phase0.Slot(testRandIntn(1000)), + ID: uuid.New().String(), + Node: node, + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 + WallClockSlot: phase0.Slot(testRandIntn(1000)), + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 WallClockEpoch: phase0.Epoch(testRandIntn(100)), FetchedAt: time.Now(), Labels: nil, diff --git a/pkg/forky/ethereum/ethereum.go b/pkg/forky/ethereum/ethereum.go index a25c38e..693f976 100644 --- a/pkg/forky/ethereum/ethereum.go +++ b/pkg/forky/ethereum/ethereum.go @@ -27,6 +27,7 @@ func NewBeaconChain(log logrus.FieldLogger, config *Config) (*BeaconChain, error return nil, errors.Wrap(err, "failed to parse seconds per slot") } + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 genesisTime := time.Unix(int64(config.Network.Spec.GenesisTime), 0) wc := ethwallclock.NewEthereumBeaconChain(genesisTime, secondsPerSlot, config.Network.Spec.SlotsPerEpoch) diff --git a/pkg/forky/source/beacon_node.go b/pkg/forky/source/beacon_node.go index 00d15f5..eabbc6b 100644 --- a/pkg/forky/source/beacon_node.go +++ b/pkg/forky/source/beacon_node.go @@ -178,29 +178,52 @@ func (b *BeaconNode) bootstrap(ctx context.Context) error { b.client = client + genesisProvider, ok := b.client.(eth2client.GenesisProvider) + if !ok { + return errors.New("client does not support genesis provider") + } + // Fetch the genesis time and network parameters. - rsp, err := b.client.(eth2client.GenesisProvider).Genesis(ctx, &api.GenesisOpts{}) + rsp, err := genesisProvider.Genesis(ctx, &api.GenesisOpts{}) if err != nil { return perrors.Wrap(err, "failed to fetch genesis time") } + if rsp == nil || rsp.Data == nil { + return errors.New("received nil response when fetching genesis time") + } + b.genesis = rsp.Data // Fetch the network parameters. - specRsp, err := b.client.(eth2client.SpecProvider).Spec(ctx, &api.SpecOpts{}) + specProvider, ok := b.client.(eth2client.SpecProvider) + if !ok { + return errors.New("client does not support spec provider") + } + + specRsp, err := specProvider.Spec(ctx, &api.SpecOpts{}) if err != nil { return perrors.Wrap(err, "failed to fetch spec") } + if specRsp == nil || specRsp.Data == nil { + return errors.New("received nil response when fetching spec") + } + spec := specRsp.Data - secondsPerSlot, ok := spec["SECONDS_PER_SLOT"] + secondsPerSlotSpec, ok := spec["SECONDS_PER_SLOT"] if !ok { return errors.New("failed to fetch SECONDS_PER_SLOT") } + secondsPerSlot, ok := secondsPerSlotSpec.(time.Duration) + if !ok { + return errors.New("failed to cast SECONDS_PER_SLOT to time.Duration") + } + //nolint:unconvert //incorrect - b.secondsPerSlot = time.Duration(secondsPerSlot.(time.Duration)) + b.secondsPerSlot = time.Duration(secondsPerSlot) slotsPerEpoch, ok := spec["SLOTS_PER_EPOCH"] if !ok { @@ -234,7 +257,12 @@ func (b *BeaconNode) fetchFrame(ctx context.Context) error { return perrors.Wrap(err, "failed to get current wallclock") } - rsp, err := b.client.(eth2client.NodeVersionProvider).NodeVersion(ctx, &api.NodeVersionOpts{}) + nodeVersionProvider, ok := b.client.(eth2client.NodeVersionProvider) + if !ok { + return errors.New("client does not support node version provider") + } + + rsp, err := nodeVersionProvider.NodeVersion(ctx, &api.NodeVersionOpts{}) if err != nil { return perrors.Wrap(err, "failed to get node version") } diff --git a/web/vite.config.ts b/web/vite.config.ts index 5d02fec..ab09066 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -10,6 +10,11 @@ export default defineConfig({ }, server: { proxy: { + // '/api': { + // target: 'https://forky.mainnet.ethpandaops.io', + // changeOrigin: true, + // secure: false, + // }, '/api': { target: 'http://localhost:5555', }, From c8aaa8e49372dc3c6d2ba72e4348ab37490be831 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 16:18:41 +1000 Subject: [PATCH 06/27] lint --- pkg/forky/api/frames.go | 8 ++++++++ pkg/forky/db/indexer_test.go | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/forky/api/frames.go b/pkg/forky/api/frames.go index 0b41e53..60782fa 100644 --- a/pkg/forky/api/frames.go +++ b/pkg/forky/api/frames.go @@ -69,6 +69,7 @@ func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p ht bodyBytes, err := io.ReadAll(r.Body) if err != nil { log.WithError(err).Error("Failed to read request body") + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to read request body") } @@ -93,16 +94,19 @@ func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p ht if err != nil { if errors.Is(err, service.ErrFrameNotFound) { log.WithField("id", id).Debug("Frame not found, skipping") + continue } log.WithField("id", id).WithError(err).Debug("Failed to get frame, skipping") + continue } frameContent, err := frame.AsGzipJSON() if err != nil { log.WithField("id", id).WithError(err).Debug("Failed to serialize frame to gzipped JSON, skipping") + continue } @@ -119,21 +123,25 @@ func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p ht if err != nil { log.WithError(err).Error("Failed to create multipart part") mpWriter.Close() + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to create multipart part") } if _, err = partWriter.Write(frameContent); err != nil { log.WithError(err).Error("Failed to write frame content to multipart part") mpWriter.Close() + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to write frame content to part") } foundFrames++ + log.WithField("id", id).Debug("Added frame to multipart response") } if err := mpWriter.Close(); err != nil { log.WithError(err).Error("Failed to close multipart writer") + return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to close multipart writer") } diff --git a/pkg/forky/db/indexer_test.go b/pkg/forky/db/indexer_test.go index 3c08563..e464e86 100644 --- a/pkg/forky/db/indexer_test.go +++ b/pkg/forky/db/indexer_test.go @@ -260,6 +260,7 @@ func TestIndexer_ListFrames(t *testing.T) { } assert.Len(t, frames, 1) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 assert.Equal(t, int64(frame.WallClockSlot), frames[0].WallClockSlot) }) @@ -295,6 +296,7 @@ func TestIndexer_ListFrames(t *testing.T) { } assert.Len(t, frames, 1) + //nolint:gosec // ignore integer overflow conversion uint64 -> int64 assert.Equal(t, int64(frame.WallClockEpoch), frames[0].WallClockEpoch) }) @@ -438,10 +440,8 @@ func TestIndexer_ListFrames(t *testing.T) { for i := 0; i < 1000; i++ { id := uuid.New().String() node := fmt.Sprintf("node-%d", i) - //nolint:gosec // ignore integer overflow conversion uint64 -> int64 slot := phase0.Slot(testRandIntn(1000)) - //nolint:gosec // ignore integer overflow conversion uint64 -> int64 epoch := phase0.Epoch(testRandIntn(100)) From 5b76ef605d219a6cca6ffd08e8317939225145b2 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 16:21:32 +1000 Subject: [PATCH 07/27] bump golangci --- .github/workflows/vet.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vet.yaml b/.github/workflows/vet.yaml index 0556d0e..282c9a1 100644 --- a/.github/workflows/vet.yaml +++ b/.github/workflows/vet.yaml @@ -24,7 +24,7 @@ jobs: uses: golangci/golangci-lint-action@3a919529898de77ec3da873e3063ca4b10e7f5cc # v3.7.0 with: # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version - version: v1.60 + version: v1.64 # Optional: working directory, useful for monorepos # working-directory: somedir From 2d798e51cc35b003e0f2d8b02d797a5ec48b755b Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Fri, 2 May 2025 16:50:23 +1000 Subject: [PATCH 08/27] fix(web): build errors --- web/package.json | 2 +- web/src/hooks/useQuery.ts | 40 +++++++++++---------------------------- web/src/index.tsx | 1 + 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/web/package.json b/web/package.json index f288f32..39be11a 100644 --- a/web/package.json +++ b/web/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "build": "tsc -b && vite build", + "build": "tsc -b tsconfig.app.json && vite build", "dev:mock": "VITE_MOCK=true vite", "dev": "vite", "generate": "NODE_OPTIONS=--experimental-strip-types NODE_NO_WARNINGS=1 node dataset-generate.ts", diff --git a/web/src/hooks/useQuery.ts b/web/src/hooks/useQuery.ts index dfd15d9..1389072 100644 --- a/web/src/hooks/useQuery.ts +++ b/web/src/hooks/useQuery.ts @@ -1,4 +1,4 @@ -import { useQuery, useQueries } from '@tanstack/react-query'; +import { useQuery, useQueries, UseQueryOptions } from '@tanstack/react-query'; import { fetchNow, fetchSpec, Spec } from '@api/ethereum'; import { fetchFrame, fetchFramesBatch } from '@api/frames'; @@ -56,20 +56,6 @@ export function useFrameQuery(id: string, enabled = true) { }); } -export function useFramesBatchQuery(ids: string[], enabled = true) { - return useQuery< - Record, - unknown, - Record, - [string, string[]] - >({ - queryKey: ['frames-batch', ids], - queryFn: () => fetchFramesBatch(ids), - enabled: enabled && ids.length > 0, - staleTime: 120_000, - }); -} - // Split an array into chunks of a specified size function chunkArray(array: T[], chunkSize: number): T[][] { const result: T[][] = []; @@ -79,38 +65,37 @@ function chunkArray(array: T[], chunkSize: number): T[][] { return result; } +type FrameQueryOptions = UseQueryOptions< + Record, + unknown, + Record, + string[] +>; + export function useFrameQueries(ids: string[], enabled = true) { - // Define the maximum number of IDs to send in a single batch request const BATCH_SIZE = 10; - - // Split IDs into chunks to avoid overwhelming the server const idChunks = ids.length > 1 ? chunkArray(ids, BATCH_SIZE) : [ids]; - // Create a batch query for each chunk - const batchQueries = useQueries({ + const batchQueries = useQueries({ queries: idChunks.map(chunk => ({ - queryKey: ['frames-batch', chunk], + queryKey: ['frames-batch', chunk.join(',')] as const, queryFn: () => fetchFramesBatch(chunk), enabled: enabled && chunk.length > 0, staleTime: 120_000, })), }); - // If not enabled or no IDs, return empty results if (!enabled || ids.length === 0) { - return ids.map(id => ({ + return ids.map(_ => ({ data: undefined, isLoading: false, error: null, })); } - // If any batch is still loading, show loading state const isLoading = batchQueries.some(query => query.isLoading); - // If all batches are done, combine the results if (!isLoading && batchQueries.every(query => query.data)) { - // Merge all batch results into a single map const mergedData: Record = {}; batchQueries.forEach(query => { if (query.data) { @@ -118,7 +103,6 @@ export function useFrameQueries(ids: string[], enabled = true) { } }); - // Map results back to the original order of IDs return ids.map(id => ({ data: mergedData[id], isLoading: false, @@ -126,9 +110,7 @@ export function useFrameQueries(ids: string[], enabled = true) { })); } - // If batches are still loading or failed, return loading/error state return ids.map(id => { - // Find which batch this ID belongs to const batchIndex = idChunks.findIndex(chunk => chunk.includes(id)); if (batchIndex === -1) { return { data: undefined, isLoading: false, error: new Error('ID not found in any batch') }; diff --git a/web/src/index.tsx b/web/src/index.tsx index caad2d9..352b2e9 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -13,6 +13,7 @@ import ErrorBoundary from '@app/ErrorBoundary'; const queryClient = new QueryClient(); TimeAgo.addDefaultLocale(en); +// @ts-expect-error ignore if (process.env.NODE_ENV === 'development' && import.meta.env.VITE_MOCK) { const { worker } = await import('@app/mocks/browser'); worker.start({ From ab899a512cc09e3fe402a6c98eab6029a47bc0c7 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Mon, 5 May 2025 13:09:01 +1000 Subject: [PATCH 09/27] remove batch endpoint and cleanup slot markets --- .goreleaser.yaml | 35 +------- pkg/forky/api/frames.go | 114 -------------------------- pkg/forky/api/http.go | 1 - web/package.json | 2 - web/src/api/frames.ts | 80 ------------------ web/src/components/SnapshotMarker.tsx | 3 - web/src/hooks/useQuery.ts | 81 ++---------------- web/src/parts/Graph.tsx | 74 +++++++++-------- web/src/utils/api.ts | 65 --------------- web/vite.config.ts | 12 +-- 10 files changed, 57 insertions(+), 410 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 7fa41ba..4af9927 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -1,3 +1,5 @@ +version: 2 + project_name: forky before: @@ -28,7 +30,7 @@ builds: checksum: name_template: 'checksums.txt' snapshot: - name_template: "{{ incpatch .Version }}{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}-next" + version_template: "{{ incpatch .Version }}{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}-next" changelog: sort: asc filters: @@ -44,8 +46,6 @@ dockers: image_templates: - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-amd64" - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-amd64" - - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-amd64" - - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-amd64" build_flag_templates: - "--platform=linux/amd64" - "--label=org.opencontainers.image.created={{.Date}}" @@ -59,8 +59,6 @@ dockers: image_templates: - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-arm64v8" - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-arm64v8" - - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-arm64v8" - - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-arm64v8" build_flag_templates: - "--platform=linux/arm64/v8" - "--label=org.opencontainers.image.created={{.Date}}" @@ -75,8 +73,6 @@ dockers: image_templates: - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-amd64" - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-amd64" - - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-amd64" - - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-amd64" build_flag_templates: - "--platform=linux/amd64" - "--label=org.opencontainers.image.created={{.Date}}" @@ -90,8 +86,6 @@ dockers: image_templates: - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-arm64v8" - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-arm64v8" - - "ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-arm64v8" - - "ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-arm64v8" build_flag_templates: - "--platform=linux/arm64/v8" - "--label=org.opencontainers.image.created={{.Date}}" @@ -112,18 +106,6 @@ docker_manifests: - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-amd64 - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-arm64v8 - - name_template: ethpandaops/{{ .ProjectName }}:{{ .Version }} - image_templates: - - ethpandaops/{{ .ProjectName }}:{{ .Version }}-amd64 - - ethpandaops/{{ .ProjectName }}:{{ .Version }}-arm64v8 - - name_template: ethpandaops/{{ .ProjectName }}:{{ .Version }}-arm64 - image_templates: - - ethpandaops/{{ .ProjectName }}:{{ .Version }}-arm64v8 - - name_template: ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest - image_templates: - - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-amd64 - - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}latest-arm64v8 - ## Debian - name_template: ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian image_templates: @@ -136,14 +118,3 @@ docker_manifests: image_templates: - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-amd64 - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-arm64v8 - - name_template: ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian - image_templates: - - ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-amd64 - - ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-arm64v8 - - name_template: ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-arm64 - image_templates: - - ethpandaops/{{ .ProjectName }}:{{ .Version }}-debian-arm64v8 - - name_template: ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest - image_templates: - - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-amd64 - - ethpandaops/{{ .ProjectName }}:{{ if .Env.RELEASE_SUFFIX }}{{ .Env.RELEASE_SUFFIX }}-{{ end }}debian-latest-arm64v8 diff --git a/pkg/forky/api/frames.go b/pkg/forky/api/frames.go index 60782fa..e8c4cf0 100644 --- a/pkg/forky/api/frames.go +++ b/pkg/forky/api/frames.go @@ -1,14 +1,10 @@ package api import ( - "bytes" "context" "encoding/json" "fmt" - "io" - "mime/multipart" "net/http" - "net/textproto" "github.com/pkg/errors" @@ -57,113 +53,3 @@ func (h *HTTP) handleV1GetFrame(ctx context.Context, _ *http.Request, p httprout return response, nil } -func (h *HTTP) handleV1GetFramesBatch(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - log := h.log.WithField("handler", "handleV1GetFramesBatch") - log.Debug("Processing batch frame request") - - if r.Body == nil { - return fhttp.NewBadRequestResponse(nil), errors.New("request body is empty") - } - defer r.Body.Close() - - bodyBytes, err := io.ReadAll(r.Body) - if err != nil { - log.WithError(err).Error("Failed to read request body") - - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to read request body") - } - - var req GetFramesBatchRequest - if err := json.Unmarshal(bodyBytes, &req); err != nil { - return fhttp.NewBadRequestResponse(nil), errors.Wrap(err, "invalid JSON request body") - } - - if len(req.IDs) == 0 { - return fhttp.NewBadRequestResponse(nil), errors.New("no frame IDs provided in request") - } - - log.WithField("num_ids", len(req.IDs)).Debug("Processing frame IDs") - - var bodyBuf bytes.Buffer - mpWriter := multipart.NewWriter(&bodyBuf) - - foundFrames := 0 - - for _, id := range req.IDs { - frame, err := h.svc.GetFrame(ctx, id) - if err != nil { - if errors.Is(err, service.ErrFrameNotFound) { - log.WithField("id", id).Debug("Frame not found, skipping") - - continue - } - - log.WithField("id", id).WithError(err).Debug("Failed to get frame, skipping") - - continue - } - - frameContent, err := frame.AsGzipJSON() - if err != nil { - log.WithField("id", id).WithError(err).Debug("Failed to serialize frame to gzipped JSON, skipping") - - continue - } - - frameFileName := fmt.Sprintf("%s.json.gz", frame.Metadata.ID) - frameContentType := "application/gzip" - - partHeaders := make(textproto.MIMEHeader) - partHeaders.Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%q"`, frameFileName)) - partHeaders.Set("Content-Type", frameContentType) - partHeaders.Set("Content-ID", fmt.Sprintf("<%s>", frame.Metadata.ID)) - partHeaders.Set("Content-Encoding", "gzip") - - partWriter, err := mpWriter.CreatePart(partHeaders) - if err != nil { - log.WithError(err).Error("Failed to create multipart part") - mpWriter.Close() - - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to create multipart part") - } - - if _, err = partWriter.Write(frameContent); err != nil { - log.WithError(err).Error("Failed to write frame content to multipart part") - mpWriter.Close() - - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to write frame content to part") - } - - foundFrames++ - - log.WithField("id", id).Debug("Added frame to multipart response") - } - - if err := mpWriter.Close(); err != nil { - log.WithError(err).Error("Failed to close multipart writer") - - return fhttp.NewInternalServerErrorResponse(nil), errors.Wrap(err, "failed to close multipart writer") - } - - if foundFrames == 0 { - return fhttp.NewNotFoundResponse(nil), errors.New("no frames found for the provided IDs") - } - - log.WithField("found_frames", foundFrames).Debug("Finished bundling frames") - - response := &fhttp.Response{ - StatusCode: http.StatusOK, - Headers: map[string]string{ - "Content-Type": fmt.Sprintf("multipart/mixed; boundary=%s", mpWriter.Boundary()), - }, - ExtraData: map[string]interface{}{ - "_raw_content": bodyBuf.Bytes(), - }, - } - - if h.config.EdgeCacheConfig.Enabled { - response.Headers["Cache-Control"] = fmt.Sprintf("public, max-age=%[1]v, s-maxage=%[1]v", h.config.EdgeCacheConfig.FrameTTL.Seconds()) - } - - return response, nil -} diff --git a/pkg/forky/api/http.go b/pkg/forky/api/http.go index 266a6b6..dc52559 100644 --- a/pkg/forky/api/http.go +++ b/pkg/forky/api/http.go @@ -45,7 +45,6 @@ func (h *HTTP) BindToRouter(_ context.Context, router *httprouter.Router) error router.GET("/api/v1/frames/:id", h.wrappedHandler(h.handleV1GetFrame)) - router.POST("/api/v1/frames/batch", h.wrappedHandler(h.handleV1GetFramesBatch)) router.POST("/api/v1/metadata", h.wrappedHandler(h.handleV1MetadataList)) router.POST("/api/v1/metadata/nodes", h.wrappedHandler(h.handleV1MetadataListNodes)) router.POST("/api/v1/metadata/slots", h.wrappedHandler(h.handleV1MetadataListSlots)) diff --git a/web/package.json b/web/package.json index 39be11a..95183e3 100644 --- a/web/package.json +++ b/web/package.json @@ -20,7 +20,6 @@ "@tailwindcss/vite": "4.1.5", "@tanstack/react-query": "5.75.0", "@tanstack/react-query-devtools": "5.75.0", - "@types/pako": "2.0.3", "clsx": "2.1.1", "graphology": "0.26.0", "graphology-layout": "0.6.1", @@ -28,7 +27,6 @@ "graphology-types": "0.24.8", "graphology-utils": "2.5.2", "javascript-time-ago": "2.5.11", - "pako": "2.1.0", "react": "19.1.0", "react-dom": "19.1.0", "react-router-dom": "7.5.3", diff --git a/web/src/api/frames.ts b/web/src/api/frames.ts index 579ed4a..2f22462 100644 --- a/web/src/api/frames.ts +++ b/web/src/api/frames.ts @@ -2,7 +2,6 @@ import { Response, V1GetFrameResponse, Frame } from '@app/types/api'; import { ProcessedData } from '@app/types/graph'; import { BASE_URL } from '@utils/environment'; import { processForkChoiceData } from '@utils/graph'; -import { parseMultipartMixed } from '@utils/api'; export async function fetchFrame(id: string): Promise { const response = await fetch(`${BASE_URL}api/v1/frames/${id}`); @@ -19,82 +18,3 @@ export async function fetchFrame(id: string): Promise { return processForkChoiceData(frame as Required); } -export async function fetchFramesBatch(ids: string[]): Promise> { - if (ids.length === 0) { - return {}; - } - - if (ids.length === 1) { - const result: Record = {}; - try { - result[ids[0]] = await fetchFrame(ids[0]); - } catch (error) { - console.error(`Error fetching single frame ${ids[0]}:`, error); - } - return result; - } - - try { - console.log(`Fetching ${ids.length} frames in batch`); - const response = await fetch(`${BASE_URL}api/v1/frames/batch`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ ids }), - }); - - if (!response.ok) { - throw new Error(`Failed to fetch frames batch: ${response.status} ${response.statusText}`); - } - - const contentType = response.headers.get('Content-Type') || ''; - if (!contentType.includes('multipart/mixed')) { - throw new Error('Expected multipart/mixed response'); - } - - const boundaryMatch = contentType.match(/boundary=([^;]+)/); - if (!boundaryMatch) { - throw new Error('Could not determine multipart boundary'); - } - const boundary = boundaryMatch[1]; - - const buffer = await response.arrayBuffer(); - const result: Record = {}; - const frames = await parseMultipartMixed(buffer, boundary); - - for (const [id, frameData] of Object.entries(frames)) { - try { - if (!frameData) { - console.warn(`No data for frame ${id}`); - continue; - } - - result[id] = processForkChoiceData(frameData as Required); - } catch (error) { - console.error(`Failed to process frame ${id}:`, error); - } - } - - if (Object.keys(result).length > 0) { - return result; - } - - throw new Error('Failed to parse any frames from batch response'); - } catch (error) { - console.warn('Batch fetch failed, falling back to individual requests:', error); - - const result: Record = {}; - await Promise.all( - ids.map(async id => { - try { - result[id] = await fetchFrame(id); - } catch (error) { - console.error(`Failed to fetch frame ${id}:`, error); - } - }), - ); - - return result; - } -} diff --git a/web/src/components/SnapshotMarker.tsx b/web/src/components/SnapshotMarker.tsx index 461e923..6652d00 100644 --- a/web/src/components/SnapshotMarker.tsx +++ b/web/src/components/SnapshotMarker.tsx @@ -42,9 +42,6 @@ function SnapshotMarker({ 'w-1 h-full', color, `h-[${segmentHeight}%]`, - i < numberOfSegments - 1 - ? 'border-b border-b-stone-200 dark:border-b-stone-600 border-b-opacity-25' - : '', i === 0 && 'rounded-t-full', i === numberOfSegments - 1 && 'rounded-b-full', )} diff --git a/web/src/hooks/useQuery.ts b/web/src/hooks/useQuery.ts index 1389072..7c7aae8 100644 --- a/web/src/hooks/useQuery.ts +++ b/web/src/hooks/useQuery.ts @@ -1,7 +1,7 @@ -import { useQuery, useQueries, UseQueryOptions } from '@tanstack/react-query'; +import { useQuery, useQueries } from '@tanstack/react-query'; import { fetchNow, fetchSpec, Spec } from '@api/ethereum'; -import { fetchFrame, fetchFramesBatch } from '@api/frames'; +import { fetchFrame } from '@api/frames'; import { fetchMetadataList, fetchMetadataNodes } from '@api/metadata'; import { FrameFilter, FrameMetaData, V1GetEthereumNowResponse } from '@app/types/api'; import { ProcessedData } from '@app/types/graph'; @@ -56,80 +56,13 @@ export function useFrameQuery(id: string, enabled = true) { }); } -// Split an array into chunks of a specified size -function chunkArray(array: T[], chunkSize: number): T[][] { - const result: T[][] = []; - for (let i = 0; i < array.length; i += chunkSize) { - result.push(array.slice(i, i + chunkSize)); - } - return result; -} - -type FrameQueryOptions = UseQueryOptions< - Record, - unknown, - Record, - string[] ->; - export function useFrameQueries(ids: string[], enabled = true) { - const BATCH_SIZE = 10; - const idChunks = ids.length > 1 ? chunkArray(ids, BATCH_SIZE) : [ids]; - - const batchQueries = useQueries({ - queries: idChunks.map(chunk => ({ - queryKey: ['frames-batch', chunk.join(',')] as const, - queryFn: () => fetchFramesBatch(chunk), - enabled: enabled && chunk.length > 0, + return useQueries({ + queries: ids.map(id => ({ + queryKey: ['frame', id], + queryFn: () => fetchFrame(id), + enabled, staleTime: 120_000, })), }); - - if (!enabled || ids.length === 0) { - return ids.map(_ => ({ - data: undefined, - isLoading: false, - error: null, - })); - } - - const isLoading = batchQueries.some(query => query.isLoading); - - if (!isLoading && batchQueries.every(query => query.data)) { - const mergedData: Record = {}; - batchQueries.forEach(query => { - if (query.data) { - Object.assign(mergedData, query.data); - } - }); - - return ids.map(id => ({ - data: mergedData[id], - isLoading: false, - error: !mergedData[id] ? new Error(`Frame ${id} not found`) : null, - })); - } - - return ids.map(id => { - const batchIndex = idChunks.findIndex(chunk => chunk.includes(id)); - if (batchIndex === -1) { - return { data: undefined, isLoading: false, error: new Error('ID not found in any batch') }; - } - - const batchQuery = batchQueries[batchIndex]; - - if (batchQuery.isLoading) { - return { data: undefined, isLoading: true, error: null }; - } - - if (batchQuery.error) { - return { data: undefined, isLoading: false, error: batchQuery.error }; - } - - return { - data: batchQuery.data?.[id], - isLoading: false, - error: !batchQuery.data?.[id] ? new Error(`Frame ${id} not found in batch`) : null, - }; - }); } diff --git a/web/src/parts/Graph.tsx b/web/src/parts/Graph.tsx index 9c9bc91..218d1ec 100644 --- a/web/src/parts/Graph.tsx +++ b/web/src/parts/Graph.tsx @@ -5,6 +5,8 @@ import { ViewfinderCircleIcon as ViewfinderCircleIconSolid, ArrowLeftCircleIcon, InformationCircleIcon, + ChevronUpIcon, + ChevronDownIcon, } from '@heroicons/react/24/solid'; import classNames from 'clsx'; import { TransformWrapper, TransformComponent, ReactZoomPanPinchRef } from 'react-zoom-pan-pinch'; @@ -52,6 +54,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un ); const [scale, setScale] = useState(scaleMultiplier); const [focused, setFocused] = useState(true); + const [isSummaryCollapsed, setIsSummaryCollapsed] = useState(false); useEffect(() => { setScaleMultiplier(calculateScaleMultiplier(windowWidth, windowHeight)); @@ -113,25 +116,12 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un return ( - + {frame.metadata.node} - - - {weightedHead?.slot} - - - + )} {!isBYO && type === 'aggregated' && formattedSummary.length && ( -
+
-
-
- Sources - + {isSummaryCollapsed ? ( + + ) : ( +
+
+ Sources +
+ + +
+
+
+ + {formattedSummary} +
-
- - {formattedSummary} -
-
+ )}
)} > { - const data = new Uint8Array(buffer); - const result: Record = {}; - const boundaryString = `--${boundary}`; - const boundaryBytes = new TextEncoder().encode(boundaryString); - - const boundaryPositions: number[] = []; - for (let i = 0; i < data.length - boundaryBytes.length; i++) { - let match = true; - for (let j = 0; j < boundaryBytes.length; j++) { - if (data[i + j] !== boundaryBytes[j]) { - match = false; - break; - } - } - if (match) { - boundaryPositions.push(i); - } - } - - for (let i = 0; i < boundaryPositions.length - 1; i++) { - const start = boundaryPositions[i] + boundaryBytes.length; - const end = boundaryPositions[i + 1]; - const partData = data.slice(start, end); - const partText = new TextDecoder().decode(partData); - - const headerEndPos = partText.indexOf('\r\n\r\n'); - if (headerEndPos === -1) continue; - - const headersText = partText.substring(0, headerEndPos); - const headers: Record = {}; - - headersText.split('\r\n').forEach(line => { - if (!line.includes(':')) return; - const [name, value] = line.split(':', 2); - headers[name.trim().toLowerCase()] = value.trim(); - }); - - const contentId = headers['content-id']; - if (!contentId) continue; - - const id = contentId.replace(/[<>]/g, ''); - const contentStart = start + headerEndPos + 4; - const contentEnd = end - 2; - const contentData = data.slice(contentStart, contentEnd); - - try { - const decompressed = pako.inflate(contentData); - const jsonString = new TextDecoder().decode(decompressed); - const frameData = JSON.parse(jsonString) as Frame; - result[id] = frameData; - } catch (error) { - console.error(`Failed to decompress/parse frame ${id}:`, error); - result[id] = null; - } - } - - return result; -} diff --git a/web/vite.config.ts b/web/vite.config.ts index ab09066..19bb7a9 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -10,14 +10,14 @@ export default defineConfig({ }, server: { proxy: { - // '/api': { - // target: 'https://forky.mainnet.ethpandaops.io', - // changeOrigin: true, - // secure: false, - // }, '/api': { - target: 'http://localhost:5555', + target: 'https://forky.mainnet.ethpandaops.io', + changeOrigin: true, + secure: false, }, + // '/api': { + // target: 'http://localhost:5555', + // }, }, }, }); From ae4ecb50ebd1dc1853b4ec1403c7d04f7c2cd547 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Mon, 5 May 2025 13:47:48 +1000 Subject: [PATCH 10/27] feat(web): update logo --- web/index.html | 11 +- web/public/android-chrome-192x192.png | Bin 26937 -> 0 bytes web/public/android-chrome-512x512.png | Bin 134239 -> 0 bytes web/public/apple-touch-icon.png | Bin 27027 -> 30604 bytes web/public/browserconfig.xml | 9 -- web/public/favicon-16x16.png | Bin 1587 -> 0 bytes web/public/favicon-32x32.png | Bin 3404 -> 0 bytes web/public/favicon-96x96.png | Bin 0 -> 11610 bytes web/public/favicon.ico | Bin 15086 -> 15086 bytes web/public/favicon.svg | 3 + web/public/mstile-150x150.png | Bin 25115 -> 0 bytes web/public/safari-pinned-tab.svg | 138 ------------------------ web/public/site.webmanifest | 38 +++---- web/public/vite.svg | 1 - web/public/web-app-manifest-192x192.png | Bin 0 -> 33458 bytes web/public/web-app-manifest-512x512.png | Bin 0 -> 173833 bytes web/src/App.tsx | 2 + web/src/assets/forky_logo.png | Bin 423976 -> 610985 bytes web/src/assets/forky_logo_small.png | Bin 25904 -> 4453 bytes 19 files changed, 31 insertions(+), 171 deletions(-) delete mode 100644 web/public/android-chrome-192x192.png delete mode 100644 web/public/android-chrome-512x512.png delete mode 100644 web/public/browserconfig.xml delete mode 100644 web/public/favicon-16x16.png delete mode 100644 web/public/favicon-32x32.png create mode 100644 web/public/favicon-96x96.png create mode 100644 web/public/favicon.svg delete mode 100644 web/public/mstile-150x150.png delete mode 100644 web/public/safari-pinned-tab.svg delete mode 100644 web/public/vite.svg create mode 100644 web/public/web-app-manifest-192x192.png create mode 100644 web/public/web-app-manifest-512x512.png diff --git a/web/index.html b/web/index.html index 39a3d76..9902a30 100644 --- a/web/index.html +++ b/web/index.html @@ -3,11 +3,12 @@ - - - - - + + + + + + 004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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
%$qhR; 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 L)MRU2lp+WMQl&`;rAwDy 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 diff --git a/web/public/apple-touch-icon.png b/web/public/apple-touch-icon.png index 6146e264a2a86bc6a52e48ac20314c8e20b33939..c2f81d485be034241759d21c5407663e19f991a3 100644 GIT binary patch literal 30604 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 - - - - - #1c1917 - - - diff --git a/web/public/favicon-16x16.png b/web/public/favicon-16x16.png deleted file mode 100644 index 3a36eea8f3c44631f72efae96eddd84db6887c6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1587 zcmai!X;70#7{?c)4GJi7tDr$Zu^LDMVhPBVL_)Yij2wbW3_*h^hY8S7Nd(KR|+t04@+ za#5XJ(!3|FCdG<`=@HJM-YtrgE0tKDP90p0Y}BHR0XRYfMIgA)0&OzD%gPN=Ck%{} zNF-tuj^TdIR^KKpcmP{^T$?wJZXLyou4?>_ARF5d(I6@$V6F*I9y0}~hJ0J#05!(w zCj`U92Er7sM!id6&mxG~qYF^>$)*Ug%^KJ-5~#rg5VOPz3C0MP(ZoGx@Hl|G6~QZ8 zH5pd@-iuiJ_@GDYQJFHOt1)MW%c5Rth(P>*+ZCq5O6{xk@gOG3x z4Tm7Nqh_Cu)82Jvm%{$MX*_G%%(B@Ork<^5jPWKDPlZW2$$Qi%3Ka);rDX3uTrJS+ z1#P{Visootzh9r_?c2A%%jaDuU-Kh{D0S{<{7<8lUt88q5ApTuT}3ZimFa!9!bdGA z@K28ll=#^>mGRug75v=X?M$!D`@=oQ8=_=6(){S;b)tqh>P1wlZ1%TjlYIZ6s>oHL z_OU@zujQU@tQg}}Kt0Dh(R-fEEh?Tbg&zX#!3CA+2jF{BqCym_A92Pa$hm%$M z$80`r{+d|3jazb~%Ky5Py_r)Jzu?SB>^tjU*}{CCpq+M%wayDl|Nb)CVct^JtLtAp zD{zRJlDh`=8oYc`@(z>9+3iY7;Qo|xp`n8Wsv( z5EC00&*AbmC-4&mNy#ZrAT>>xF4`jAnvt26y)7q~EK1vVEZUhT*(J@F73|(4UknQO z7VX<#{OHTaC8cEt6bH+}p^D0?!$-dQ`pGxdM{8>9>On)}v8Lvhr{6yNPTAVl-fH!Sy_xt-1StNF!BR&zf48KQ?i4o~w>IobKE;1bOq+dh?}M3}Gd?ra e*;+m%2nH{`mMDIW-_S!I0TOws+@biq`hNhh=z7Tj diff --git a/web/public/favicon-32x32.png b/web/public/favicon-32x32.png deleted file mode 100644 index e073774d6b0a49aeee82c0240ccb49a49994e67a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3404 zcmV-S4YTrzP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 Y12h&F_Q1jS9RL6T07*qoM6N<$f-8PQ$p8QV literal 0 HcmV?d00001 diff --git a/web/public/favicon.ico b/web/public/favicon.ico index 45e344053e4f010400732aed0b675af53b6c779b..c0961454146efbd8ae0060d21e1a4a6af084df50 100644 GIT binary patch literal 15086 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 diff --git a/web/public/favicon.svg b/web/public/favicon.svg new file mode 100644 index 0000000..0e4f6ea --- /dev/null +++ b/web/public/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/web/public/mstile-150x150.png b/web/public/mstile-150x150.png deleted file mode 100644 index f45e861d87835a91c04299efc5f3a93094c9b4e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25115 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 VIF;Z_K|cZ@FRda~DPb1;{{ZDy&jbJf diff --git a/web/public/safari-pinned-tab.svg b/web/public/safari-pinned-tab.svg deleted file mode 100644 index c02d3ff..0000000 --- a/web/public/safari-pinned-tab.svg +++ /dev/null @@ -1,138 +0,0 @@ - - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - diff --git a/web/public/site.webmanifest b/web/public/site.webmanifest index 6607128..ccf313a 100644 --- a/web/public/site.webmanifest +++ b/web/public/site.webmanifest @@ -1,19 +1,21 @@ { - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#1c1917", - "background_color": "#1c1917", - "display": "standalone" -} + "name": "MyWebSite", + "short_name": "MySite", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/web/public/vite.svg b/web/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/web/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/public/web-app-manifest-192x192.png b/web/public/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..b51bd1226e2e8e9726fe901f59f59d424b16bd0d GIT binary patch literal 33458 zcmV){Kz+Z7P)PyA07*naRCr$OeFvOX#r6N0nOk1n#d|HC_g{)gAzvhI|LND?viKGTXrY1s=^bccfdA>& z-?I1?2B;qmpmqyh@`s=@U^$v5Zehqyv?f(m>xK@s>o-KpRfppav@k#&Z>3wovJMWx z7gK^y#z^l1z*2#8hB)kDlznB#t<}dGneV(h@}fj@z2JTeKGkWnQk__Q z2VwmE?RO0P9uVTq^_-S*pv4RHlSIHd>N0;x|2Xzd)pWBhVDKS8AgPaY@fXf0XTVuG zO2pm`5?(qy%ORaW41(I4};JQV!JlH?r)TcTTwJ zi^dXI=g1;oB8^N%{@@4zMC5bi_`o@5z+&-efX2_*cGu8lAQ4ku&9!(Ax7YMA^4^A z7rKsj21vcfJr4xkGvN*rW`JY{0P#O&)tZ$UwPV7KiyCUM_Il)*D@ts-3S&(g8(fS{ zIcJXGH(_^h0NdFb#?IN_-+k-0<|OED1qCKE+hh~OFS2ZUDInYn5DEb02}bGn8p3ZO zL|zER<6FL%aAS3IKKqv(tAzn-?S7Z}%YJX`{-+Vb8Ay?vkoun6Me0AU5iC?5rJr-e z#c%gS5QGX~#s8j?D8G4AWMoA{UT&wnrM(hB-seb5<4j0>aikzFe#^;l0BpzB<+RN{ zbKTHOqYWARVApoZUy;pB$OU3t&k)W*m`H{bhK^jatLA}2i!gOw)q&63GWz;|HrMli z$#Gg3pw{kpod4Imz|ikQfU&FXt8bHvzd8^kkqg?CgdsRYoCe}E4uCL#lh{t8u`_nx zH*|YLUT*LCD?=sG=o1b$1|SMZoGxNWpz2wi**pc){@d;u{9HrEJ=nEf=Reso&U}9( zKHo72V*_Dv>Z#{R>qkCUEEeQig-wE}^Swr$5nIPz|GE?rzv7=325?{AS&J6=w#0n} zj2O2Hy}!1DSgJRY0=O~*T;f+JfKYuTVbrKc)ONyHKYsIstG{X}Z5%P>@g9|&Jjtz`pWVUr;ZT&a=nrVEMgsY|KmTF>^uYo>Kk>MOq)j(4HgA`QAXVx=kDUZgWMRJItQ# z2a-J%2mH4qjCGg%h2f)!-Q{^@*()1IGP%p_@+7blYucu!U(%fFSY!69DfhH6K#~Do z3KTlkk8-TvAf;iA{ad3FxP-xJEy?KV|58U++sPf9XQc$s{ATzc);8wl^quxZhxLWl z215AvVIRNbjJ_kbKP!}?X8h^$$WuKNpsyu{*-H7k)bx@1L#R8-0akl`)K&Fd6;SxS z^myfMJ15_|uo zjJ%qAp$!O04ZS&j+T|}B2AVMo0GT!P@2Nhn%hUV9)rypQ;Bkdgfv}VK*0kw)J0gR2 zH*{V-A`3FNmnYt##ON62)}WGEBmdUWG3s-Dhew|I9CV|vd)T?sUoFnl_*}b3sXr3? zAuR$KppzHLf72g`RekZUyM}yTpXVNK*ZgW2px=U(sl~Q^E!XvnIY4K|7|}RbjIqx& zMxXVyG2i@VzyPZ$8+=6mqTfW3`2r?dwsJeVs*X^Ilp(BKo#_{i3w-+p%IE&H0XrUTx~IqLApGf|}JhWuU` zz)Ja7fo}=*@YbtNK&cKPfqs&wpNfVfgm|gJotw8$xbdZCpXbjo;9<`Io%0r@AzxsS zjnHJI>uDHcEMJ0fkW*!yi6AVpo%I;Qq(sbmdru<+HT_qvBp>dGKI7>ADlp$rVMsTLl8CNb)KwWc=M_F08@%hD!3~z&{T3|Hzgurlw}6aHW%1cX`C}#=3L5DD z+6Ni$ZrHk4H%y`DE0>Q#IZ2kUS+5LwOU6hB`$XVFz(Ca65df<+f!(%a;tfw9in$)@ zF%N47X#d2r4&dl{ST`<17%6Gx`stKM!u3-tX(Wu#YRz#T)2-?Uw%jqayfK@1#Pmho zt2N_Iz*>&$_N*cDWF$<@g9~t+rxqy41lOGCsuboQv?+3ZgMwgU#MTq$x2baARmz}G zr!X9|@xkHWHf9ZV-E-YXAEm7RB8alW0!AI#Z#_N6_J*%SfvViZeMjm3KghQ z=WOuq$u~Vy*K-fY?+;rB5Yn(P5qOgXLZ>2(i7-r6Tv7@vDV&v5s`+1jO=&{2ttWSk zzhQV|H#{eA$+-y|t>DDSltC`{WhY^A9z4QjKs6u6HRgPlLimN78mYFl|MO$#6h-+f zrenWTk(YZxL!lJ)UawGr=007_h@PgDpQQ6&4&l+Zj0C%o3?*ztFpMdHi0k#j+$q+% z{imIG-m<3N&p(VVJUkg- zfD^y^`-uaeZPZ>zBDiC)(*PTchZ*1;5B`w!j(E0#>l^}3g;VvLw~W52LDApZ z^Gh37@O%`JOR{|As+|ws)@;$<1MNZkyrnNQ-G9-K2tZlCN%V&o|EO{M)~I|*FOePJ z(k1|Be>Lvc3C=q#86aogiau1=UL(5M-m}l7cIw8YT+fRleoB*=oMezjAQGtcm5eGsEmXQ4`_{N zOt-6--Ntv{9En7l%^TO)J#5T9hMU-?1h z9|{iW9SUv|kQXkH7dn=eX=ul+pLE0ermX#!y!WtUfKz6#^zRJ7Tu!uGg!&^bG%WlR zp0`E0EEEixA@NHY#IBL%8l?y!h8*j`!r12f;Sfou^l|gAt0v?zlt^svlVAoTb@d$2;8odg z()l1G;VMMV8M8x}KD7PLo9}P%vk#*i4m$?OnfgdNOU-y1>BjG+NUAZ=TU z-9!`*lP}d170)NkezLP+<{qjjWw*%%t$&E|H!RKU8nojh%JN4&)fmGyb9}+26<{nS z+}@WHhO^d3avK~#YYa_^*h*npY>I`np@1-!5?@(TZeV!7sIY=$iw|v`ThAH9ynXxR zh9~|sX0C_op2Lm-+Ra>$3I3GliEf^n)c;-gqul=_HpK;KxmfwyZc%ll0|zVqSL7o@ z8XFg=&!)E-F=b$}mb%bH^d;Sh-c&m6jt043dq-9p+spRMOkizzDv!-6nmuM*W0C0)ky$5gla#xr+hv5f2oh41LB`Jj8`LiIbOd-H!d;7c_=9+P-S+WDmi8haCg7 zpSPqH;>Ie_%`>FGO~oi(!&9XpDn8%sico-#*FYZujnuQ?3$=$`FA{_DEn#hjyz`{srNDXC#AW;rS0 zSlOnLBb!u`rRTK2go~qWp-uGuhOU(%!~=|pxJ%OY%rUS^#ORI?MpL)kHE=~k)_6Ey zd)P66lt|S13)hVPNl=m9@n*$C+|^Pyc<-4j9m^NXq?RXy&*% zw^nd6-^bYN75O7CYsd?4GkM-cB?eS7bm_y0|1foUPyNro-92)ZseCSDkHHjF2zk+mnn(}V^m?V z*x+4v4O)4qH@?+v54MjPp_gr>_3o%Sr)`-vy58x6sksHu$25FdW)NSw`@vx^9&D~1 zW-YzQ@%ffwLNdgjFoywimwI@w!VU9`oRm_TTNR*orW0 z2-$F6(Y&8FelIL|#r)JR`all`k5jM@S&9W11#m2zr`oZLw%$AB^@fs1x4Rd2-Cj}o zEg@)6s!2{SeE9aQ4ISgxeEng`0Nn~+F=N)A#~kdt5n*MOB}JR8%_Hy$60xYjS_+Qr z*6ESKF-Rea;al$>^4QPya@viZbzHHdz03*0=>)FWGqY}6Aal&@`^v$8x1ZY!GSb2a z#r=1izMyM`8D33@-ccpYb6_@AdAc09zp5;gDHoX?l|ERY=kWYk9|m$RnrR z1bgLiY0;ZsZK845ke6{*B%*z>$G@!77y6??of*H$==t;?|NmqYnz(=>715oI>PVW0+=+2=)oWXO3V1g;NVu?;W#y`nZCI%(?aGykpBj ze+gmaO9y8_;p|awH{|~RhHDR71`wMo%7nx$zLI0T7eWZvjsn*v{$#xp#%&Gkf8ZFp zv2f}kz|q(7#=A|(JAQjYdmm%IF<`(&CDTXl{Ha?qN6tFC(g-~RPNKYL+l;fnm~{P5 zUMt3kaE>3DvhZ)*2wowJWI2ifBtnzgrENoYzwahDKz)fsaG*5pPD}IM{`N zYIr7AbG^KbG5M>ixORCO;Uo6W$~~|OwsIv2e6Z(k8*6umS$t_p{+L1ad49(S3c4mp z>f^Qpr-Q>afkP4+p#k>d;weMxHHP<`Hn~$;SD@hE9i*L@g`(%}%%AX1edh4rcFp0< z0Pb%0j?52Lq=b62gna`Aa=MO5Z-+9%ITSO;`pU65#5g%aOT^yG3FAw@i43p$rCwC_ z#DbH{6YMQa;fINtqk2Xn|CzGcZrsewa%w(nF@8qJFgj_=L%E;UcfQ@GJlWcE_}SF5 zPG$^nS%Tk!EUWUg-}LJ7#*OFKyJB0L33K}w+kBayu{GzP*6zYX;VQoHm5t`64QtPE zeEtgqw~`CakRn$a(-)+xPEv3`2Wb1%A7Fo_(})X=)k|P%FFHB zz;~9sJblQ5R67{|O9J#O(rER)`!cGh)@R)^`dqyGLz|F3=^^cc!Uu0}R_QMSYmk|C zcHE&4aNX#GWVJB2q>4DaDdRk0$B|<{i4o4*UcPZ_edgWReLC2Ezg7nLk2SR(H~XeC zW-i3QziMUZm+zj|u&Qj$wz-iAPA^U!TBVsYO=^AKCIer%e~HBOF>@cS>p|14A_}BwxlU@sC{qe zN1yKe|8a@;GQ+$EYXZ$%6Tp$N3z!!?Bb#O9*H#BUgYAdT^X)?;ny1RNfL9kh^#BTl?jnS!JbSOmmgm3zkBZtgC03AQ?J_XGblbR_ zK5L3VXz0EFRSY0}@t>EbX@Gc=cQp2 z&f7a< z?C~>#RgN(~0oo0z5S?0_KjH2sJoQJncAB;DI6IKCRx=F0sxj)qs%v%Bk@3r9R~=P! zSCy4lIA3JN7qg;$qxQ_4P;XBZIY*DTF!^j*P)6)QS|(9s6K*?yQqbG~eGbrSUEq z;j_Mr3~V;oLFVYZlHDO5o}p*MW(b$6q9Wg>zJLqW8%#}o6tHW3?TH(c#7{h zo3SAj;2a9jMxdB6ARrhj5aS=11T6&aytm$sWyb~wIwFoNnZW*6?8 zJ@RKgR=s)T-1B&!eHHO{MFGKf>Ac6Dax^T4jr+n*)$^ru#$DZ1=~esw%v+{~<3a6- z1orh$W3egwT2R`0d*#4}QG4=2q7@&CUQ_9$C?sV{Hs2-wxQbFM6*c#(lwc^0wH-#TmjcS)ge*ZhvV zDxA*&Lsct6&f7J6#D==YtMB)n^Ov4v`GYTDgt9%_7r)&iVzp`s{iuYETWm|!R&tZk zxItqpcHTMY`uaY*sn<0t1LWi_JCz6YCy;LRko8vGiu2xH$hv_lWig51SAi&-)VGS+kFhJw2^jl3QzpGxM1AW<{ZDCW1;j>bFQh@j7K%cVW8=Nm{Wda zwcfoxXwiB;BY9ch@k@hSqlIrJ^uTcep1AMaA37#ILYcWU^2&)n*JSjuHXM!HG`DF< zG_~i}zTl~gkr8+b0i=0ePdACl>ocM%cgTikqW76wVp0Mc6;sHPAEF@wX76vGbmJKf zU3+7%Z#D+#I{)d8Hio}p)7KBU&~{{#EtNp+)pL_296aQv(*5M&$5<($*5GZWn_g&6 zbtq%htp3&5d>kBB)k=rUcK-sZP~XU-S({6&w=B)-lg>N2jIiveTF07Wy7%jTlWN2-Z=ogcBM%`|P;zFz<) zkv(e0$PyID(|{GF`t`F5r`~qRx~lYF$;n$E%z3GrYv-mBddJ=!ZRe!5**!X{n-BP$ z_}cCnfh*QU8eX*bU<8*lbIED8>0gC0Zk;p%YL!?|7T9tt>D4N(s|p=>IozCsPGisR zzGrZ=+D8YQd$TaWG4q!6*o%Fi>%s*lMpVj=!s>g~kBFj7$Tr-aS3{pjlVVC0S~ZlQCp^|B7IErOD|_*`|KOmT8Tv zTUy__WslE4smw-iV#?zkLdMCvqlv`{Mow$v*UsKKV_377Fzj2ftivt~-qQ`EbF!_n z*I-0aw@9Y<+AP&n^{6Q_Ci@Zqrw&iW&ZO_}8gxK6ZhhC^kn5U-0dn$}Jj{ckNh*i8 zroWb|AF0x`++XfSxW#O}LaVa59B^)1pYEA(!-)-9Kz*+5aL2qW_eS|LjXA{~G6Tmq zwti22p0)oqGU=r3%a>!=INQ$?6D#sYHK~ABedf?};1K>zsQgH zClzx>onD{&8+Z*$8=aS`w`;W;8^-Zo9(OYOE3)&HfK$bcy*>ltA+>s}Np+bf%F_&T z>ZUtx{}f)II{;jYu|^Q`McV9^v%1 zYlmIZ;3m@t+kuShA}Llz+G7c<4e&d$W!+n+3~O#R;HRG7e!~1?iyZWdFn%&kcG0eB zBmdp#x7C0f+fAH%MUjOUan4f^XYo{%|8d`p8c0S1hC1k_?IzDXwZg#@9K$?6H6vh( z7OOQzfG7WI5|@&>8*UDhsO;f&TOibaCaoHVuAe@rvbpA0*EmgPfU{P-l=vXAvZ zptG!FTT?q&lqQjNWW3rks?NOVuC9&-Y52&B&a$`_68QGCfYWc&$mS1+w;!E%N-;%$ zXP6ivphN1)z^ZHG>id1l*mSsUwQ(b8mgF5wV_~yNf1PYr&xmAk$>dru6LK#}+ZJ7rkPIPe-&G_L#xb z22?#8xA>5B2f5xt$J&>Q=~bKV87x$^MkV*xXWsi?(_{wt&67`e+)+u_Xgj`4NCm0vh=;0{>jgUE#Q_omwB#?>xs$- zNYq-L(=luP$D^-pRs!u7DM;B`_f8oEY+A(l5LQ4x6RD`zA@v}zNg*TSsklvG{h$6Ee=4IhTucL z#^&^FoBfJcezL;@k9D^--=7)6R{zbnkcjlPcCsb4Xs>89rQ<$EyY08*?HD=@Lb5GjHS@%SB ze>2ocj-yE{59xk0X;qInN|Be&qo=_C$^BrOwi-6ie z?i8d1d~>%=8T!Ni^AUo^4yK+HPuTZTY#faRI#lEWsG`P#8GtYv)4B7MX_$FiKJ#ye zgFv|JT5nUnZ!!ajhj++ZbT2nU_tu~Q#ivPsf3nq%L<735jXW2a)D1<21HnBG+m$G< z-e6Ow3nE64Asz+*ommd@AzBHR{eDo#YqU_xnrKDwZtAe=ZpWTiwQlGMc6~RYcO+u$ zC`o-F2KpF-C)RZh`Y-zO;bF~cbc?x&=WMHJwSfXkOV`jTKdJ3y)Bpe=07*naR7^iK z?T!w#?pEVw9vQWbw<%-36FTMe{9wW#8ripiqww(g89tvgwA{k?aKiv%S(~%Mc+~bO zBUab7=c4uOKURO)&jL7;0q%-07{G9`4*dPLnW=BSKj`wG&Di~^xi$*}996KmYcbb9 zLz*6{ZNAi0aqwDi*7WuATw<~ey;PGZ4{|f-jUU)IS=ntje|6_Id+U;R9doC5Ek^oF7S?k@+_|S~ z%s;QWp$XX|XIx&40?!-3Ud=+zbzAetl+{Hr&Gmi8=sEe79Os6?o>DSrY~w(0oTIF< zdFNFzGTy@anS|1E6T{=F20XH3`p;9ny1Dk_VB<6k1BeH7oV8?zt(oJzj%(5e@Y-uC z$*;VlvaF#xAyi93H9bU~uXHVT$?iLToXRMAh3)&iBvh&U!$zvVtsP68Vmt6V%Hb3X zNQTV00F(fPDv4!Rn3!$Ux$|nfbn~57zdP#Ncg{XgZ61y~j+%Yx4^;cRhS2s@js9*= z-k2@Twc(;t+^cK1zZTbmr-wM3TsC`HeqBu2T+cr0uK67|l+$l8g3>UGpR=!EVuPD? z_lYdb*i~F{Z#6cr;|S7CYJZ+W_~0NVUpFU)sJYhMlyRDk0kUT-%_0~*&#-rH@4m#+`Hu#n3XylS836? zmS!AJ5GwIed$EzB-S}^}V;*7(j^go_SC8t71?<5jjcql2-M~Wt)Yh+bh|8 z!3zsknJn>8H-{9w6B*dJvV5GQqvkxFRlH+w&p1Q9DaXAj!o3)SZj`h3qE;@!+`eSQSAyM|2yeO5m{He>953+vZ2L_{a%n!a8hL#U59qV{G3=;#zX zyt+9zx%bMIM){h(;V5x}W;oQwsj52DV)Psv$f*uTKF~BV*92fvg@A_`10MlrOIrEXR%Hu3-jIwO! z6huf65Y|K-m{FF{ffo~kR%E20C12d$_|A$A-L!rSKGjRM|MR$L%s$y-aB8*X90Qsj z28_cTp@5$|kEbAKTtn1`{pXN5c3zKaK<|Q0@m0qkowIo0*^N8Z8o0RZ+h$}{7{>E9 zkl$qT*p-EIC;Z<*hY&{Y=s8)`p<^nEHjWd`)@}Q{Oh3upJ|p-220s2*d-)+@fZDt9 z+ee?v+EKhWhdDfjVa;xx;@jK4N2{%`UUX5Dx|%e{j*9}d+jf87#n#DDr8b%;7&HYt z1B&y<{G+ksXHK3!zT8IBQaGJiJWJKu|2cj#M$P(TB^b*!$9eyfGu!|EV3pnkK<~@q zb(clCHr6KENtil&ObqkFx_{yBS&eJ-_j9cAP(0(1Gr*yk^r09tYh3=gGKWml7+v2j zC*#CMMr~1e+#?$q;;jvEPA#1|>Z?OB*8`0i%ANDMjZv>O9WLH8bL3B^TXq`qP}_21 zOsm%YmjLioKXX1IW;JlX-ul&=l)>din-n|1>75FJ50Ytb#fCMvqX19c82NM?4Y)-iW zgqeOLVOhMevO2mak${-tqY2`~qZ-MM)n!Dt8$bKfeU|>bf!O=0G5e3ZAOBC?y~CK< z{x~8hM=dtTB6=Uf`41tm=lKcDX^P6%97Om_j?uyZHM@_pM$J689L(i_5egxCb@A+a zdr`zFC}UjylhvB<`jCm9PU)QW21n2p13r=i?+BcCV1P0i=Y9c!lvS-|a!^g@dC~C$ za}e0rV&G5&jWUze@stn`tyE~?c0 z%dl-%WCYn+g%6MUQLUlYxikM%!L=z4(z+PTDhud*0;l?OC38nsG?ZBW8?SF+fc@TT z|CJy3UtROjI?K?zr(kw_(X3Gm5A@>uz4THbnlRggZC{dL>_!IYXapF`zFh+6AtXGb zq6Vhy=fz}3l$RN&YGjgtA85>yt&S8#ShT%Y{f`wJU;(WMghZ)9^&>B%j1fkE(5bVa zq9T4woWUQ$iHf|Exf93Biy{%6UDc{nB5vJZ4cfIFL3M!I@3v3(4R5wmi2o(r(82%* zc#+xT3(l>ecm=1-&i2uBw@n}Ot#{d}FRTskiI<**IKGl|_&oz?BV&C6HyCpTGIP_h>ABPSY{on91WCzFI+B%x~5tBwfqs<1j8kZkJCnJ6vjFt9BL zGIW}o1$40;^rM|Sim!!7z ztC$|sjobZB;>|uC+x=1C-B0-I%SV-R{xA^oTVRkTB{E}(+Kx@$xNv!3u zXei3aZ@{sPAhVWYCvjhKagV}Z3U1tNlzNB;YGHt%*w`Z@kN4PG9($3SX4_OkC#M{h zlf@94ECPD+7Rr!gJDesgp{xVZbxuqJoOl8;+fgtNlx*ZDF?%u_&;tZ=j`Uyv77E!mtvS1RCg(y!2 z9@SZ5Wf;K&+a4U;(bPKCeV16mm1Ae-NH(KA=r*j%aUqP3N%TSK{!@JhJ5aBk(y zbUV4K5`Wk#drQ0`PkWxC*xA>zrTY9M~URC%b&REhz_ z2_cINh|@^jD@*VY;JPW`=ae|s##YF_YV(xaf3|?!FG$OcdUOi|9AMkdTJ*MWhgNng z)AR=cP*@hOOIScHTh=?MRr*+^eySrtd3oGyZ_P9TFb1bOCM$$_r-iB$3849WfOTCk z0I-A&R4|q@6KYNlQBB+L17_JZ#4l^B$|_3UNg(sCRjEPgHU*9q6Nu+S!YT}7e&eo< zDeoLoJ7DEX(r$ZcI`@Twx($SJCjsCu**SJVz2Vr6qTnXp)WQJ!ZD9YEUmKs3>GyET{DSy}f2xu$;)D{M_hzkUOS(aoPLBKQ`Q`Ux3d)$0ducV;cc9gm{h^oHq79ilV z(z1eEh$F`YhBY9}{vk|g|J@G`{;;`HG&{~)F_!Aabc8WhB@kWJ%n?C7*R|zXJN(=^ zf9v>xP0F=66#UV`0Pe1KTk-q=hP1f|k=9Nk!Ko!YGr}LK{PwQu?gh7$9qYXj*T1Pm zucxcHweQr0$P5N#5j3l^TDnaIf$L#)0tf@wJ6W_qP!4QYxoxr(QF$44HAF5oAEs0v zafc`|==NRk+K{To6Rydw`+#H22(>>6V&~ezhi`9kd#1}?SR4N5jvX6_VPr}Fth+Ax zOu+!|^AQIN+1CB19pRsLxM7c47ytmeFMs}62WxL(jMIfK&KyTob95XjNxgd4H9mP& z^RFgC>)E(T-@VH)>T^Bd7uC-=bsQw5yImEPm9t$Hh>Nl>l1m5y;`2$B$Bsq;1Q8|c z$EXxj&-nE|R+3&y{2KjVTJ4G%RfQ%^W#wr;F*G%t=xe3ZZ@;Xmr$E=dCx2IM1mDy& zcYK!t7_D^zxvChZ)~ZzG+_HYs&sX=eJ|{-AF~C`Gzpd^3a#tXRsV<87aDSTBH=Kwz z2gi3SC@{<8;dHKRD2<@%O(U;wHXv8u=U&gMh{s;nH1inY<+0;&N!UcwfC!(yL#4s$ z>ELd=4~eo=3XyBKx^{qPBDnD@Ai^629PDUJsX3+zNYlWos!}$941_s=Fb2)<7tA5? zKY|e)VK)dYQS!L)ip;tnBpXh<({Py}>6RrLAfn0fnU&z26T}Ul(9(G-PfRZC*J>6F z`01X)brDdPX-^D_h0>l70F9(qO4uQ?%8jQ2i7ydo+*wWH)>S*3u`yp=^Q+JIO=f_j zA6cGW1^9Fz=roQ=H$Ws^9EAv>eT>l!+;-M<^anp`Y!Rdma~5@{pxw?j{d5qyyOeH# z>dHq3+e6=uM34&`tItyZ^O|n2ykhcldN&YlJg3yO1u=Tw9=ECmCK#|FB;o!Pg4K3p zd(R)KK(!$ZN+FRy(iJM2AJ+B)3FZ=U0&#|DIygelr%d|##ow9ZNPS+#w|f9bluLJ#CDscw=SDgU8A79a@f}uIY@Es2bQY2DKzI>7O zE-F6DVqYJ^CZ(8VRD$Mv+h`n*tu6b=CaV2yBM7*aJ7ae-Qr*>&@)h9Ke}MnE8; zk@WU>7m5nlUYR^%m_U3cva4f&bpxEJkoHn)D$829^MyJjqRKH*_DDLIJivsC8Hhrg zvecjeU1NlW$H#HF@LYia<|U=DT9#M|r+~O$*dv7L)OuD&WN1+%%aNb5@&o_otsAxh zF*4N&DX~#f_gBFW)hb2E4V~K$o!&G2KyzpWO?l`0-`l7YK$QKnvbtYxY5HHVW&|aX zBz<%qJivtrs3}kV`552((~8z#kB^>>7Sk&E=9cSg~$! z5%i)$Wl}gKHH0{+gblBlN-j?xULr=|3ji=XmhQus?z(?aqkD$6pSpNR0+T$%!LLrL zB;mVZJp_naThjcv|Hg>}KW|RrZH}=T&HyV{k}k#0AE{%altZPzzQ98e8AGm_s zvlCo3M%Vzt1u7)GOFT(+Cz&OKiHrs-Rf#4&u97{3xNWG?)R}7cA?5Oyfpig75WpM7^8>s2ep1>bL-tC70=3@(Y!BEq;-)&A zHFU~fG9rfb0uYd2Te%M9OBMf9>$wb_4Qz}~DUw-As@OZ27$*pwUPy8UV@QTuYjk|? zl?f-N=lD@gJ>@mn&_Sq0l0ZR1oWZK9RtzB*@76`~v=>(|5CTFO!O>(sfQK*gAk!+c z%MdaQE(l$m6lzG}(DBQ_mlKU~;c}ER$Q3#gZtcYcylEtv&pnwD2IdnkSI$zc(rXIm zjC-~*1l1;YO6w{;{Gx-k6I0WDZ)1dxL>yXEN_Xi9{)SAlV8?`;w$w-9HRkzEy{Ewp zkn_ljJTQDC5mw~?Bk}JAE4j#ka)UR?=4eWZWsFfDcCP(C_qsYayz|TzN5(i^LlJ4s zEf@7D(D0lmOmOZTOt;TzOv&`_e|_;1jvCj|p+ z`hYtWoT``-xJu`)34+PMwd;jR2FJWp$iv+Uz=9t*(LuASK1$8WI;SzXo$LwoZY`s* zz+~*hiu{qy)83SGl=J9{G{f{C>BM4JQ^2QTf^&c&#Hn3KDf=|+H&!L$^po$)Htef! zIn4txOM@7o-+~pHdpX%aG$U0C!5ZC1`O01MU%s;%on7U?x~GGLk~#J#yT)CAN?qJ5 z+@H~C%B>d1_fVU+7DR&qDok)z_`$w!bL930m;Dx=A1JqHaje}2j7#;0GZjrrx(}7A zliVBeF99}IdijrkydZ%vXtBWMiwJT&;X)ByMZT5}t~Np$$}$jE9Yey^>Pm1AVwzN2 zq*f-@EmSMhCkpHXiwkgELfQ)|(4}-YWh1$67ZC@LHibftx(2lJ%y`iStO->}WLy^c zoW#||GjDHDJ*1=Vd?I^Gb@U@nNJ}xRyG$eO#ATonQas1^>}pVSfS>OyF4IE~O>TXAEGcPsan>hV;)G zS+@szty1k9-X=(TS6g%h{h6J<^za*OmQ&*M&!DdcTyyKfe=+cwycAYS!<8a0P*pL|`N z1q}9oaDy12W5LpS;13O}(R~C}%S5Y$c+$tF#|V2P1qIcM#MQWfayLU zG`<$2sy|fLvmR*cv9pe=aP(IgAtY!=2b9g5@J^%2UfkG!CCNFUG4*QupR$PYBW0jn+7&QZx92tD|l)J@dd7y)e01~yUbYw0Tz>z zqeuRU!f_KydOqf$;QH zANeAcG}BWA1H_UkkzVU4cOZEUCORNPlU^R7Dv2PP6e0;r+8h$|FI}F=HdHDKC96`X zq8J691W>Lbtih>;(}vX9qqpeK`_M+8{x+16e4ftyB- zY*MMqjs<`1%1!(t(al~id8vJOQ!OMNx$FE9jd`jzrPW#@K61yMw=Aj;O?lTehymK> zFIuko!&f6LbRAcf6t=CJWb!0%b^atc%QJ{ojT_Y_)yJZL+Ii>T=jt=r>=84rEhhe_ ze25kF>}5_|H*{#dTO#d0evfBg-pUxx5#ArETX>d?I<=G(XCjE_Huh6$hLp~3utWSE zA&eN-btKdurz%==aL7YX)C5w^zlqN$f>pv>!`ybU${i*k&w>G}Mf6uyg-|_XlT5_1 zp(7CurV=|O`BKIhv1uZ4pVV=Zj)xi*K}8^iQ&N;wac3gRt7upT!kAz>Dqn_rkAW0m zobps;kKQw5*xb6_N!EnvT`Lp%8V)42bB2EOcaf$8>pIR~J{Ot(VIrP~kZ|6Lv)9da zaN~y_U2#gKP9!~D5_hDm1C~ha?Gn;@e%t`4OoJGp!|W&LLNH~x>IE#7R*79tp2Lz$ zPUtvU$#Ni9VlZ2i$B^4ohjcXL_Uv;_Uh!ZaBs3U`5A$>XcOsKAmA&W_J^W6R( z5vy*2!rK$@Oa8Hi%Tl;CO)PKL#89~e2WzH@321LVwl;(8~LwiFA=;^~p@2G@8Z1hKfT2`M>+NR;+~n^*!I*>?45 zeL8f0{txHY84D1@r;W*9SjF{ggWMifK4H9f)Fz3)#M{s-ZRX#+Si!$q->3xpFvFDBfc;$DyXIY27n@SD~?=pE7^OJgX@z}ysV zsX2$J!{CQ%2i8|Q@M%#3HdNB2R;6@k52vG^uY$>l%N%0e1fAJ?D`yUA2k56UR;@?Q zJgowmZxG;{(|qjW-P1;IZ|wW`lSk;;{j!ZkZzG#C6F+kr(pUc{tsNPOA(@1&*J-YFZW0jn(tT|82$Wy?Tkc@+! zupLxY@sW@4g&CdOJ@?J<0Rl7dlRxRB^WUq+`cYwK4JytbQ!lmYK!bH({@jxk8#jxL zEE!Z1y0H>3wPTd7LBqICISlXOhl|=6kb(f27z>Tr3(_jB2&qy)Ih9EFWB zsUj&jzN~SmtX`yR2uV0}wcH;qB@8SY;|g{y`H*XY01}lSkR@sjDc7>tNI&QBrw)F& zrfU#VfI~o(UX&+H&C#HAFW?sCP+>FppePR0KP!V0Wt&UamTK4Q>eHUOg$Yn!kaOFD z9@%F1FDKt}z{gwz}<%Czl{IaJ^DVJ)Kp( zgrtw#Ljg*u=6X@22`RXk#^P1cBAc-^aClIoR+VmBtHNn1OX3#Y&^p+r(iC>Dc5PVZ^zO03P{1fu7rAL8Z$9(p-{EzyNeZxlE%mAmJb| z83?l_1X>db@bLt2Tf_y_-ij0Gi2v^ikMs${(P34bLW1gKOJ?ROVL|}2}p>Qd0rH^iiEPtFfcPHVMyV4@nuExCkoiYem@+g51)BewHbO0JBhs= zOnl*{86!70>Rs%2Q^$ELo&(c&MNMeQgWmk<761Ss07*naRByO0U}fqgBi%`(--FtC zi9bU1j>WcRY4NkZy?eyA`pm7t4A6DX(xYMyyu^vo$<=h+*#KZbpT8ybPPb3CtFwB# zrkagIC|wj}bY{`M(tbe5nH1qO9Ey4(1POxRJ4~H5gtGT?T4%ohMdZf4y{E5ivuXRT z_mQTX?M;5+mT9?P)@Nb+UvvIzuVs8!9Q&9MqpM6qltwC-_6S8z= zC3{f-;dP1G6pBmBAz|4N^!uPq>kQyBZ&z)D5DP*zU0r0M{O=R+gKMr!$BY}T6{mn8 zIsv1g0tG4pT|OUhN&Lz<7h(=E1{bu}A-8)F+8T-xJ+G8FVI07)drvV`#}i=c1Txc8 zA!KM0GvsMa;&-*f_~MO~=+O-^ft*%eq*_EHMimUeu?GI=zB@`EnK*s_{Yx92mu4}v z+yec=RyaO(PyV?4#=M6E-P3N)Q_F}yc&$6>WWdq$s3ql;=UuGjVN80vR4z2|Sk=}} z8NRdDjlQW~s#${>03s1BC)8!QqiItZ!=lu;5;!%199OY)C1$OILQ6zHP4k7WTtDd= zS>juiAgnAeZKWCJ@m9hb9OL9XiinO7s=~IjFNEzEg8_4GVFKm=rOsJ>I-L6Y&_C80 zJUh@P_gcQHQw-sE2r@cJ6lXHu*L9<~_?fHPntWuAfdXz6Mu>Hx@NeB)28;jx9$)*( zHz>h`*(u#$keTY^f4t}vxblp?;MZh;&}#_`|E_ZQ*sr6gObRk(sClQP!0ltdUsi<> z72hQ8U*u7ESSQBdoK_mYtA`&_bfV52Sp*LAJryzZ>_67A|6Bbju9j)bLN(){AqpoS z+ZArO_!QoweQTN7ri^P23C7X<^;NKNL$!;#5E+cFQ7IHV!!PrOL$v&{;`}kg_TR(o z@p->1bF`N=#x|!DdSY|*6cC8q-S2HYuF^DSqmhflNW(Pn`9oY8!?p%4(D(}n85TN22T+N8!kN&Zn@}WNDG)r zojGPvKJK#$w055@J-amwfFuJ@P3Ky5>C@GZjJv)z@pO(veEasLyk~3r(U}2q_3o*| z8dTvyl#gGxZcC^vio)CsXK36$GagU;p6kYm2}D|H0h6b-NyQ?sUK%k@ndSgo>?P4Du(w;gsSGM zWxx^B{G4e9q!R1HJ=2Gs>b>Kh6X&+uT5YYSn%N=b#7C61u6pXH(3eL}eYA7&j?#0u z?mwr}q9<^}3~^Ce4?%!CHkgQ)AV%Nwo5pGz&|1wx`&tD8mFojLs&j%l*IL9_g0Ln$ zXfCkQ&5lzJhh)%Cz#o(VaKU~m6On7wT7PU>+hZG&+t4%ys4tr}({&tGqyp_vmiR|9(Db+6wCMbXpY^_z?wp zb8$BddYN#7Q2gb&h~clRKZS>$cmoA|27hwut?0z=ZDp`%*{lDAKNmcY60Vz40s`H; z04j={tA@%V!RG!RCS05;rM47? zTS}vF{hbS;tRjXMKRlS9-M6!BzVVN*cfqZb7a-{d_kwn{Y8Q!n{iY6g-Et0Ge)3Vu z@?{)8F0tU&k1J$wj|pZJR=e&4s+*98tuG6w-+qi-QY3;yg~4G7(>I-1u`k=Dr2hWK zhlf0NLQ3x~BpXN98eida^XA0z|#h@FATxNuXGprmet4b$mqYwD%)~$l8v(N1D z#XD!8eL%2XhuI4=7}HlUVw@)>g#rO8I+sB&@oyxO?G^D$W6Lc!FL7B;G}Xk{Y?^T6 zOAR5nUljv*3+p>$MsW9bazY%Db2!FlI2;|%0D?N=g&6U*I;Za#8h-Ec?x(JQeCP?% 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 literal 0 HcmV?d00001 diff --git a/web/public/web-app-manifest-512x512.png b/web/public/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5629d862da529feb83c677ecf302ae957743d3 GIT binary patch literal 173833 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
      -Q%W|t!P4-|C^5-Og6C7KfF2Gl0 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

      b$fV(Zi~-0-*?f8^*(`{KBs{kmV^vtRed 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%0D9F_*ek^olp1NryK!y`aEd{sbrz%zYI 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

        ~ruUJ4p0P{pi0v7gk*rl$t=D5Y! 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

        #o+)#E-w0et?DkuI`~qo* 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 literal 423976 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%0ArQ7g3c;?M&cGyd3O?Y{# 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

        Ty5Z=!B`sna#Lm%5%rZ{KY0a{l;3qfw7J;AF~r< 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

        9M1q2h#+982Ai(wyP*QPCl`p~aDbwQ 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Ⓢa;Z;QIlpOL(A65n@1$g3wuyfzE@|OPA#%k=} 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 diff --git a/web/src/assets/forky_logo_small.png b/web/src/assets/forky_logo_small.png index daa7a6a3149a79fda959397c9c1bda0e8ee3029d..ecfd1bf8c7586e7b13229ccb05dd1665917cef39 100644 GIT binary patch literal 4453 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 literal 25904 zcmV(}K+wO5P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 Date: Mon, 5 May 2025 13:51:46 +1000 Subject: [PATCH 11/27] fix(web): forced throw --- web/src/App.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index a8cfc53..93ffa82 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -36,8 +36,6 @@ export default function App({ }; }, [data]); - throw new Error('test'); - const [initialTime, playing] = useMemo<[number | undefined, boolean]>(() => { // use the time from the url if it exists const time = new URLSearchParams(window.location.search).get('t'); From 9bc1a69d0a5b72e0029da7885fb87fb1d9c83b48 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Mon, 5 May 2025 14:21:39 +1000 Subject: [PATCH 12/27] feat(web): delay slot by 2 now --- web/src/App.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 93ffa82..cafde38 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -51,8 +51,8 @@ export default function App({ return [ formattedData.genesisTime + dataNow.slot * (formattedData.secondsPerSlot * 1000) - - // offset minus 1 slot? - formattedData.secondsPerSlot * 1000, + // offset minus 2 slots + formattedData.secondsPerSlot * 1000 * 2, true, ]; } From 5338b8b4aedf6c74ad7f2a958a28b3b4f091fc43 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Mon, 5 May 2025 14:24:58 +1000 Subject: [PATCH 13/27] Update README.md Signed-off-by: Andrew Davis <1709934+Savid@users.noreply.github.com> --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 17dcac0..acf50fd 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ Forky captures, stores and visualizes fork choice data from the Ethereum Beacon

        +

        + Hoodi +

        Holesky

        From c8023ee4f6c5bb4734caf55c38ab6450b148693f Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Mon, 5 May 2025 14:32:47 +1000 Subject: [PATCH 14/27] fix(web): theme --- web/src/components/ModeToggle.tsx | 2 +- web/src/styles/global.css | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/web/src/components/ModeToggle.tsx b/web/src/components/ModeToggle.tsx index e342929..d28330c 100644 --- a/web/src/components/ModeToggle.tsx +++ b/web/src/components/ModeToggle.tsx @@ -33,7 +33,7 @@ export function ModeToggle() { return (

        Mainnet

    w``-K9oA+toB2^TQo4Sw&5EBS! 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 => { // use the time from the url if it exists const time = new URLSearchParams(window.location.search).get('t'); diff --git a/web/src/assets/forky_logo.png b/web/src/assets/forky_logo.png index 95fd7c6f005cda968cd0fce3ddd79b34af122397..0c773649772804681c7f7bc7bfe32404e7c4ef98 100644 GIT binary patch literal 610985 zcmc$FWmjBLv*u|$xVyVsaED;Q-JKx8gFB4{4;Cc227*I^d+^{8BtS!OZ``Ga%zN*h z`2(|N_3ApO_xW)4uD$E2s;8=BG}II@P)Sh%0Kj;wD60hk2rst?01DE}C4_=4{N)1j z&{B{A{TX2o`S-|9T2&eV>J!l(EfHUSQ(G%)sRDpMBLILS0O0;*2)qXXUfck1U;zLk znE*iKmeZyw_VNJ9N?Ab`fc^Uvbe5&QjJ$GFH1q%fG`xRb5RjEa{4$8_`Bqg9c^?rG zo=Mb^#lP<5CBR!*X&v9CBZ%LR9UCvE`x76@?i+FKTx~jC!~wB#4KS%IZ3bZYc9#gBub>^5UvO@WPIT4@ALPWL019~lIQdtt z&)JFj*Dear+iSbu)&6V7M5@@nY6y@2UX&9N&HbOFWcRKBDC-^VBTL)If<$!D$mlWA0t7#jfVtaKsf!bn`=uW}`M|HME0 zy*+WY$$Dr@dwEA5$(e%WHYwaPa*J3Yu0Od{|Th z9o^=_W!9>XE%Nu~@v#ZPGyx()84tuJ^i$B4^WO0W{J+pqp=CzWmFdoK(B1NpyF$?A-rQec+t9+^c}5K zTeCxfk*Whf`4|Dl$Lf!72n*IK2{uzVGs&qgY_#LbGC0jVpZfd5Bm*3VE_3zsFPFr7 zAqN+n+e?xn;^CeD+lEwte+rNj+9ngEFo_Dkk!-r#zj0Y@vdQO|oh{|BIKG;`97Gzo zHy1aw?nLUG$siy$MKFE0iKL;6VIT)^CKb>lOGRy^=`riRlBn_^9UH&4^*K&C$*L~B z9}crJXm!793da;Vor#&QPc%FKY7WU%w>@dNKZkfhJc3W>gB?sB~=Gxk> zqW@)XG@!nhO%&MBGb$Rx?0{ynw^YVoayjKXe%Rbr z@xK39M)@#_C0V~e)he<(TU{Cd2_t~cT43p}6qNzRpe+RkefYH<-cp+YL5U zEsqhKUD@gmCuiwgrgrmewQFsDqajOO&dbxrK4P5~yETS=VKM7&DE`LA3dTB>2p3lD z^wVTb4q#pZ9)aeQ*zM(X4%6$-`VmB!-|V&Xp^MN{L>2Dam%Zl&C21+`ci#+hnJu%E zQweXbB8LR7S{nn-ZatmZIN0 zSWqa6HV$GkL;)~GbkNwAn#${yz^ka@bh2fBXO@n zY=eqND1K<6<72ojKto5PTTMNdI-QmKdJDef5YMeEklzo-rag3>#5PmjR6lZ-y&SVI zzzZxAH5N~F_Rk0Hp(BHRf_BsA94S{$J0Ap{OlJJ&!Wfjf`GrAsb-IrNno=!*0f7cH zHWD&O2vOJq8<1wE-V`MA3B?Cwuu)npkO1zVOQ?b}9H1Xy0w#N%$T5KFT^I<6`*_?_ zCg@t9o89yw&;gxG@_Y(ekKN4um%f_NvjXh6_9Xf{*H(~Sr>HA9ziici03+2NIV0p| zqJ7msGcJKcqjt?MB(NiWhK&ynvkr5eF*92>DTO`>m%adSE0%f#GOT=nQiwV|SgXtQ z(L879Q#L-;!QTWt*f5d%mO|fUbpdM zt%O`T->eGqwr&6%hHdeudVStfY~VtiF&3r>xNwAMY-&7|VT>QYQ1%=>fnkaZqDPAx zPB@^~>XB*}ws>)3$qWaMJ;0~=#q1YoQC?7h>abT{o`Om-K3s0n7<9gl9AM-BQK9ST z6!JjjIlQmmako%2#`O4jnVn(w)Ve&s;&q@#Wp&nz9Kcd6j~r{FrpasYEeX8@p0{Oa zPZ8cwmxgW(k*Vi^8Y5O3&ml6*2!tnpZ+&p(e_VWc!q!)o*Pu@ht6;(sv6!pu3jA3~ zHO`d$g35Tni&0+tpWNPKeYN#=?mkZsSm<;)tTC(>dQ`mjrz`J+Xrw8zP@{(_dS%p_ z0U|3jZ?IFeeN=cLX{+CY72yII0FR#em`sk523e0a>zQg zb#yev^;f7VjCFFQDtq-h@s~~u>19Df#biPGk!S%5U6(d%yNkoi-Ci56PUB3^k8VE+ z)?B?$7C$^BG_U+vO0OcX5qgvgFGjbEN*WS|FVaQ$imE^Z(m|EiA~4&AL&wiyj4fH& z=N`w(aLOGpV0-8G*8P)8yu%QlvD0$+O>{sDinh1b2Ses7~E+OfSCrBxAg98sP6bUeNuMZp_z+Kc=+p}+c=<+_^+%eY!LzhCXY zOjWPx{xD8a`4v<0X9njQa^D}rra41UJYxWzo^&ZhgS!t2iSW&JjA)TN(i z%yy6UO>fpk7uEusq;4!F;f8M~zXfKg6Q=HuRp0Q{DP4cZ0cJR+_s7HA7$ypT2O z3t1;k^gP4xTegO;QGZND4=?Gk1V{DQ`wkO@ujAuZ&kvL@5FSTwbGZT&vjrsmCdUt< zfg>9k)$?1wWiY*u;i_9m#@S?b73F&^S(9`}My$dnu@bAoq>`yCN+=_Z5~^E``Nh6l z;yP?IBgvltY%wC4Z(Kde-CXlczBe6ppPXOM4Z(h~afQr&aJ+aq{969?_5Z@7nbkv# zjNs$8Ll@ZepKK$`5oxaJuoz7Tp>hmTVzj-_ZGQs6#Zz)%IL&Qt;=hPzdSPFrVi>2S z-@+Lsn+k&s5mB@v>H(akRuDEK0f}@L8Gc4r`5-eZHpm~;9tKxY$p|+7ph!rEw1>f} z*6y|P23i0eV=4}3a{Qh$FEKgBW(^fL;RuCnq!Q6lAIfLup|2KIU=l~c zWp(BVsZ2mep8(yZ$RwEz{L0N=2WQvI^_A|R%J2v?B{D$1PoSn^yedBP|)Rk*QAEgAK}kTSV>& zmqy42v@4s@3Lt3|pjUu(A~T`#7YC-@AeBaC@}3pM-YOp9>1`Tv-WXoj-$f`6D>(a+ zgyR+y*)J}XjD*vC?y+yYx$|03B4F;RJ7DgH>HPEKdFNA>u^zstF?v!2JPTf~Fh%4Q3v6^vQ?0gXKn_e#8Y6?PS6`-$$XVR3W5~b; z{cP{-RZ#(o{peAxw0|?GSM@XKW;I}Ox%>PHMh2MqU)x<=Y5bRu*YbZh3VJSuZQ0#s z-Q-tI3BP$g-*3RWhrLZd=k@TWXgbF#Lo1pB z^vTLaO_4hb58+*bsMHrlksJuOAIW}FsC|?Px4{0B&BJ{5e3iJjmevd%i&;m5O@C!Lztz_@aWEfnuewzg9oMVD7TnwpDCo6N|{d1=!2a6-AH; zh%I=7#|2mRD3My0IGQx3%;;SWjnoWkZn$L}VqC`UgtTbDLUnV{)=f>T-`V~5XTeFP zjQ{o*dCl|B>-#Wz`@7uA8ma*|7YNo#m!qL!!=&5U7XGrgfvk2YJfXBVQ6O59a6IE{ z5xLA_v`(Ei2S>j`lo^C#1Sw4YBj?x2?+}^k-U_3Q6)s{kliI{*Qpl&8#CC?oW1I61 zB>6-UjDX-NG)XL^c-n}&jlJF@O_9)ndKB@dP*><8sTDa}M%k)z*;1eC8!YaEujT`w zrX6SX31n*RjHy63d-u&%_9x$?!UwGHrK5-ax6Fl28u2B`qnk2orNh(MC7PTXQnF{* zrm}+e8Eq~e@sPZ!PxOi*ADW{%J;R~iZ@Fm)AeT6m}Q}E9s>~}0A=$bwT_fX z5mcn&Ky`=b!?k8ozA6&@mbhISD{Ub)V2c?yDc3S->Ewxy$A;xUaP`CaT(jCvs>%zTyaK;u0+Ru*_rDsin?}1oY~C!a1mE6vAzN4MD-cs8 ztHmEDR)zrFao_w4w%mr>MqrU(u^lKV0*uYYP$+LHJWrzvffA#Zf`(WIiyis3tiBJ*B-9xeJ9 z3TUkBy&verkz-Av3gOpa3P21Gm0~OAExUXmp}?id~L6+ zVLU#9Y+HxS=^YGpk5gVRzJEn(v+}x@Oi)5;?C5dfj{GHE_)my&VU}#}draX&DcJVd zv%a-QjMO(@{XXaO7sHiaLcDQe>CbOvtJJv)Sohw{KRDUxrR6iasiS0L z2{dR{Y^3&oN+{|ar}u>>#Ik~CG8;Jv)m3g6&x4Q`o=!iRTRYbd&t6En98={m0*j47 zqvlT8c#MQxmC16r?*~aSNJ@%=-V|x`^K2l{VT9A3&aTi&4oo)&^cp2$a^e{W~R%Snmgx*zMo$QKm2dgCGlPtvg?R zo-B^DW&`4G&LYvuvW%jfXSvGFHm@bxs*Ou|*`vPd$T)7Yfc^DN@sVla!*2pcBOemG%Xoz&Hev4Rqw{SSU-BgGA{F-a7 z`c;)P4b7KHc>$-OzmAmTJNih848%ko)~v>i=5r64rcI~cGkj3A~~{OL3a z1o8Z;o1O!Sd8kum&sieKdPpyQuTQkqL~w}}K0*R6nme#{t>~oaeELdrS^Hz$Onoa}7 z?@GvCuUcxd3Wa(~u?jPl{%7%#jskf~Qph$3^SZn|7} zar%o;)Am3i(VO|el>doM{Pts_D7*Y-p`n8roX&xZGh4(>YC2p{djppFbPWbbJDMkv zDYubkX;oXHp1dz&+j1a7&}Wj&EsOMY6ss05?iGuLmEP zR45@#H%i*Jw6t32R7321Py1txe*- z4Qt%hn<&{_xmfV;U%ZCl23;Ny2h+nUn=BHbK7VPS6FVN{cWC)z5B$^tWk97G` zTr7l)=HCb?gdDw=yl~dbeIXku2tpcN<`y?fy-Ea;el*eu z@x8%8804=^mG|{r)30Qe_wHL@__aS6y^^3&{e$?GB9XN;l`1ek%<7XaQy#`U5P(Aq z$r)HrD`mU?I_2e)vB)}ASENTu3|ZAx6X}JUQgz`RQNg#e?fC2R1Fq*SL6rXMFQQw( zdyU_oeR0__X5$DkN9m*bU^@9@kj05l)mr!`copcn*pKw2}!Z) zoqd1kUKPMSL*;jTIi|*^oc?RtIRL*Rlwl%DMV5blcyp{aJc3LLC!tmUilVYSgMxurR;8n3z|+=tm!XBY=*hvkBgLRwgaWF7^qySZYamATwQj=> zcWYP{@~@Zukj(n$AD7n_CIhnDpSL<+lsKPvWw!kvB{q|Dad+w>zta;gB}%rQ2)K5> z4Co3v)bx>XJ7Muq)n*)GB&EWP#ev(@`yQ9WVg%2N^h7XiQIE)hR9Fv2WGuEoLg5RK z`&`7mY*-XV#zPG7rQ#JC#nPimHBH$c~_ZDGm?SrK@mY?!uZ51 zf9<$O=tFSF{Z?g7$noRN?F*$pzD5=D$y)Lb5uTuVyFvlO4r%X3-q0u%KYYREH#}-IBT0rd_u);@=+`nLPEv|oIB-Uu$6Gy+SYq`v*Dg%P42|NU9xZrdNOrvA8mSa_*W}esP(9BP$HsCOz(H%=D@P)m#Mw zJ>S@-Y5Nx7V44qxAR;2?fdKVA6N47=UktDd3Cl^1>6Q?`=~sGeY5dwvzJG< zL9q7>Wp`<`WS385^GhuuZ3K`|CAy=>U$tmP6gf(MJk^DR&3V%@P}9ik5S`rYj2`(sXao-%dm)yd$M=s!aUR`@eTTi`5a zQv(ny1J&7LSgibnwx;uGGKfe^NV6FdcyC-_*2%BZ;092&oHnVI>k+lEHw@dbT^Fi5 zj?~nSaF68Gl{~)`|6&+eL@gs~P39ztw+>QuU3+g+(oGD^!_G(y5l_XMt|y;QiO!Ao zCM5k5KZ)=D>3z)lzPec}2HUtj+3c{(hc()DDsV~e(u&^aOrDo}aNfs^6j@K)IT=2k zp{dA?^H6n1!!DoJmMI_3(0mv2JM@PFk6uqc--g^j+!>wtSxq~dWshW<%L5_;$!iNC z(s$$PFQl;y?s{s*hjFT$iq!7lzL2M#M3={C^%`Q%yqqGej~H#Bl)P5x&HP-gQCGtrARNLavElc5B zqcHt<;sJRUnOa2!uo{Y1VD5)XN5a%4IXKQ(C_@*krrXTE%f)+CROm-&@Y*y+V3{z@ zAt5m-m^8VN%%Qn)%D%Kt*O^QpVG^44?YlA6N%uPc5Uh+%?LGmP$pjT<G`4;#azn-f3+jV+X6U0Z&YEl{? zn#gR%nTf~hE=j<#(f?%sil%~G(^@M>kA|x=x$9)HuHKaIXR>(^ z}(Q!7>}C#&0}Y7;W*)+2;aj)1w&s56f#EEQtA#AhJPW$@+P^IB)v#ZZhO8N zT_BeoQ0T9Eu$(G;4us{ z9GGDpJ~yFxkueeT=S3NkIhxPWT4S1;S&S~v#b*rR^_?qh5+CXz&%Hjvz+=f@*n(uh z+;GZBWUBSkDsL8rR#acH@y!#eu*l~V!VVTa#%S9Y`RVq4TrY-%E70Ei;m1AQwoBd0 zCNyyp9ci}R2bu)}^HWJ^1Ani+$P}YLYyYRV5+N$#c92IDIV{p!$AKA5if1-@vnK(^kO4`0!xp!F?& zEE+FUm5|0?o+1i&hhPx3YAk6)IW6{kcMsAW{xI%L3*P9O1d{I#|J@6)ctx0v%&`O* zaQI`;pAbG0ys}Cz$wXKrmDc|euP?|4vFLL-F6=@2M5?`RQ^Z^}SXRht>6!TF^0mbhTJeDau*V818w3r3M``kYrJi~oMvx$Tl zfKri_jr2U;FUFq7qYycRcX{}8R69HG(BzI|0eJMeNXA%Il^^N05f4+naGIY-XwU8V z%crPyTE$51qQ4fx_lQ%8^j+*jpLW7S0HNpa`tI8sa+{rICj{ZG*9*<#M`G{2UECHE z1)qJbhCbzPzV0LOPg8nN4f3GG(-zCp@VC{)b^K8PR-Gkg`;BkavF1pmsye2krt0i} zn6~z0SxfTJZsxpT{@i39B9t%l-=zfKfwjQA=5AQ-eP?Bjx$nc%;Uw{*y=j+4{kL2; z?EYvQ&G;Hr`1eS?9JU)Y{%dkQswJYtc<=+6$iPp8Fw;jYYr&|*0)(WUh%evUMv6;B zo)HULN)X%JA4sPuv8~}L3StNdsv?NKCFwL%OGpHJqE3POZG|SxJ4xU14kIc=j*7XX zL+LpjhBiG2gg)|?eHp+FYq{e8OpHdAy3yu^Tn<<(f#mR(mi$S`LhsQ&Ixaw94@^Ou zJBfkYVMUJF3Y-QTz8!y$m-Sei&KtXIx^g^n2%&CT`G#-sMTs777{;C9T&Ta z?DO=@6nWF_h>@zudPPUCVnuaC8*J__B+Vq z>6A7#2+ot~K>x)D7s55L&DnE#Z?2n)?gvyXi0j%nnVi-j+l73I)8BZNP0q`!*}1vl z8F@P&J#^WbpH`hn3{@Oar!GOhudRa0RzMl8SSDtqAVSG7VZlqiD&ilyqRXJXz`zS3 zK?%PpgZe&sd3iP6eT+n5*iYxmYty@gfla*KlbpP+?aHza7Q7ed^PgJYpW~B|GN8b9 z964{P17mYELtBE`Ibq^}xsH*Xb_|>B5ugJJ88c;}w1P<~11^i?xmZ(&Vv=|&$Gz8Sb1AKBl^wpmTbYu3M z(U>}3@F)W{V6iaq;c_Suc7EqW8+u(i$PITjh@yd+o;z_KnE)Q~w_d@wqiplV_2uG3W{HWNe8tg`wegGK9Xv~Su(hzyZuB-yi|7@ z_$*}MJ`mFE^62G+>4R9K^$rA$NF}#5aNR0oS-%?=`SaY|wn=R* z=&F6~_YR)Qe`pmm*-v-~aO3%nku(Ow_xv;z%}PmZb7_Ov@y zGZZJck2twCE;@-AhqzrzXap`QoTm~4*Q&Km)IrCCZV(AfX}Wx-xrn$M8{^E~Ysn0C z)0DUK!nL)yT0EWS02L@R;y769X&gRs^;zzp>S+7TqE@t_)WO7 z0y*xjV~S0C=Lj+&4pe%CeqMO6Z8Abk12FfCm-lP$)IndOtKXAoO-JF)HeN_jCevBj z>$tqT7)0$GgR5qA z+@e|2(@+F-n;lz-e==$hD*LbWz4=(?f@ThkDRMd*0RBF5l`Uv#4<%@wzB1xV>z}p{ z{`x_C(@a^@X0YD_sdy)176a!|Yk_yo&%Z*uJ9j<{PW&SapJYN#CS0YJSi~i(?<_81 ziHUq=Pq))U@-;>vfx<^K99Hthu2E6sE5p8Te*GPnxP2KLf)ON1!yx| zFNGy=8Vi+&0AOe+_O85399`_Y)B8B zc2%5|&Ug!-VC6R3P0&F*Qzz#F>=^Nr#7Rm>!}dY$+GB5TS>W+~?OKEFc;5oV{~?MJ z(qyfJM<>zcNkYhB?4XT@N6vv*-uTU#qdF&x=HSCEV z)H4wZvv;uSpg3AJ)wDjcmfg)dVdeSlTLnqhkUa+~K&$-?k|;mxOFs*ir19I1h zd-oh-$bx4N3vMFK)S$ z+&(bA7T%_MKKtHW-5T(uyVkuPfziHua9aWYkquL<&a}niTS7WqTc0kXFhqk4+ja*! z$sSffAWM7_5Nyjmm?5P@?(A)pr#rqwu;2Z01ue;`lJJ0_LCp)j?j*!*omb*S& zR18suoJ*;w6fGPIFA*~Swrk3nOg!)?0`#m6^L*N&R`OlI)Nc*^eafH;O+jaF;tKt6 z;lM6NO4E{g(>WzxLY)iZY)UQ{)p!w?2`-{{ziG?kpnPl5CspxjLCHU&Ib3jZye?4l z{G=gmJ~vI8Hq_t>Bu5GtzLP9U{GgU;q=Gvu2s1x;Si~IR6X&m^XFc3@zF4$+U2Oi3 zRJ1aq&$m_qm-PxmY7a|T!3^pf>fXB#tMz3a_xs1oRLgdE=gww!+3QCp1Z1sk^vP`^ z&oio3<;aZS<{5x1{>hsht2wj4h zyYE?gb?ZJXhpj5UkFs|V-7V*Q4Znh_C|K@ks*0#N2sbQ6#Y?CGP!kZqQhXG$Ppu%R z=q+-Z>0Utw^l=77JE#$3bo;DPZ=BHS$4#Jf!sO^mYyLKYP9>bHKIZ1We`&5_j+c+9 zLT>x8Tvr>mN7h<5?o-cSmHnr39q^6PYyPXV=&!}!C3wvIGFdg0W&o?zcPbiWoi>)2 z?wvi`Z)_iRHS3M4`w6>RqD!S3qoo}Ye=w&qffPVvINBg`sBOKdR6zx+bfSKLN_)O!TCEOm=4Gw(RH@wa0)3O{ zO|07R`&i`=6s@ZYT5y4=u;f#csfI%|C2F$g4eEQR-c0XF%+vmP4wzlu&-|ms?mOPZ zCr@-x2lR*FZvy2E(?5#D6B9!1ZLm8fO#K^-41~e0V4W!1w{*hmF7zAjY2|9sR*~65 zY47>vg+q=%sj?Svx3rhX7TwK<)=a%Q@W!07j*cXEkuT=SLXmaYRWtYN`SmBa@4h&& zf-CT(^;%&_vhDq5&1je3T>k3K@Zj@IUm|gh$kE>=DiWLOH>hF!u`x+bKOXf#rD7@BLcQS^y3DV&A))to^4Ct@a5E#*VfZ`V4`a+ovkHIv?1v8xjFIz+x} z?*B}?=M z{Hmd##>}6slqL*dTG?#NbMs3e4_z61tEqW1ql+`f6vv$C7y@>i+S4?$I5Yg4HA(7) zNc%wzkcM*l;FP+#+;}#ws~CFy1qlW}IS=guJw$bQwYO#-Gr9|=?#Bsh?Uu)H65~JB ziukr1l+QKR@g0xVWwuZM(m?X7B#oN1Qj0WHN&h^QNF+EQf%m3_A0wGJOc%U!re35T z%dOpf-w%?3%H#VjpnL_E0 zl;mpG*0jTtH!1!9c3qX32hEyqrK;pxO0i zjafAI-TUoM@48NIaf>|i&yeYeG%*;5$-$__oswoZ0u>1D0*J`fxEBL(n3|U^H|7gd zR1a$ijThE`U(wX8wh;p1ZwMhMh>%MuW?Tl&=tefpx=e%~dnV#9ISvBit$x!ezu3JOov=U$^jCs@V zJ(H~b`B~;hmYVLhUbERk!A;H@Nc{R8K1?OZhNw!TUm7CO5On*KM ze81*~pAG*J9wn){+F(KoqncMuMhbTNkh?pZNug zrIu%iX7F(oqDzCKdgann+_NOYDiu{Ff=-}H5Ey(Rn-E3rg@~EjSLMhMy?>}igkkZH zwCy62kX0% z+5&)1aXK@j?oXwvoUOoGv1d#moUdjg*2uNC#v3mxRSuBg86i6f*o#(Zb}@rNT_OJ50QtQ>5x2VHe_-_z z?nlr=I+oI>;E*aAXD7wiQViY)I0W+;8-mehW}R!*UpW$X|ZHUI-Ju`d&Jun+n=&dk(o? z6*pS`&WY7ga~QnZ+5MF3E+LKE*BM*D(L*)2N-@hwH_7}!qPMxXZkbqyD=mL+IsTrfdwTOvNKGx8*G$(VnYC< zar!=@aRsg*3Z4CZl6TZ&se*4}4gZ@G4*toAiOUg7?Bs8RG`*M5JaEf=>_!hv&5f~y zhc;lce|sg57B@gIt!SVrr&p)yED;P#{_)LK{IHGd>CW7@H=`@$?vgUdcc;?qB44G! zd4ojqE(8tey2j|{54y-+y}DluylH>FgA7q_45<6NuPv?S%^!B^aZm0%4!@pO@Ox zKhB3CqNOACyhy^p!u7wQPf<`w?~ZD{2VA*AYivyszK`?lX!`(nWm0vkfS}x+Me=;; zw8Zf*7rxh|m)Z@ex4+kg5~wSaxH<(`N=UK2ZcF6hEXm%~MaT<=k{-SJp%q?>5hu!^ zP5feD>lxd6QKo~=493I`CeBEPWtFlz`+{PyC}Z#O`Hhl=oMu@}jn?N31(_#YgqByf zDa_eBC`p-$jVzfcz39zB57&2#^_$}X7jvT(Vy~ZX+gS-uy|@A=oXyXFS3bY`MCI77 z0BvqUSXh+U+hazJ6|C7S{|bgDdu@6bf`VYLqXZ5R=_%2VieeNH0B^UaqarK5YN<@s zC3MXNrrX~(Ob)5FP_@6LFXL%gRZLIS+o=Jb8-phgO+ZhhIgQeJ5QdhB4`sK4VAEw%^cDHOpL<#ZN^yEh`x zQ@?|^D7hv{VtaIbU977E3XC3+Vl-t1|H4NHA$w&weYJ;!NGVx-@Xj?WfpYIH(qqJX z@bGP*5g=a`wP@5ZjU2<2-wTFRPh%9bUJE8(k7w$SMcuda8Dg$J zcRwh%6G~5l2i_|^D2E(FDtDh(4kho}1s~Tvgqd)*CT%9YqIDVvOIvAO7l_EDxR}0vbFhwtCQV_O1SO06D#P{yz6|t z`yqGqz_8AucLp$ckzoqLd3UL`HN5;63sC5By((T03E7-S>wz{0!YBby$AkDTLK9V2 z^RTGfh3|>_HQycijy4?n6*mojXlTU*ktHwB3dl)oB`U_NvL>v6bb`pW`*U3t)u2Eh z?*K3Myfy0Ll!0{L9uKZDf2$mAZ>I_>{urc>Ic}~~QIz7B4ZRH+fQwNW$yZJQpF^7Q zi2}@urm@lzuq^eoj54kDy3vZ7d24=xaHsJhM!Vg-zG?zSzVQ6}5GLDKUuN=rTida5 z;7IAa*JS+lZgKi+^>G(ZY(!5{2?8Bu!v@h2A71o&#rCg*-qT?}@(O|;x6$Ya4+CCe zIL$LXTg;$XytffwuVO@9SN%6qIp@+A#P04Ff}Xxhv;>Bk3;Av@yZkl1f%we^Jl`h1 zr1~uCruiWwn_s)2{VQ)!SsS{OV-fg)|z+wh4Po)_KP8Y zI8AxedsYkTJ&0{8LRM$<1!t?yjhGwyiT_&2?YEQLgqz^)2KWEV_%!3mx_8q+VD0w9 z+8hNxDi6kC&IpP?DBn2*-ow~vS3wJirM>a9Bml|G3<=a@(0rvPtto6_qU z>A_M(>t_U1uM$I!@m1N^b85h(2IebWjA8=C}QjpH2G6ZSbb= z*aIcVgpg+2{lMX_&?w}qKu(ZhnU_j2ov_N2e^~Uuw7zpLC4;a`Nn{Ctp^LMGA|$8C z#z!lwA{GHi3y#oo{>Id44KMqyWZ;k)q1l?HN5=PiN}NESb&uA+cRXLA<&Np2dgNES3 zk{i}haUBDH+-ucN)92vuVAX;~>^Wn_cLnh^GMVq=6?KE;vciRH*S#X$Hrb<#;3AZ` z+}S%n%vXwaE4h)OgHefy2P4i3)?A|-u9iF5>r!L|EE=$0cgKp8hl>}?GLRI!!7U|0 z)=9Vc!Mj9ZgnAQvsPwQW!bM%o3`Ri~8@$xdtrEH}FadcI-QLZFQBI zKmA~<>3&{9RuA5BfkH06q|^M49(~j4JFgztLVfM2y<8`9Y|^&H&I=L~$LyTA9&3!Lloe||IB@r)DnL==35 zMm4<~@{q_3Eg`U9u(SN! zvuAZ!{&Vwd%9`5yD46JE;6q~0-E~};O8bBJ0#Mx(VI5wXUvxk3^|iqoVUJ9czA#7F zcDL~6vHAIC_iY&w)eOkOMmiRwJ(ZHt>l3>4>abSjjw)@OJ?%@opubQd4Su+W(;&UO z13pj72}q2=w1ik-iqz|>Ziv!aAUVx>TwrWL?c!+Q*9xg*J}Ez%3v)4Byg93}iw53+ zNIP6Y;ctxSD-|{+C)%&m#sx_cHh<@$-{$j6VrxjU*ZYzRvc_0K*DPe3P+q+&&hCkK z<3?JKSa;W0(CO)VJDa!5aV)tA75{M16ZwE;iU8<8RSM>uU9>})%r5F;N4bLMxWuZi z{2-OV`|&s3(4mlh^?)a=!@HN2ncd{Cz=-mFAi4TtXE7O1k&d;#8J~h<%Orxz>Y5z| z!E9O8%yb^{lz*t_8-u6eJ&C`Unynr=ruNIq4z7$DO54|1R|(%teCo<-aW#JG7tgOt zTr0IR^Vo*I{LwL@{ zz&dZ@f&rUPS~Co-_i-sw=$|xEJ||1vrIpk#A#ClZ^1ia2ji+D#s-&>aNGtWfsCvtW zxWXn|wCQf#EjTn1Jh&6w-92b zY=jL0ntB=pqj2soMoI&kI=E6v*jzmzpAk$VP0sfVjs=Ys^ZR}syCuf41UrkBL=gYH z_T*9;t*{h*Q3nDd8U+E<)dNOw`T-<`{S+!(z?$JBL7BnyL5yZAx}f*{Bgj0JosHup z-5^UdgMP8*q;&+sAsiC|)TMwf7=+KPx0c4K@EgmTP6ly# zlTS7AE;iBKw`())cm3a(U*=bQ_gzT82!=5;zHmE0i@v?>`a$<<^vHOUI2(cXdqY@~C1 zY=tQ~i*#_DPXR}n9uPMB-8Bu~nm~u=lHQ0+Ff1?w&RL%#4at{$OCeg47l^-w%jvlO z8S)X#Gj)qpo#fDjG$5^acJjV+%HRmPBv(A2 zdS0cDaUmI>@W&Tl8B5C!6#&*vTt&mohvVuJV_-`vd-p5w^9zn)wvs z|9bvV+aOQU8PL}^Yu(lz)7RhINcEp`T>+IYWyB)rN=veY)$ARW>~(61I8{~nuxD!V zB9FUe{fN$Bpo6S_DS-d@#KmwsWj^SXfzdg{5r9k6zOV(`QXJ>{KwNum)rT(8`2udU^e7aH}y7T;LQYOp3$ z^FkYN)v!SNd&&wy91|y35N>tUxA+eeYw*1I;qFwkk{Tf=sbGo zE5D)Zkm^f-@h?j5o$G@5okuH!mr$Df+ijMks}k!<69%~%DvT!bJ99KMF-5av;c;VslY5s2|Px!PipMqI_mr0=?TcXyfI|9mz> z)&(u;xoT*6dou(CmZG^2z0>eFUlU!XcRYgp;dA@tyCOZ@FW`2YXf12JlZ+C8zAUMa z#2*@d<)$_I2OnWxS~sLQPknk3f{J6dgrc_324Cc)Y_kV=ERCrUEi7M1U5=&S;GSt`g(*XD5T(=)l;4!au$gx@8m^E& zFT|cT!_(R}WD5Gke*9bv`rb{0u1X)*Jqc0dtqg}XfejwePFv#n{?`39W zxZT^s>-pQ}0sL2T@$c^8OZVYhis9>>N2i(ALZiv=Ci1Ro>@vHkzlxNd21?b1v=*zG z9s|`&vb2$>j?X%Z$bHo9Yf=yf1nSy|>Y6@lv9y{LSGI(?Tv6jmL3P zX@lrYH-)ml2eRSG+n7HMw}%#);krdw%2)b}jlpfQhyp?RcAcuLcjmH5V5A6uwqQG?3bfm=S?u0ZXt12vnT;+ z_xz`UgKmGK51GXboM58x*WbL#{wGYOzL?_a`q!Ej#8qOfHJ%aDSC; zz~;B3Q;Gb^t!3NCC>jPUB_f=m)L)!oEi#aLDIe|VYg?v#2Ps;!#%5Q2L*r)b_k~1RM?*CD#l3 z|HAPy>cOr8yMtm4W~A{$Vr7JyXxO(-y2HHUN8$t`C7WLliHC9HJ6tdNZ>GEcRv|O} zTT?p{dYB0KI}y*Q^$)of@u~UY%OgK`=d;;ar;DE@6lUlr5o~tx(JHX?_#`M)-bxnh zp6!K77(Y&1_9@pjyqZl+_AyTuU7R5fj? z=~6KPL?zNmnmhmQ+gf#Gztp7txQ@V-TWWHPEXk)49WqgN?Pv4&L@mb2O9Bsp681c<%;&_AWDQ@+5;*w!~CpxG;(Pfyz`J@){658+7A zq<$9T>ml&`0pCS%9O}agi&2b>g|jA4xxhESK^>W|I1D~&^Jr*VHIf)u=@Ac9_85P2 z9N+DtrUM4VAV^wxX3e5g#ZhvIj{SY$PG!}OodUXR1{%X7(3{BGZ|>d^+c_CrFjn5& zeA5$jTJiYK*X;qYE5$zcGpM!TYIGe^(FKtZ_grkd-?v4Ow%^Ww6LQ*Um45ZFguZj7Rl7R%_|m4?-gmJlt%XAyKe!bLlmL6zumlb~{&VhKbNRkv_#{D#rk_pM=WB;|@1=c?+5fS&=Mc9R`gCI0QPudr4NOK)u+x@O zPwvHYO}fSSWSK}#xO^+HT143vkq_0J@c2iP|PIE#MotJk>NiSfn2M-Tmx&c^56dfhIJ3Z1>F^-r2{?pN<``zUd!ICsUG@<^S?gIWg=@ zHY3l=g3d8Y?A4T0WH*Y!A>~B2v6^fDIzmCTpzcA*S&D30|JOR%j}-2$+=~mEb$QXz z8tOhDh$<-5yw8RZ`K&N2{s1d@_5OfK!uyM@TuF117|7MmMwhUZi~iPdB8XI70D-5U zAXym(7dRnd5Db}yW87ZVH0qk=>JG1Eox|ye9VdPv_nQ&_`=Ore8t(4D9}T-(s#@O* z+>0?Q%$NU@7PlYtnVG$W)|-WkXH3>JOc(M+_0&c+Pd$gtDz#$NAZ16^kRtxTNPTzA zUzPEY0@c!pD!}o_vRHh{SX){(fA$KHeadYjytb3qd7xfduT$7HY~m0`T~S-QCD|4U zVv=;~pY)6vSXgJJUF}O8MddM@A5M{G9?`y#ej^e;Zeut`R=bvymyOkg1{r|4c@c!x zfF(N`{**)4cs6_?m^|dSu=Id)dE}7Qc$O~$pyo}hr@`05pY(Fd!FT26{OyQ_+4>n> zT+PKCURLaSFp?73(lHj6CWh+qo)1`8GZX?CjxwUJcKFOu z;X-Iv=I~&`0PM5v+CA)&PuiF=l<*<>^9VpSw$afess)@{o=oG?NI1e!gvn$h3cm`Z zf|l^I?LdtJxTHT^QKevev*qpWZ6<*4u0z-01ijzC*2DV^=w0Gi@7}=YrjC~D&C+f> zQ!YNj=X&^UzmVUaoQFuCS990V0}kSpjCOv<^<9as#3L^ z-FPAt9w#pkW4XJ*p2X%vkEhlZb}?)g-a9lZu6}aUinwY1Eyvo(ro%@58I9!o)0)M8y#3ohkM0Al9XBH#xBs2J zX_#~|(|7xn?+{qBoQq&gA8^p-Q0X3(geMJRi>#T>Ia`FML!x~RDIHeTmHpLl zRJ}AsX8xp7$$nYXj`>_sJQECZpHN^86-F|FxEP5Y(Lw3aMm~9Du?Q?8{$^12ei@%; z8t9?;6>?*4K-OoLCqVm@d4lj=+K9l)N|P8I!%hrLMVods15%s<4_1X4?j78akMm+| zgB(*HsFz~vE()B&UMv4@o4NV>U&cCkkG%O@_+QGbN;o{1npr=??kYDtC9XJ*)l1kx4r|05w8<0k7q<> z75aM=&_MpTrEdNe*x~s?c^8u1*lk^=d0L*JoL|YSJX}&$B4Yhb^xcW3Q^4VLdphcNv3ScWzPWD`r!n)R(Tp4>;qNaHvkE`jm7<=Z>PR z{y*|Nv8>HMB%VfNBq{26gUXJo6ti?z!YF1LG&|~7qS}*bHCU)AP_g)e5sxa*;+fuY zL&#b4-D}I18=lvFm}(xm>YR9ZHKmhHu8#+Q^TMPB;lwCJPk^H>jsm zDj{u~;YR(hIxK3wJe*8;?tsCU8foD#&}90g%>@ zwFg!vegeF&;&n86wMD6K{{rw~UrbdlEqBYSJuf!!2?_l>m?C=(dVHhInC2h#a!5lE zBc;NWt}IbQ-xSL6JNM6Z8-o?<{8B%{)qR&k_Stv9=j}4}reI)|*D*oG#X>%uO=d)9 zLw%JnjYPj`K^-1Ylz{$?J`@w1#XXV&3m_v5_Rx*uw|NnZlnK6l$H~ZejDP9jP}Jf>Z0fH{H!aPraM3<=s)w<{%k== z>G;oDpA2n80rHq|QZ@>)MF2@LZm6BOmN9W;G8&b!5@^a~WMhaFA&Ed3-6zmW{$!t3 zw$f9C2x8vw<)4ZZIE3LFSaO$k4gV;1pa~VEeBqS(29S0GDj1K4_PX~{m4ibx6(Ru` z#_J+U;Tc1XsKpe3K@uYf&P_pd*fn!ir09S|H3{)rIWdyWCHhAM%b_}9SujAs)Ru3n z<6UANU=uy6mzMf?c{RS{IkQCe)EhB9(B~38f7%wg#tFn79h4Ee2QanYUZHngJ+AE3 zy@v{Q%~RA0A^@!~U_UwUkpnF^AoJS}J9c0K8eXzYq1?bA(#PM**ZEv|6;CS9NZcvK zUZ_PyZQ)1cb|6Y%{-nrz_BRexqz?W#Snye^sA1VGGX%~O(VGl2=m?h;OPFc@_181} zAc}{m09DK}JE3XqRi_0cFcA)SAErNiSA9IpweUqphWkgbQ9;I$IYF~H37U~+`A&lP zIWDTO)HxjA90dp8#UIAaHBQTYe(1F1Y=!rWQtCMKDupZd z_2Al&M}ry_qi=iTEzE15*Yp4g)f^AFZmCF1zbwfXTZ!s%J2L9CxkPCf117kLZcuKc z!T5##i*ubw$JBAGg5!b8fUMxSR#x5YEvhwP#IB_=J{2R^7#%za2l<_w21!gi39TDQ zq_K6|T*3i4O@|JELop7duQIZ9!Q=z0p`XXHd;9_X%>d=M)gx}L3f3ied3AXLd`T~N z{T|+C$KaKWpOZ%5{m^YcS%zX^2-w;DCgzVS39sz=mnqcq9xhB-8F)R9Tb)M4Yn&-Q`Mf;#QjK0=XTv-ZvGYOv1*B|dX#19og;vd^Y3x>*?CrSG%P++hw zA#`q3rzBk{AOf!M)Ml7P?0RsZTtdcR1r%W=FgF;dinReJasn=2KufVr7 zB;Hwh>}h#+ce5`V;`a%;Y26TxG3BrRxYV-W4n04U&Fb6hFo2e@t)|y3g=6Y4!wPUiGh+)hjgD0xftjCBN3q7$@O^ zm6cZYwrZxf;Jkv}Or=88X0bpOGzjLye$$=PdpWNiwXa#sy!BO+5fKjlCmra%2LmnL z9Cn6J)~TmcK|`*YbQ?%D)Klo&5kIGSC(i~V-maXNNIN{C0T0)w8*5L|dJgTscl&Ob zGl@!hohbN%_r%SN@e-H(QSuvAdE6r8SvUapFzjzifQMgHX6|4Mj`wj#SV$6CYoxfS z1>LdC5^7=?6?Lg_4he3E?z34u=;5{|iHT1BGmfhA@s?5RcNUa+9TnQ&25i?b5z)f9 z`&f;rT@0von4#i7(wtif0CfvVgW}`dfk*03N60jL#4Ht)z;Kd6#+egNcQoQvWX^!6 z=?;UYs^R~L8E}15)9Z$-t`T|l=X^emL2}`3wcf+S zqKTY2GYFTYkKtd3H8dW#tMvYI36*>;UMex7^3vEaCXjxVp z@2`294(!G4$(&byxhtqwuX~=M^TU~ktwID-@aK4UY!L}X3md)L&)8C= z*J^ohjq$H9H#KbmZPxL2RUYxsfuar{9@opwlB&{W&2eH1Wy00il7(d|Fn!ri+s|v` zbi#pO7W@$ib3OC>c}=EX+gRauzqohV zqs=r5>$k+!GV^i50J1vx)-Q~vW=+aR8nfwr!o1audm%~1_1RdG^ukJ^v*te##ZO5X zW3>e6VOqQChXr>qKJ3d$iw`vNm7~?vxv+TnUfGjmCR>_sg~sj%>05$m#d!!3iMzp;5A0TWsAqGn$>L5%I6Bleau zJXi-idHaLW*yXFj{c^t+E&)jQY4!TRga$waYW0S`ItcALH%x)*OBUk1B?@9D3BY^m z1U4VUHaEQ14x5D)>5BPbJVaQ2^eMWMTlH#nYG8{f(p;1^1I2-{NCS&Px7hUjbDNx_ z=0?x!Uo#Cs-%Y=Z#2%MlK}D8_BnBNF7Ql8ONWg@T<#6??rfMTO?>;o3{=e$J!F8Gt zkLwMM;Ny$`rQ@Fug>*lG(YD#60;u!Tk)Z0o{Mu?zgTgZWxISJwI+>`aY!zU^r7N#I zAQnMC!U%JB_m*MF!U*;(wJf?k&W6*la(^uPlAWK$R~i6NJj-O^t_jdcpv;I}z=6{{ z3bk$Yrbth!SVdWCQ-Al3ph8Em#MRLD0+`_-j2Yq3+Rq`^umW=Ov)=sY0U{bGUnB@HuY;~jy=2xG zt6~XH{nH6jwkw#!H7Xg%$3kPoED-P;D#BSScVwz)j=hHOUY43N zp)Q2*?P9Gh>&=Iouw*pQstsgC#a0+~Vzi8FA@E~dA6)HkuJ?qwpyl2Dd{-@PI!-Bd z20^c&0dpH~yGeRNw|ggbF3XeE@-Q^In&Sv0aAP%hTONm<3`}}Lu53bGUxr4wG&i1e zZ+g2PYMLL&&h0oqW{%~C#=*o#@nICw&>?j)+;_Wk1%`6*dD9K)0c}&Za|s&@*ZU*` zWfAWpauJq@homJGmiEbq!$nGcRae(E_)#jH_>iD%nB)Vbt|m2?YHUX$I`C|orQE!9 z()}^7$yBP{A4_jgNW_h!=X+63k_|fF1XcBhCu*pLk-c{tRLYA}uShE=$^+d$R!@f? z<}Td}4)^&zY~6qWmwOjpW`>%7{%&k0+})b6E4m|Wn*u)%ew=77@pmm{cUto^N6;gEruWd zd+=NB^`{(r2b!7ffX&?5YJ6`_O9wKGl_bAG`Tm(rU_Vo-=eJhR?>3#9UtftjM&e$( zzK$pv+dvfw%RNH_@>ye4v*i)f#Z9p7bVszJ*Eo3L56dcHor9h4s0cvi!2zx)EF5pA zCSkcOC_1Px(bNTgzC=2A4Da8|l5wVXA1n1(L0DEFU?h`Zpj!Jsd`Yqa_pf5ZpU@fA zZ*dW31ti}My(E$6qzBzl+&3etjlO3stmIdQe^EqTE?bM*L#^x;*4_2~#)-=yTLV!? z3XTES)N5d&V}mOxuxMC}EM|uFAY=Jtw_pmBq5FJz*Fe!f=Z}M9?v_xI^UU|g)9=IZ zN@y)N2f!2h&_w}oe4c9YyYM#Gj6iFf*%F;y70Jx;E5Qgv9JawHRF5J7%TL6xJd*NZwe^hxbuc`cQ?gp!d+F$qt2K=c=f`2XdP8R;` z{%N{QyK7vE&Kr=DawEi6yi_ zSrQaDmlc~KA|DJQ`nknWA>JgzFY#KTC~}20`&CPj@f*OLr6i=SLFGG=?9k=s%oB-^ zIRhuKS=g?wg=0BXO>WD3UHn3Knay1S0&Y5)|H*##Hh<2%+1=}t3e_LdNtCr9pheKn z24chMvsCJaZvx~v4LziKQ>Mv=<|3jR`Ie`Ld|N2vYGEC`K~(cLi)2~}1|O9l#!H>+ ze@{%&V`*P4%MciE;JbB4#O9r8Vyc_zD#NQz2rq(6bFEPfZx~unt3rz3*ZC9Ee-zKx zB$VYfgXCaw)Js8DcN{XCf+yn|C~%Z$v2}xJ)*l-`iNMS~^KJ64O?T{8`D|ah&G2*Z%0!0yn!yv;e=}&p@9wG*!6i&A}<1ro}(G^ykBy$X?7aE^p0>% z3wc^TZ~L4JbX*AS`e83&^E19aUeY*uVVi>ZH_zV4OfmK&Flg>c4b z;hw59+t1I!2Mw`FixCmoMxU7aI9}^mLwRV6=I4k%kp`vkF@R&mOGDZYG%gtKVn*=K1$eYscF6w#;SNSi;}dm{z?+nxVcQ*&NJb{ z%D8Fj#fkH7xqSUY^`LUbZiow(rr_OVbSXtbD7|9!*DQ*8{-Uf;ZY;mW^l5A=!mq^+ zE))WcF>K~+A~kL|rGw}+(%fNf(lf{{Y5&*>_>&|@aEe&mp?vBIh5V6O+d;cqzbqq4m0I z0}G%b^F7iS5p)sq?1R0}U7~M9vBM%T$s+W93FRfw(sx^$dAUZ;`~4e9uz7Czghrsz z$3*vRBZxMtxGZb4l1S`0MVUP;)E3AC9eJS)_FE%BbF)(a>!Ze!vr!TDYV-@Qku^O{c5bZ`sQWm3L_~YAPq?67a1Q6HEQA>A`J^f z(LL>oe8wlQEiKmuvmAi#a%T0r!0Ds1RcLS;aRDW31hhFr==tLlA5&xI#e^Nvt4kzJ znpZXT)~wrZ?)iJH|DW)Ywwv8kI3(e-a1eAuDLBa0~!-;yD5el`kimL2{ z;mr%-zLs)S#x##c_fL&z84pBcfT~$D}^0wtG z$s8Kj2A15Y!}4469HJ2mX$F!uVrW|ZkTazj!YWq>G@rM(NF$~h>ezELtz>u`>+mSR zRO#}cmFVS{mJmDM_kit`Y}*U>ewusQbixs{C&mXP<<*tm&M)+ zU^_aepM$B9L|;a9dL1N1Zi)a$vGefP;^pWho#KEsPK_qcZ-OyjqpZ{>0@$}K9qgo0BO!}KSw#Fw zRrj@q+7zq)DN{o*{ujUd+ND&I{`mtUAvGb~AL~qN4c`Gs@~p}DtT-ZeWz0WDD&r9G z(7#44C`ERvaN`2PMXRJFaAkG|mS^l(G1k+;D6n^FsS`(YAX=hhB>t8O>FmzhV7gKaF3mLBV>hjoIbhWnT zYjE%3-yQSvxHyt|UVQG}AL^LE^}pS3xS4r8BXU>r6MLGpJQhjk2%1i@M7_u5-d-Ns zIb?aki$N20v`!1dpb+Pm{5q~Hgb##CvFXWw+Um938}5j&`bjy&qrS_#r%q$>L(*DNAgJ*N5QTZ{`A`g^$z3oICFf1UlY@0OmYxr&ij|TH|EFQ?4HL7MJ9&#NObTX z;P>2kcW;K)aJJ<5Ej+CvMqjTR$QV?1IN8{2cO4p#Y4FcFLk&<9&v(1HH)4oQr5W?aI&#Kt_xH|o?&Q&U< z5Hp%DvZAlVderuPhNB6eoQEsGTQO?Q)f_xVDW1dE1-bwevQ8PIBrN{{@DallX0S!= zIIHIobZ+59smaAf+VNpcq&7{;*}#SCwG(4?6o&j#c$&)J>j(OlxLM>~DfX@Ctsq;7 z?3GH%N;wT^r&VXY22ANHu#&Ge5}*`x=IATeT|b%SX=McgfEW!giu-i>2zmX(EBY2G-CK~xFx`w zYrCb(VFj@v;&kw?#so?+dfy})>{)l=KVv=B5x$p2P^ln0trFr_4BJ-f6B%u4;C zdE=$dyxX|52%Xr@hSPD^U&*vNb1^i>wXOjw)8+$$Gx`v}56KkMs(v5zO0XSMmBv(^ z{nWHr?Jh2**F1o>F}Hx;VyXucLz*Czm-z&w5^)NoRUrmX;~-+OO9um_O{(Y@zh_>Y zH$9CAa+7zMbd(F2^6DXE2n z%LEp3t{sy_L?KHDtB?ATG2bsTa|>f_6a$XLx+U4o_{!=Ku_y<_$)jR4Kfz=RiyOTT z4s15ehwEFMJ?9;2{5v{{Ion`*K9%bBCUrm4(Bt4|;oH)!NH~ubH{CCQ_u5`y-sY+Q z0^NVC5D+|G9oz5VL9qvA%B9fLczbtE@p&w$^lTOslSoS!)Yt(r(fElQ?OJjfRa1Je zM=RfsfZqHkR~fN2%|D1)ene5IPU66caML2G(v3xi_g~`O*OKR#*b7o1P3Y1UGKrGM zVs0*SBgz8ZBTdU;CBYpsfyxf#uHn>ua2(0FR{eAWVGur)1hfpgqIzFVQ!ZYBxXcgw z#35T4M6`!GVDmf&M&uH?67$N&?7x^c7?zbUE+C_twm(m`$_~CznidHZr7yBV?x%x$ zWbKEuA%~xRuMdvPlS^q=zEEmuvN#Hh$A}?geXGLO)Be!bEgy?OhpQUn^*yNtb(l-d z0)DuZdr;|ovl(P@vF>yVU-P&sCZ^Qm$)X=dev7ENdxf78vw+dMz7XSpAtwjJt!P(Xp zsOS=N4B0UH$& zAc1h%A|FW-HAU?sOK^1Y#oVy0?bF52D)jXeKG-{&feBSucQsMRg}GW9{bcU1MCO;n<9wT!>v?3kyNjJNSGTH7gu|d}JV6mm8edC?e|F8l z9r!RRh|%L-d>nbNrheNO6#q2uK*{I`z9x5Zv=)0``tfDD_O zw(f6tY3RPk(bzVnZ$l&=0k60;%Ohv#BtAT$bKk1@SG1;A1?_dV_L|vx?IJZSe%B|X z_DX++QFgcJf+rmJY&G%RilUaITbK?Ni6Qd#e7*hE=iu)m*KtzAU4=G4^pMvEU1X?z zJi?pSMu9$$-QC5%jOiJ=TfdF@KAcqSw1#uPpU&wztYQyvdcJ3`;dMHd-uU@dNfwPT z3Q~ZH)+kQ0rB5(>YUwAPRCMqr46DCJC1K=PF`=kno)2fTgjmKQpyS-gr2|-$9k}vt+lt|H z$V{HqZG6M_?YUCbw(EjcfTLeMMYBlaegaA#y}_XHx4o-b&{@^Zeg4_@9XgDW;LH2D zrxksl*I&bW4vQxB`Mb+SvPB^e{rPmrqD!U8WNp4BZx9cbLPfBgBwelx<~{c(_R1?Hl+?pP>dqBr4Awgx!pqt zr!Pv>`1hGAv+OlUkJB#)b?*DuDiq>$-kMM8hf@r$?;QhSzySS~19G_wG)HtLnAVQ2g zN1^kpby_$^4#^3#DL!Md!D2o`v>l0lGa>8|w^7@lUx}fBc|vxIBUdxq1@W)=swrQ! zq``y<4a!bBrpsP>CF4J{93^m(6zq_G*~gja=rNs%x`Y{r(Y0V*d@$*?7vMu~RC_fQ zl7ux4YNTJQWkkxNZe7LDvjQRn#Z$ppn}9GCkuDQ|Fy#l_*Ye#cvc7p~yb`nyly z&Bg05w}UD%hR$sTAuBmE0w-@3JUZX9x1Pz-;r0mw%PWkKW`%;&x z?=8cKA;_95+BBy5{%SC=(KTe&sZRYd^5%D_We`f$>D&Z7%tZHa<4hU#nJ66{uT%UN zN6Er-rLA&wd}o)R1=Pa`G=Kj*c|2t6#E^6%iOngUjygYq2-tp3YRVGAtR<@5LkWtiIUy8_LwaHVnW`K(StcB8LIg3AQ3oR~4$+3e($*a! zsgs#Tez5ZTYPTs=JNsT~HuPPP-hY)>tt#%$3v9ier?(SmX({xHjPz}R+5hc$X4~z7 z*Jgl#=$Wb0^=y;o%Xc65)7?U+zS!UWZF78__~0UP`EXt^A>ILoxD6UNK!t`HU>P&K zJ6mXs?;Ke`Qy$fvLFdy(byk21@^IMUJ>3YHuKNlN`aPT`VDmuAOOV(7yP4Z}ud-#k z@KWEwdxpk<7kbd`bJw`jNxgkjahUVY?7qFV*y(B3IlbW5%|pIPyBBjXyhX9jHAJ3{ zEzXG*7VYZX&SC?!>EHOu7EIMJ)L|;f11aT0)Qb+3-?@PfBGxB{`t@K|2%x>79v@0S z?_RA+)k^{5Fn5&<(CkbzD=c?Ks`nIcQc^E`zc;w-IFkxvfC?h)lVruQv`lnGE`YZ# zS8XYi1ZPpIXWIbiRJj;Ri7@dywdY!!?Q3#=!KNE{|9dcaipl<8K|1?> z(KsUFmFP%CSTd8cg0UC`6U*`syMTBm2bjVnSm7ijiJ{+_`fu2@3Oymk{UWeqII^^c z&Y>B*p+h2Wd?J`Al6J);)X1HxWnI6XLB+@w739k2K506T9I62s9tgyPqzJ(eua^4Evcz9bw<$k%T74)_2Xg<@=^?Jh|_Ith`jBfb7 zu8S=nPde9W>P7OiiBCr&m@2`9FiDby%DZe|kA18`jM(FPH7h;OMa;PYNjr~E*GgSF zfI4@+fJYgn&db~K0d(h-NqkvCyO8jKU?ckD&s&W7X37vuckx5y)zMr`>82z6aR{9Y7=@aoWUHZ}OMzb(Lz@CZ zgOVtW6}Qf&C(kYuFR%XYW(K{+0a`LL_)XZe!4wdnZG0?~7*AS2tDJ|GhaZp$$A(Ll z%?75A#5q3Hu&+BW&(MNAWi9GmJNh=d;CSd}wsS=uj6 zST^9{hp8NRHM8j}0~y>+anp+c4}rPYY$vz`IOwas&Qk+0=|w_#c5* zdVasblkwe_GjCsFKadJ~507U)*FAi{aekO4`9d(F9G8gFfLekG8v>A_B?j#xB&}Ie z7AEcuM@lAEOXkIB@@JqCnha%2tVR=Num2$P5Jv_Dk|a~rH7wJy4o?mR+gjv$eYhv# zad@R#Usv$h@z_Of*?v3Rfo_n!Y@)xH^S;N@r<_{o&C-m3-`-nDPpi!#f#BV&QzM`N zEIp2taxOqCTI16Z?Z#~j_Z8XkhejAgv~DX{*haIj5tb;HMPv?93VYl&`v-+YAk%R` z`75?DnC6R?NL`R(6Dc@|oDG)7Thy4lssR;tlm5}pPGM?(9E$=DdBD`8tT)h-qfi@$ zwN+^1i)=_VBDWQJAOi4HAu^?Og2XFw0z!D~aM0x49dSHKKW_S$_vN-)&*g|e8V^Sk zHl_Z@mo4a@)|c7)-Nm#yx6G{gg=0pPFtwYJncH@kA3EP2A7=jRKe4id_#-ZiF;NtCVxzzh4FifYv?>ohND8nMcj8*vP2Ej&>|9}m=)nUl zgX`RB*l#U0MFH5-aC%e=uh8b zZ}<7+Q~+w)Z4&=;>d@rh{qgaK@7vP$hE>g|)z~V9MR0f@l-Y1x-JUWK;4znGs}2d| zWW{fTjEc949PPDtb{C1O#ewhS4Lz;wml)&@i7U=r^#; zf(a#RDXt2lNehT!Jbph9+h;V#OdN=8$C8fn}5UGWQHkUBcKZu23={sy4<{Y7T&|on76eBhh z#?>8J)FDcwsm`IQ3zB4JHyn+{%w%FW`!##tu|p*CRqHAjen>>|R1|5Pd$n z22mp67{IKVt$*5bP@;fLj`IKz(tAF@0s=uXpPSCF1`GD08JK$Z{c63>;SZPYk4|C( zp3*nST2J(pM$)P$m%`M9#azU##EwfLyL<3{SINvmkGpU}EbmZO%ghrtR%J@^C#TWw zQD8+*j$gmfj~fXb-xMYnpXKt5PwF`nWwoL9FY)bHPGzx70yui_MqJg>OUVsVPq5N} zJ*>Vy7Tqld2p^Ill14G2S()4+Kpn@ptTMs2o)D%U1OH=>vsSk@-1jbW9bJYDG${y5 z2?kI{E5pci6+ze6;oOX7XIE6kkO$lRVWY)h9kq=arm0~u@>mhK2&x@Lr zELekuSl~i!-8xLHkDxUW*v18gT1OU}h*WL^-AIN)x8P?8M}oU-M&T!zx=Ov12h*y? zORElnvrheH0KEwJLaOa9MxlmJ!3*+NGh$6?7z|WmQC4~uM&DoC4#&G~7SFq|@P?=W zt?qs6>B_UYrKfr^p@7?2L^O+YSdQQz1#WIwaiaV?H={}Sv1BIbW!`&j+4o%{HEhE1 zs1h%-i%7+7$J6)PDLqGNAY1sGqF+w!HcS%?GX}dmgQ@&*4@tQH1J{!EOQyKeYno9& z#A6H-#&q3^h2dMgk&LO&4ogA;qui1yf_xT#8o7wEUaGgOsvGng3&Cv-`1JU_>Y}{< z`-?b+645B~|7ZaUQ+u@^P7;OTABxt%^Q8I@YCxoXR+UdPg!l-@tO#>K@OO_(?eJw~ z3@DJF7G3Ksszzp{eB6ai)EhrVJ^z;r8|pf=pD*a;LZ4T*?#hXJUe@<*d2V_|>^B;4 z3rvzX1j_MYM~7F1QzBSx+Ij1zgCeC9FeNi_?Cy(i%ZTqOK&}%)x{xQyF>#fp335f2 zV`=qfNo^G$5EBJHj$T2CwwS5XU&~;^j;?mHKH7;Q6Ss%^p|2AH)Ufh!ff4EXt>4A@w>Y#kVTO4-R|YJ3N(keY27M};Y> zFR|pHPXz8Es9JU*OBw}+tveDKD=0B)-U`E-Bhx0nx+wN?7624XAuOpq7+hAWR!&hp9 zU2l2r^8!B1tahCkPHLTAwLWvKF>XxOtRYeat1O&Ye<(i}&9Tr@^x%n+ZC9YA-cily zYZ$_gROMJ=+^NzNPx%lXgZO?$iW-R;+g3g5Le6bAFR;NVf@Z;&6W=?eVbU$7=sfM! z%;t{)M;Zzxg8;zK7d-=EX>4;rKMUr=cnj2ylagykS*i|Dy|W?;qv4%T1pHL8VSC}L zxyb;aJAfmEk@PcFGb2wcFe%fFD(6C>+Hf`~{$FGY4fdXR7WBGGcj!5L7ta4qyTOA; z`%~lhj4@rJj+5VM)Z>nh8J>^9u)B(YsXwcAGmVo)FQ9E?bXxLPMoCZBq5<=Vj;#>} z#is2ojIi{_N+xIJemK!#+CVns7!=Wu5ivL{3XVUhC0P?!+ojm7FYCL-IfmXCnBzCy z!)u>!-p?uii`pOYe;LTjxe4t7-EA;?4Rhz-ELQq2?dyIQbmkz6C>|+mGKo_K2C|WC zO=A|FK&bn5A{-yi(d1tGm^jMAl`xxgC^7 zkJ3X&U)J&M%TazyNRP9Tr?|5+EF>99%v{6#B`lMAN_dUKv7~gF|0HSfApKfB%@SLQ zou7W!i`#boeK>z11EP5R^f!j*b6)f{76X&27~^RUG}`;B)dFLfO@ShC*x`6Z5z_j40e7;-37-%Cr^NdIW%zfVGnA!( zH?6?$XLwgnhY4_==YIV#oAsRW3TVW=i;TWiMRUN+=#&KTLQ?<}93AuJz{+gaw z`37<($b?&NrnWh@0WE9f;wa~g&F`{d&FN{p%JbvNJ=gc9lacgQuuJ#3&Dy~GM6#5$ zQ*3c5b+{H%QTqpSt6q>o^(^gmxmg}!=|V1`2qgo*gr^Va?W}cVn+&}K)Pn$B{*(2b zT3qRvIt)^3xSvii^wC-h*TjH%N0Pdz@94~J3_(}>#gn4hNeAgsE-!*eStHH#y*)|$WQvPkyxG*R8hrjiOSXh21y~Z z%c|%>(>-Hk6IH)N52R_^DO|*%bAme@;QweX@}e-?S*;SK2@>| zBEaW^v1Hs}^m-ZhK7Z8n^eiSS!1-u!H~*anmON!r36cxw9%F<*HNs0v+Hm~N2MiwSlIfL`+dxZ|E-&8`|IF$ZZvq=D>Y zusP|^u58#9VbqKpHk(W;b44#mIy}CQz~Jr0!jVO)`X3B`CTY3ndXIGqlCHgM+vn6M zq8eN$hQOgVYoG;GFr)aFW#NnMvEhLPI(x4Yt%~- z^d`*1xf(dNh7nILus}JPgxc3s_}L;1+R@?_4VY!Vn(W_U@q+#pchyn#W%D<#mL`4Q zhK9@Tje?fTw#QGC>jGMM|0SQm_Tpzb&$H=DZ7=&jey2(C8*Zq6DHQWLa24gKDVH^F z`FPWRDz zaJgMqnEU@8iNZ~{KO+IVx5gj+HKcmXjgN0gZNlDe@b~lo;y3)Gg0?NDN+&`i%1~V5 z^lJvxNwyi``9rDsg1+sH;p@T)rx0T@_%l2^}#Q`V1dM&z}3HXs)~Wim#@M-PTThSB-sUq%Cr#X@#T`fG#K;yq>N#`)J-t+ zORThbVkQOYjdm;{&fX>yPmG=iARjbk>6>rFzVp05n21GZA4jO~TP<&IM`Eu*_FLDx zWEnbh=4$qPL|1KlYco@V`breo{=6%6WmOcsQdxpwbfWk55g*6OZ2W@8jU(2@H{Cdx zy0P%~ztAWW)Dr`+JgoYj)-w~{zb`_GVG`>h6XCmo4EK5E-lHrma+50fCeuN~QsiX; z=rVnD{PGS}2sdT9Qwi9`x%v0& z+cktm@Dl6$jcc%T~ zQV@X(SirPDCXE5Lj1mBvMq(0q=yL@?*-uIKAf>b~kwem_*UgCmOY|lnY^*jCf3uD# zO%?XJ8OgbR;E!?B983uE6^D_c#Th(4K1z=UIf(OyQusBsr#xBZVLbRyVC4 z-jd1;Tf=HJxR+ZALeF~{r&{Z1G;v@x{ul!!t9GCVl=ppgQlV|UqeuE`Rgz-Vcpw-* z;?ypVXY>-v?+FfCDY(I3_zVMi5+fWweQ-Hn{i7`*p^9i%8AHx*KO5%^ z4`Y1c(Nh2=2Q5s_5rdCsV5aQ7_J3q^Fxq|i+2;t1=v(_gk+YcPX8T;cA2_;-naNlX!{b`xW0g0J`(;!^X=$r=DZ z7=(ik)9)!K6P}~aHU!{cP<4dr2fj(-*P{` zbSJ4de~60^^a5Czf|=a`KeQGa7-uq3VOm+W!#YGjltOoy*$|>?Houx%AZjVoXiNwQ z!%GT{pAuPpR}cPm;&pD@_B`H{PP;6PO&U$BrcN4IQ7aY;L&VJsEq?Q`fLnQzsnBGFem>E>D4bL-S7YiFP^aMnCE}Yaf zNfB4d(HJ|1FF4ZQD`g(;7IxosO`6#A0e{tc0n!Z6d@#X{@a68Y^70?{uSPA~qj~6d z8!IM{)q|n75ON77@(>CaeXS7t|vlJLe0X<{g21(B=8ue6ZC zBmZ(tU@QVDc8PD{%Yjs-cKMv%F>pIgl!7Kf~9sguNh9VBG(a zcH<91lw88uE(exyND}QiZ_?;&SNmSx{`6e`2y5vE&sqPeII62SGXfW^e?MHAZaW=I z-S9tMdmLOH&M?=Nf|eAS#i+&EfY-;>s2>IzD%g>CsA!w{jAL>;dT4dou{ue*INB=4 z&LY06%JcZELa{tWqJ}|cA^ax9;4N?u4?Qc^)Z6;S2f(oKT5a_B_l?XA!veaW7*spd z|Lt>Lvq^8yGbbrXtn6r67qFj_sXg7}0N#~m^SPXUdzi@mKG*3(>MwG!wAs}bvEBM_ z?=j%wvf1T&U7TnS5#K^8e}q}aew9DqORvlKf61uD3LkEwc zU{yKaqKQz$H%dvV@p&BBC<4kj!Su3uht1glB`ooo5=(a?v4T~^6eZ15=bs!tcL@iG z$K@gm@D=G4HiDRoSxprf&>ahnMM0={Z!I5;Jb2YzGSdR#5|P}$lx(M^Q}UKPK?+iw1oH;1sjV?avOy<z|?@{aspLr<^_>&+HYQM=t02Q_MTQNSOQ}#!W}t?BTzy z+-P%rd;ovz_Hn(~?7q;pE2>17?8P6dO)f@ovYtS0R)bHr`{6u}P{Ao8p(!P}k=qhD zvdKR+wGW7HK0K@( zQC2qJ!Z(en=+HmwVhE<9>UE%saGFNUHU(e%SkMqPIKC)%kz9CY=lb`M( zQnhvB~_voJd8}lv6l9q6Tq5X*{CDBV;dg$t`kXjF9 zh;}rdG?Q*#ZXC4$SEa9)PUQh&HbpVPdfJzkaj%eHk#t@1B-#_Q(P1eQzYR^Hhv!qQ zdYz}}w}E4%eNP^H_EQ6n4yNBDZtb2kb?%KoU2D^==a)U5wqlPL5!5NOZ6hg2ZlNyz zRJ9(fsYc!>P=QbNrCXxLU2WPrI%4eT%lu6$o|bE&HE0=%P)hYbA|Txeq5#~r1SBs< z?SY!J@CLH0Q8K}lm$nUbXwko(&=PWS@)x`2YQU%(lWlhh4iFHHsvSGV#d4%&_2d#`x$RT625qG&BsWc}$zWm7i=06elK6YfpUQ;4#tm-?` zQCcJ>(9 z-Cs}5Fg~ate^zt%AJg|17|f9@DQA@PS;I88lSc~stX(Ykc&?3qDjQu_{zpu?&q%l9 z-VUeXx&A*Ow(oWd!B3+J5fRN-lQV5IB;*?b$PhnpCw|eHO;GM_58=HxJdgi@0TkX$ zKV~;sw+Z`G{)LPToA96B-Rn3mKpwCt@>T4tVG{Zgr19A3%!Fx6)sVZ0vLX(nKXlAfxk`Mxr^4Rcak{7EV!_^uVcE!q(DffLu zLMOKh!(5OL;52L)bF;>zDnAfYW-^g#ec+N1U)Nia7`iPb(HjpbKwQu+ux7v`$Qve> z)+8J!*`D&2#Ln+kN=IOR34ps)zagOmgpOMQRKPrh4(u1m*!?1=UTsr`*4ZSos3d(T zEgK)DPOlBq$hXlxZubW*J+`hy&&e%4EB|pKq5zgUFJVgAguw+NYyq3Ds=I>&7f<hUUMp;^(DjPhS z@%*-KKi>V(NPTZR?MT;rHpl|M-JkJo{A)j`{Zps=vuuXmw8T-tIV~z8&KcYX5QQ`l;g9PPg?4M;URpojDgygbmMZS z@?uwR9hr0P!8jFb_{Rs1ynSo4_Few@M2?KZ$>%~mRRDx_Yz=m$7g}e|0(sd?d;Of+St!K*D+cz zkEaQl9p9lzgkC2gRIwBe$>x$199-ib(FHX*B?Mc@9jSr7Hpo(~WRg0t!eRN*f5~2$ zh{-vcgVS59)fFlzm!KyY6bl0#mVf>Ny-$w-@e`BPLyH(rr+L0#gDsBuf+ZGlJDlz+r8`K)qg0*ew%zcOR9}j zkDH~9BJ9z4>fU+~FfdXlqKx?E;WFjDEWbR4tv(tH>jC{;-o3WK6rM;4?v#T@&Sqa~ zDW}`ezUVSH0)%CV#gSZ+p-{|yvG)r; zYv;}Q^xHqCTyMW_J6Gi<-^WW;Zq~iK6AeUO9Ed?_gsMZcJ2-vQ^Pv||ZDO@X#LMV2jh*KE@eQyZ2?<5@w@}ri9*M1#8yrZf zv?DeD4tkVfJI@N>fzCbLWG;G}^=?11bcX_HeYQR-%K0y8^q#-E^euC1D@hN03@7Tl zjb!|KI_>*Nip(@X-!}j3p}Py;n<6VPDGF0H2F0|#^r`n75k-|jxdeq|%9JHepj+B_ z+=ciNz*&^l2cE`YM+HQ}L6?tU;TU~=?$Rr^k_%<>X3b;Am#_+-Wl2TN%%2&c|88KXTUj~0=!$whko(*}vH9?E z#+IqGYHr-~?mumWgpAj9_dMO@F>QCV({V{1LTDD5FYdt6es3WE;0zp|bpVogG~((R z(lT2vPs!7L={U{dI?l5!6?CgFsAIrSF~LyOvKm^}VpV}k#~znt_t@^$)x3%(sx3o= ztXR_F`NKE{IW9ecEVnuO6US@dY{J(Gj9B{}TF3A{>7c>*y0i3S6HWMtY_eiUNMq~i zbP0SP_0uh<&R;!-CoBxsmz=}LviD_%Y9%}@=Q38ME`z`-f6aa$X}WNGnY$$6+}u3lz)6x#thEA3_7Qj0RrPCn7)VNp;|f!=*y z-Uo3N0kW$7JPey!&U)mMN@VmMT zs^Fs@=~4lKM%Oa1e8cx_mp;i5s8|t^lf;`Z`vy#*mPn2@TZzZ|Qo>xVD3IfY|N5Bi ze)Vefex9Xs@M%Rx`803%tS|i(d-UX^@$n>S2fs(eksjtWOp~Ur>c(4)!gJTMyl{!3 zzc;dEgdRkS(pQ=KO2Iv)*woBThgej|22#ww`UOzF^VP!qs7@Jj{IObdSM&*afdqv` zOG6dhC0deW`+U?e{U&MJD!+;?0xIN%o%aS^FPGNzMSek1L56@vPuAD0QPDI>@JZB1 zH*I5A@W))AaY1i8>lG06IF9W3sB(HA>YOEg^|=wMHhTLoT8bcRpM;2`6ni}`OG6i4?6K2rWH zy31C_?_<(OdsQ`o2R-fQ;}gx`sfnD21#cQZ>(eX4$F_>@?;}f7!)9o!W;~Qaf3g|l z8o7}%2J6g!yu&@(MqrVeR8+kO|DkSnh1S=q$ zNN@(Ph-k0`FQlRA{)Kp);JUb=qd*w7);qu>&49xcL zo);C!UbG%UH97wO_5wVU@d3_Nef zq>(^Kvn-H3uvpWJ@GftEGG`(J706H|OpNOhAz`MOq{C(w6hYtwXj1b$Aoy#Jt-tj&%D81Z)l`mgwk!FDDN95dy%5EP~&*;uz z!Vr`3`)o(|;}Bcx-B!;N0eBnD=zd*q_=Ti$k51*iaNv;?c3KoG!FEmn-xL`afC`mL zM6{xk9a$=Rl2`-&n8GzI1R zbgMA(&lL01-v^xvr2cv!L*VHzDvG694}H9sgX&M8!iLeaB0KdgG<1U<=eMjfQ@Bw_ zvQgmqOD{AC{VUpMsj51NF2(ey=Z;thNfKGv`&j&w?Dk<<5@>6b{9k3t*>_{r*L$(Z znzzX~d_ed8_0E>}(>%xdW<#KW-5ojv_9-d?ULP8z!4o;q2Ky`85T{562EcB2OFp0r z1qfGfwweW;&;R{_5XOZ_F-aJl$dL~rq7I=)$F8AKX>y&g5iZouHV9o$`>yT-)y@nL z&vkB5TonsN!l8whvqeVog(q_ za-_QYSZo190oI=$w|HgIMYPWz`8G-TKHgiN8G0UAA$y&=_8D5Tymy}A0xF;w=OSy|cxOYnaNC>#|hG_7w3*sbuPc)W(1B*ZE%Bwm#-~9L%vUoozm> z=Du#D_1yGt`Rr&M{sw!tc0YQG4GKAdSBYkt&FUDj z9{HObYz7GRgk$~GRwuR$fjrXUC>5Kk)FcqT3>%yfY4*;8ITMCr!{Kgo@Npl4b5y~O zk&w0e9*c?Z!AoA!f>9I#$%2R<4&voCyO=-mxQzmBqko>ccRNSPPkD2bppaTZ?pt!LTy)d5WImj``>0%rJln_0DM#g3%~(*bRe}h2kmt!C+r0`_!`Y30yTFhGH9XAW$2x zIbr$H1l_${0s3gMa+u^%r1R}y>0@OY)pJ9mG}9SZtV%AR$e^%EICqiyzG^>mbv_nNGEs=zvUza?8 zWLVbkxK7qay!BhF9oYV)!pVDM?rTifzx$euoVzt0*Q+A%Q+r6x0^8;4%mS_fS;5y7 zhX8o3VowoQs~v#)?R@StfH9qO_3&aGIetxMdLN_VAL+Ll|ELqmV8_Z`V31y@!4{R_ zn;va(w(07DAuo#)0(ND5~8_ zg?-5wGmr9w`KPjtbUQ*3Dt9q)rQNL;!ucne&zNJPMxaiuy`XEY*(TuN3$gd#ASc4h zC-IPQ$lg5h5WxCd%91ubE=m$P-R@DVEoa zCN4Ym`c0QX@_!%)ho*Jfu|MGesz)}Od9P4vHGKzlb^z`GO#L4zhC*r7X7msc{{-qN zqNG%)-Ou6)9iOFwe}4~Iz*{h6&$p(~+b1gyuZMI)umO8hLQe1FL;-IgMWdVDT#*aFi5Wo)4kXF6;$D%(CNu*tRwt<>{nr7ZF3k(RxsLutJIIV9M(V?%Y z&C-89L2tv5tGMkl4=woV=<$}3p|-j^S;)<_?@5KLdr2r~mm*i4uCX7-mPcJ5r$44w zUHaF=gez^uC>Kt4d)Aoh^_$k42pM7MBi#TqsFJ_Jx-*%t)7)kK@2OHnJvj}U#J8%y z2}j$r1#UJ=#_`|G?S)BSrYrrN)e4uOSK6+!fE^N+Y@mMdNU4_n&ydP%g6k_dCfK^= zJ7nTF3sG3k3$`U=-^H;~>rVf9|3c?x*AkQ|J-WGJ?%6pu0oj+dT&t}7SNJmgMkP13 z<||jVasYYNAUggfvUC}aAs2aZG7xzwOFj?E?oM(tIP^jfT@62h$@{xwZsp9|2Snpi zraz*I`XyeoD5)%o_mjn0P8b`i=U$$;B!tP|JaOfkw?X5o_Q$%B+$|RU-Dmucd>;mJ zw={&sG35}G6;4WBl&BRq=XCYgpYdudFPC=T1BYl_wCjqq>u7h#P`1!GWf2RksJ~|) zPKCD#a6p76bxTC@u*6T=^ay{Kwns?gf}M2`0vtLQZu9c8N8YC>sqxwE14Qb9-Vt z|K=47xDG;6@!bl?QdtH^ryAbPS!cVgryQg?pS^o}W?uCyb$DKiW7}y8#B2y+x)I6;t_T7Uc;pz}ys7QVXB_^fC> z6dg6jwV&&~Ze5ERdENK}YCp1q4UL&uu>jNCa&D zssZr1ZPez9mI7DWU5O60E6Yrz#)`QS)8~Rv;bSfKpe(l%Rg#o|6AXis%5+)AY@7v@ zRErGb!Lu}Jlke+EfCD6tY;soUdHzEi_P5F%S)icdiIGuP>kQ|VhnHCf^{ zVL+Q38<@n8o`zs1Nzvdl_|nWg=mCD+$YfkRLx2*xR@WEvn%O-et)kE=m0?&;dV@|Z zc8g!D%7i@6FYs_ndSC$M___eqA=+2NrGSV+vjJaGnWn0Xu^xZr&Z{?+xkp3i)7M=8 z`F1Eazn!+4_VZx8O_x~=S-Clq^{4GF%e}%!*RzzLx(2#M28ue6GztyP(0Y{UFw8+F zQl|3cmhIX%5yTL(;v=l>^z_KJLz=1;-dCn5DtnbYIJ6lBq}$TCqa>EAW9$B1B}mqR;nl z^w;9W(>6@0zpUr?ccE&MEYWG_jk}&6iRx&StF{!f)~A@vB@*}ji_M0L`AvF)8X^0j z2op_sHE1Tx=%~nF#`J@59~9tM?tp$l^EQkDiE*?|<{GQ^H}q z{^ng3;ssuF1(kJld!0EdE|PjkiIKVwb@j47(yn|^BSLc&PIIZ14V@>{GDZdyl=iT< zK~Mm(DdqeBFwr;Tihix(rpvQt8x=6ws03HBZ2@gj9#Zd&^O}*(o2Fn_3Zh0AsVKG) z8La+_;!Dhr78Ny~K@t4Sx|evU?N}E{e(+yS0ukZ=w!~~HfNV&fJtSZ240bG4cR|kA z3ElZBc$yBA^}i10>fv}B3~=*#9uWE`3u(avH`FXdT%PCj`DT^ja;0r-xW%M)qhz`myXjI0sz#M#$X&%XQWwV&g45{CCSt@`ow zgN^jETRbF3?=)PI-RAG(B80tm_3O<=3(HO-4r$z>ViguF7Y_^iigccOvUb-O#(BCa zF;5&v`S7UNbUGzVSR*gkv(%rF22;7qCXKW~@ETJA0GwojRWj-q1*x$Rp-)hj=%@@r zo)c6ki(;IlS2t8+>7bl zEcTVuFB5+>KP)RoZ3JLnqYyjUhQrk4y;ss!cSZzwTXlx}*gH8@oIZtkg9Ctf#-}%( zpGN1F95$M7-OUSYhVKW|)pWq85>h&H_J(n%i@jtYG-Fm|_7XHPgJ%Ef`{*^UMoymYW%v4vu*%8KRnR`1aPFEfE=4Ky$PTp|LRVai7rp5vK6F{ zY9CGomusW!Az^p3hp$6d%WdM;eRL#EesPH!47=kO9WyXu_z4Q+n?V%XG zCfvpYYmt7QbAIk|^t{zn3xwyf{Z*Fk2YuVbRciTf3`1@a&3>9yK7>-}GmYXz>=^W?C2cu# z`XgleZCEGZFwwN+H5XLf_H_3O(TUQ##@ca-q!=sqkoMl*`=g8BpSAMV<9ze^d?@T> zyvr9ig?VwzYZhq%=d131kxq=xA9G>8<`r*l#vc=@Q%=U5Jq{BA6FNp>gmFE***`L8 zUYo^yPSWEbd+o)*O#e{AnF#nn>5Ay^GJ6fCyriStGMfTo?@NGDhN4_C4!6x z=})2G&_ka(XYk=F%*KT}%K#up`e+hI1Tnvq{$b_hO-2!ozl2AGG1XduA(t^+X>u%8 zz~LkAy4=$-_8Z=AB;vNA2Otx2ACLL?UG3uF49?O}J(OdV;HcrlIF7lS0n#asv5cf*AB0vp{5-M3(Jte`5FnIPy9*BlS z+Cq0YgVj(oMbaD;e%RT9G+Dp)Qcb0H6a~h(5BhPII88N&j9~GU#gH_^nmh0;g={!) zljqM$aZqD_Y{vXx;?y8C>0R(d+10S(UJe|o;7dPVR>vJvZ>_+y>|(fQU=n&kfBXGW z;Cim#(Cs6n7kn?=su%!tTk~w7SHG33CQ_Fnp6|uWzUB0* zkoCRTUE)!|{rT3%_8!{%Jqa9($RWI!orFevN`_QTXVl(b$=Wl0zV8!Mah+JbVFRjX zCrcuq`_5OsZjlEQTIF0f$mz>K4E#7vzHj@hAxpcx186Ug12{x?XftreJ`Y=2V7T1Q zi;1n)ozQEDOP5`e;DPwyJO`Px7dUvP?_9w+1Tv7?y@u_F8^{kZE|#s5+@IJ?Q*20{ z-!HuRW_Ys@5tdw&yeC%%zcV{()Q+2K5J_>I$0CD3)`dX=&#?Wc5FWgC@soYMgwF=) zW#%(6F>(;mwvui>@E9&ldJa^ShA0Y)foU{*p6S=U0Q7`sIGi9>Xra@=huyun7~ZUa zdc3hERL}MQZeLVqEtlR8PW3Olt@ZS}$A=)wT96EjAYp^0s<6w{dfB7kiyUh$3dO5w zLlXR*S|0o%W;b<^3|7g3-wLe}WXPekXcN?f3_W=I=VahR8D`i?f}HJZ>C_^f@tYt4 z`X}Pv4t&`|5P3ByFaS=Qlnf#!ZyEOH!sapw9zKts=gjPDMB(x-ituH!FkZWBwDGs7dK5)9uNL2SsLyJFSfdv5uR5L=&giqlm?z2+|uTvwz`Yy6bfnDVB;M3uS75mCE>{z6@)y=!Ml72JYP& zzn`#GwZF`|wxEgCm8#afPUx$?%wKgoIi3gBhJ-y>@FH(8Ptcx)F1P(0$-Uhb@hy4! z^`CnlVRryA-EMM`v4G~Z+KNztCal|B(Dzg}I>&u(vBk3*TNU$~xiTA^o;DZkh)^3G zV{}e1YVx&XGVveC0yXB=-Y?D9l1xg%uH>wtOZ819vo0DBMjX?Xq5I`yp77mP!s3M2Mp~ zf-ccP8aP<7$UO2-mh9iw$5SHLBdX_Gp7^v93IiYn)*p>UpHnpOtop+8B+)Xb01*Zd z%$tqG)d!UFf<3n70IvKZ_u(&qmSc2$4FZ|U&n$oZp^Y1L*cEOU3JGKE9n67JAF|^_ zn?zt5?*=wAxLjdTlcXC@Qa@9y2fwIU4Zv|%aLq(QOQ)Cf#8V7#WyMp#8AxFlusK5z zP{7SUO~$}VG!oj%L+IbdXkim5xAb{%~g=Z3BPQ$IIe`b{H4&i7mY7FK~7&aQSL=V62}M9s6Q`98_DO4y`^}n~6@a+ybIi#KRG{(jYbyjp#M#GhIdw zQkU1s#Gux%bQFBxA^`A62z&wd)gs@^Ovju@86_g5xS^Lp#=7BAU(((@XDxWrjPOCh zr*Q=SkvE@#UZ{WN^ln<@MupYCR`KQJ>ohI46(^_+4lVjCpr)&rRTz}T%qrOIbfO~Q z{(kre$@gP=N9BK>>@_sVOzsFsi+~L%keG<}FvR5oEla~M z#FN!xKY{bS2Y9^uX$LtSG#~W^IuO!~d}2H6>A)!?v2uFotlqxE0i1`Q#L;S_u*8U1 zDxSe@Y)D@`@O9q6i2?#nZ;n)_g{~%BFbtJEE~_no znn>>+nsm7?p8|y(M;ExcW7F-K4(zkwypT(3_;1Cjvi0DMFDK+#3oA}n%~uCr1f<3f zA8jh!oeoFl4e#Rx@YnwED zHOoNBp>2lDe)_5!psdPxEuwG9 z!2UNgyChDeTryTP98T2!Pn`c{G8UDTruDF^JOdrMjk3!sOLVzGa zJDflDj(*Ui3OPO&OO;#+e!Wv$lWq)@9fr&($JD1*gDvLp1$^$*HE;>qa=F0QsXy1d zZ@oc#*st=nin&Mzy$K>Ws7{enIzF?)YEqe=as>lI4@uF{Q;=6R(nJ!Ov#xgl(P=S~ zI(dBb;y5{y`Ml7)g06MwTo za;7*8J-J%tBS!5V2jpc1IC3qN-~0u_tp;UFEY&?B+pX4A#>KmN5*3p*oD%l1vT@^_pP1svUR`$cMPT4+S zRh1Uo7iJvTeux8a5j!*>Zo*byy`-kae*77C1W|E3i8If(9Cn)gevTqR0`jPy=Sey0n>OT(asy@P-u9 z@e3Pnvz{9t_5wS?-Oqe{ADn>7*QUpjc4P40+HR3BpS!8okF9`dXoI%KAM}=(QWW+l z(c*V8vCBf~Q&srB2NZB`ea=I$@3rkO^+)eZSaE`0RLxF5hK3k)ZB(^joDtQu^aN7s z&1>vhW!--=!uY1ftTk*rT5JiW($}vRF+E6Mec3T;&iYGeeNJlm1y+qgOU=&DC=@1o zGRY`CUP*gEhJ18$6hjCCay6h&Au@2xtOs#U5x&qC`b^j0cvH87|lY ziNA=3dr=$)Y7RlIcdYTqVs60II?HRnq^l`#z}XswklSXN9K~n&ET!dR-&5*ORYs<9 zz3<3F+n3=nqC|8If!YY*4~pr-Hb}M9l+VcnrFXA4G+ZIhlTajzj1+CLj`krWRAeH7 z4+ghB4mlPiq~#(oZq|nY`b9ViO6k@Z7Dsk0KB!U9E+rUw66o)&s31d&dZ=jm6-S<` zA?fxV0mCi@PDX|(Qf@Mzf@^FmHXUUKff6Xg(gc<%p@MV+Bw)zE+6`kjMaz~@A;1*Q z$oYDzBHVHUmanVhP;#}V)hF&2i7n<04)OH9Wc&gz4STDP;>WD;{$l{hF0!YJn_rvp|2{vff)#k z6{I*hygo~5QX5LbrJA++vbIRdIrjkxFTMMw->y;}16>FTVje3kB}*@wqkKl(_yUOFdSlc-85z&!R$&nQ0AsrSa`=x z`fqz9pW#icB{DFFi{1Hp)%PWLlOHtBk?`MF8!B~Il-c7lYrv<0Frc--XS#6T!-ypP zr&e6tt=50tvLGIN!;-l#!Fo$jj`w}DD|2JezMk$QB!TBBWNkJBi#w+%J_-R~Hj&p@ z^QGLk;gBPwN6|YQr2_k;z#{;`;MC7azK~Z8lyYlLssX3uy%%nbbWx5eJ(Ve*pA_Fj!ozg~T3?Ag;VnRXa+QBl z+sMRMk)=Pi8VH>=N!(aW3ZzdLqDAaAbK5|4Y`ePj8SS$-+mNU0{Aiz;>OcT=KOgF# z<^KHNKO(LBzs{kd=l57;vSSPi)?WV-q&>Yiq|L{QG?GsU#nGh z(Omhc=7o>>*vUD+dksG*da(Z?%)-Ggx`RjL#(uB7+m?bO80`$lr|kfuP$~CqMnQi55)-db=Sq0ZbMFy^kQk9UJO&E?c2i`{r8m~HJ%(MY-;d)& zuDS-Yxj%KJ|F0%J&bZAQFJEQnB|-i!89+rInAF?^Qm9+%A__V1BX(Xr**EfvCW*W_ z2!qT(Fn{{#4{Jq^sWbFM^!eGpzQl1Ep(7u`i>A2&n2_Zl^3>$#CY<}2;ppSlp@HzG zh`|Mv{($O)-~KEAkEyp{h%)TDg=b)Zp$BP@7(nTkk{TKX>29POq59T;&p_%%(Yr`Sosfa57yMs1(NmMe-czfSL>cw2)^2C(5dBN|fjLP;Q;QyZpm#AopG_CBM<7Z0K%PaV zVVYk>(=50ix;Su^CJY(<>?Qk#v!g!04rqxUnufc^QiGpQqa$hD1>44G0D^(~QSXnJ zIw=0$ISO1X)j2G6Se%uvNcpA4?L#lhxQ>c8wjfz<_=iZBZ^6)SU@%V`sssu^%(4@JGxzz1RRrfnAfxS&tWC zl+IeedvUp>FJ@x#!2CT77?OoXCyj+G?!8B7o!gO(LJm!VqHPVfE9Ygpyhqe2RZ-$y zzr*F3rGREc*R3~RA~c!4hss%Z(_0qUXP<*IGrgUDKBN;1os@gG=*O6h6^?}Cz}_8Z zVy?&cU3`9XCThgF>^|t}O=9k02=9&K2%|8Ys%q$*%E9!Ak9B00efd5i~ju^I%WA?$7c0r9i@;CeJ5_hjX z7hoeWq1lhYhqIBAHF(W-jxa2eH)zX8+2-D$1UlfQJ!uC}pa?+=?94@}uPU(1d>dui z8xYLc9T#S;stCX0!eVSjlEkYOjtvc-<%#BnqC*ho7-Yl!*}W03ePPFLG!@~JSvBHT zc9y>J^tS=wKV`lc&b`^df-y}OQdp+^5$$)k_`yrUkS#e4j)8r4GCsMTjPWM$o5PX$q($(WtKZw5qi_uu7j1`c-XJ(*`;SCcVoR6fM~M`?H28#6e2 z5N_R0sq){u80$!AZTPY?J8}pPSRWp=OWKOsm*@w>Y_BZgtY3Hqyx!?y2$`%@C*2?? z#X@q^%5`_z{MlO8_2j1bWsIb0t=t;qJ1Z($6<>A$({-h^_w?I$7*~V2N!XDjtyr>& zq80%myjfb$Gj$Qol4ui!=N!j>bpCeaDe#I+X80|jxBj%9ams3YKuK61CH>z67GL>e zvDRd4vf2KF*D|xwD^cnixQ{zAjLi{AJF^t|UTf*S9pSaZk?H zRA7N&jAj55zAHllomZD{?mdSbCr8{$FoY+mq=V{rV4g!r^>rll*TZCUoFFOfO(@wjb4E%X~# z5c&8x5B-TbvX7Oh?b-?|0STzY$T0q+bn#`JFZ$~Nj2>Gn-vWNQaHX+f=M5>9 zSV~&$kUaMUva8e`FZ`gAQE>t2fAxF97H-AIatOqzR?A%Tze)vRRDY&Vd7s9Ideh&|$XJ1d<6r@%{ftjvbS87XD^`h|# zU6c0`J_w3DuQ+`IbTOVh^mjaV4Rl@^8=Rl9Uljgu@OL&$c4{;2D4W8VwpQ3ul2UWO z$nZW{5#ba4{%;&#;kL1^ugZUir}tz(yXceum-#gB>r4I}sWIWReV+6`#}$hpeIedS@d^4MFMH*+t^SVFe zf|L@sWmYc)Wl9b8)entmti8CN;(=iq+^-DPWMtH1Bb7u9%?>2oWcAsP(HviJm7T4# zL$&qgz7gjW8_ttJvf+fe7|7w901fn?dPlF>7{-fhkTbNU=b_3-w_*%jE3(wD{7kdm zX}~oOpt!r?IFR{~cXzqI2~}zUB|39Cwpn_n4bl^P!>)luP24IPfZKF~id)jn!|xe2<-=3)p&x?2>}D*UQkL^8H_ zz_)b&uk2~_eg;sz&Q}*(y?#VRiBqKb^x!>|gap@JdDuYYcH2LOl=<}6o+-yH-Rv5t zQjstJ&4_yS=Bxh)>KZkU<;zrD!Sh{V)iv6>zSW0q=CIWnF~u?w#6GcN(ef_6g797N zsvgC$+sX}~D8YaY#aFZf1(wz8krb?jg!7Ia)_cKQ){eKYGq)T!(GN%gKcvJ4q_sHr6Zx${$tZY`<-4DiXMxIAq2a?MdZPlLj`<$~CP{F+ zmAWM8Q}Li)4FT?|o8a44_eTpr(;jiv`F*25zrELidhhz>Ne=4|-shbRT#-<%j`*3W z%zpW)>l&2WSpB^k6SUbZkKq)NvvcRhtjlXrNY1#at4z#e_8p6B1&UH!d)MTH*)6591Z2?AdyvKx$PF zoi%D;f;geP2Hi7nJXQZbH3D=ixMT5(473TO3?#s?Mdgm+;P#5c5x}n$-p!nN+4UpN z$wy>8edNAO8L+qe5Xsh5q1(O>KQM5+zFr@FF+#ndRgZ}JD;vYtyfM#M_3O)2-!Kw& zS3J~@M&P-~M!|axv*cY-f5X=O zy@R`6O&t=L_NI&Unf|%7mK^V+j}a03;lE_zH6(!`wAWBUq%kDE@)SugS0KN}gD zb>**7a47|a_Q!v5nHQNczxfQFnUK4jSA+?WGQYMQ89u9_z-bluw=G)k?snbnY4f;S z89t2VVyWqdya_ieyMIYU+{*GFv8ePXdU27?mVp3853@YI3pc)(3I2Xlw+;@7*|G`F z!Ppg?dfGW0&ALpHHX!EGUTp-6B20v>f`R^S7w9Lu%axl z!LnJ=onI7wmz>8S4V7Ks>i;`!juN3O5OS@2Y&eb!BT;mX(00`4FVYHC#9$5;F|bk6GKAi zvVqqibk52bN?>I(0&ZiGIK8$d57-iM5sF&tAWAOj zF{r?qI>B%6fw`grC|m4lz^e`FRWUOyGzz+VV}omsJzwtDHwZ&TQ=igy%VyE7kN}RN zZr!~22;>y~9x5D2|5H87pXM_hs1Uvh?S>%=!d@Ed&(a1;vL5et|` zA*QMfF9GC(P&mEWe0cqvvxbn5AE&WlV%n`)pIW-5bqh$cQ}Ydi(>LsSxiUG5o|6vv zWXtlsyT16<4dYhNlN-+%v8@ays=}1fXD6ct(kyGwblt6`GJc`cS1fw&NfF!KuDwjd z`Fb<{;}-cZ%g0p#d6?(~dFLWW3S@wmi4X>fCE_Yk5VIfh-xM3lFVeAY0OlhXrC2)! zh|Syh_%GcKCBFICGuk%kYUIj^3+VwLbYqn=9sz&}7IZqBW6eX`cb0!vHD6t`;7ixo zxwusb$djO!yc)Q2)>2~xLhT;3p@3dszm&YGvgd!p@5R|!;|PkgAY_cxOgxFVM)_rD`1N|QEo#g!QJv~4y2<|(+2 zQM$MWCMak>$DLfiK3L^!azPay344Bia+0nURiR!WcyV{Jm^kekg}?5E^sZsb$5ms~iThQk4YJjjmBpNPZ*AiI`V zhpExvROt_EcA1a(WeKN?<*y`DfVk`P=;Lei*>CJnL2Y>c7zMG2<1F2FzU3;53!pYm^eHqpfvOZJ(d7)Y7E_ zvU9Avi{m^cd8Gm^W7w4zApswGov3JXF&flrRdMOYt9ZHM(aj2-IxGR=BNu)sBNvksRj>-k82$0OHY(}-zK8=2o0kd6?6x4?S6U&VpNpE|_oSooLiK-_jpajDr@ z7=JYh9i;tp6-BAd$FqlVMrl0DumRF$M6aoJ5=W>%FXiM~&LtoH^*vcWD{mgSJ#-$s z-9ID$CVC#jCcJZ`Y3OqA(uDa!L*5YpP_gf!uIDFu5^syfXwkGrqAr~|sk38YPLQ}g$bvIMj$Z(6L_{1;X0L zzesMo9JwR~1e#ky8Hfuf;B4}n9^|>nstAOy|G^E>(BaQI&1NAcZ1V!7P>2$ z@MRhce?WC0TnXidZQ3Np;O6wiuxb75KaPpM*}2tQj2A@2f|P!R$ok&7(~U4F3Tq(6 z#Qftj_*pipN9QXw5R=9F`YD`47B$U7M0z^#-Ow3&HozjxJ>ji(#un0df^p6%J7;~| zVOR&<`{_XHua2?Zo5=4ljp?x9hv9**%ImFb&B$+rTokoSGK4M;6B;w_dR|avbC%b< zHdXU&dRSQ2?f*~)#W?%NJLX6Flukz*de-T^U$3Ct_ z(tx(^25xN`2nR+TigRJuyHCpTt1-*0L%)&h9nAfZ1{_zq6g^ z2e~j7Hhs3FwUv)-YANq4iZK-OEHnCN}}> z`v@8bcBuN^COwq)RS~Yn_J{CFWm3Q)V^^_}-F8SiSG7$U1Hh3C)Kw~ZTLYen)-~d= zz(;4K4kr~EU$NT=)|Hh7mIh#u;-y($N`i6#FaVQ{IrCP1@Dlqk%V|5x<3D1na&sO3 z?xwEBgzpma1}GI9Pt+3Qza@k}Bn?rxM`^OtUz0Viy3SP@d^s|VvG*KO7g_IooN$aq z@U|bbJBYk&5nFbOO*uJ9r6SanCJ8`7p&5t1hBqFOP&f_O6$uhwdOyFe>WzLrPcnF3 ziE&vyvZ>1t5_@*J8rQ#h95o%%$QhpCELEK`P%X(K@ja^eUE+mQiRo%Q$9wpyFVJFfcPUf%3wf%ZvOlYXtVubY6$R(hsIF6EEt%XTm^2HvJ z>;iVn!;{YQ%pso%$?!gCXziR~U-8#1Pb=d`G#9Nn&&RZ18v0zN_<3!eblgrGQu&p> z^e!)^8SIpo=Q8vz=dG3N6%K8ahzdP7!zwS2Z2H$f%Xjq>k8HOed^f)e1oSY;XI6hA zQ8zyr5)Awj69|_1D{ZE7qQsPw4VIctza|#&*5E=?N6O_>pHyOCl5uhlT%j{9qt3XM zcEw19>G&LZM4X=RQ{EY3HXMjX#PBr!+~%LpKW%It_ugBtJ~lXzwM zcrf|oPkhMG^He-xq`}$llm4OYQgF9gmD5%-A?@e2&t^U6TTZLj-aA=7g9GdU#}Ron z`PRVI&ptbut0I?Oj|@Muh*o|u<)o^VRN?j7-N0yxXSAwd^ZX{n(ut>YL>yFN_SnW z=~x`MRLf9Mlc1GQ=TXxw3XDrG@C`xg4v$dTu4a^cznE+uuNaKSA!g98P@S-Pj2DZH zrs79u`)qkDa{g9-fEqvL8BH|- zUMh+iBBuPeh^zGGy4J`P)~DzVPu3NWk?5VHv~;hr_C*I_=aWjA_mA0gK@6qu>+uN9 zu`x};1O;P;{>KXt?dm(LWU;$r&aOvN)Q+Gvp)WVMD)Efmer_DfbRMiY`gXs5u`BHU zIF=`arhXF~!a)>%N<$EefW0H%FNTEcrTWJrPiR82A{a1wZn*ZTk z#{F2ITUeOWXHyn8AwdS4&dwvBZ5hf=+slvv4Ln8SspZk24#5`#VieJ_n`2~aELZ)r zth)AF-KUko3d$o43md-?t9Loe?Y>tXZNB-XUgmeiaJCnd;jh8$wKzFB`4*s~<5x@{ zY^Ld0B=}I0^I25W+i->PH#q;J10efH0U<9yrh-Y{n2r?6g|=oU4z35PlO5nCPW_S{ zpvH@Un2~=UyvfzjWgi2wf05UNC^DhrG6Hor{x!3$0upfJvc zqQp!(0kDvxA|M~LL3l<4pm1Y(3X0xCdzrlDoP$OEmw)2WV~+ggJ#nMG$55@VL$l|} z@p7qx&feh_Mp-VH|JT2D7Kz>fDLKa-J_m!lZ5w;fKdT*^msR!5x2%5WLxP#k^WINi zGAo3d%{v<)Hl}YU1B(NU`r$PaGc9#|R4>nZE&Lum^up%+{vEJ;uT7wddd$?%v51gi zC9;KT+J#SO_pXqVIWc2FN;5R9*0y=j@MTPFpP>{THv!Ez%bq(wc7`($+eMEtWt4hu zJw1HB|IEf7tXo?%-zy+4n2%<&hUTC7^u0H>6%D=SrK8!%BpC^R>9`UQpjf!DC|h}r z`MHE*@Yydu{GjrDN>k-d!3T6=tZA}0otN3X54VVRY1ugvKK)yULnTygYx~)H_w+Bn z7Xrs}ji&s(R22nQ%Y{oSyG>m88p7{nNhSGmyBHU7Pp65xvq{gf?6GULS?&bBWSeNe zw;9ze`g}ScW8i4dyg&CpKZx4W`So1Bx1#zn$&tpDhr@z-%rFhz7MMyhwRtnCq$y9! zNRaZm{k){%oOI?d-NIYKj)=UWrbCK6nJI3RBJ^9?jdUW6XS?3;=gTB+4?~Tvh z_bMM_yDAr-%V2!(m%v0h3)5c_vV5-l0fIJFiT^4~kuo@P1ic&Bzl+8|OGG)dN&@SE`INzG(+Y zm2MLpq_T)#y*!-zBVci*pi_I>zPcw+)v=p~i{t_6TFto0Df2g*k5HGJ8>Q6O!()#} zRXq7Ldk_;9Q<0i^JXU#Nz_W|1G#6w~0f|gfc^_1|c&5IS$*U3Vg5w${-H>8`*Oz$^ z$tL_TkdoNoX#IN!{T|}9S`#xnnPiF`7UFTbBk5@0Gxq78S!4ivN8zItQk;t(e;DKJUJ zMF_N#1witH$vk|7#75+U(4jf~!IvWD1ce$#`MR(!HGpi~Cyf5M4=Mz#5+3NqQ{!4d z@$Kj$s48VnZVe7&loClKgsnf@78ycqdXgW+0TpM=vef_wGZWzBYjs$Sbjulf%}%)S zH3+SbJhQiJ6m=j>P+?_!cAj%bh8KZ``Gqj#?YBL9 zyno7Sy0@u96tVk0om^9qncV!ExeA;x4*pwjFY~zKvhA*&l*>Rv>H?LlIHJ^h6LVnkFnLZ-Kdh2>!qT$6AVGe zHCerzNa91(YVt1khX=OX={e?z0v9;=uIPDr%0_4+s1w=lbais_ytmL5_<|U4d>(o% zur*k8@8JV@!6;%(MjXgWbb-_(VlC9P1R+sIvTz}pix7x0o&pr`^)pATwFdx_OawRG zbVd&*djrGkNB5EdM5Q0lOR~#`JQHl?rE439aZA_?0K`LO4QU*W0NAp3Vy0!{z+brl z1~TR`e;|)1F32cKjly;kR~kT+toYd&qHY}u<-czyp=$wo$o=^>go>#weulSo;iPj`1C;MamqyVt8 zDt0ZcPmH-%*j}}`k(Yi1u4SqtE>|KUNtGrd@c!7|Tn@9_PuV?OLLZ#`B)M^M;q_cX z^dz6=v*sJKe39gbM1hi!G#K27G0zaR=`es4R)kCqMuwV>0pO6R!8s0~^%ACJa92-x z4|&qq4&ygU$^Bd6_%EOjHg9o};;?bw7Q91(R;TIh0vr>i^I?FmuznbSu(&e!cL219 zg%FK};RxiB)^(Cd?}_l?=o**CeLKFfnyIvkyd0trE?-f|wf zzoH)_;CZ1_@b}|;ZUM(ae$I$xi-&0oht%h}oh;wmK3{Bikv0VJyW+Mew@AesLg0I) zVMuXC23y%v+=o%NYS$mU4}XY(OIOS(ucy?9Fhw5gN7sE@**mYx=Gt@XOtFc^NGVte z;T(S*&GkkOXpofoa4O>B>G8xl3lI?jrwmXcCRnZ2*H@CsT<=v_R~lH|mYv;iqxm|Y zi#mN4yK#jOiPsC)bYCWlI-8H>H2v2%cSj{G@)N-U7)n84(h-|bSEaY86KR>>xHFws zG}*lG=C5uL4~^|d>cH&hc1rgX!PQ&+5Ge=0MX41(9adJ>XCh0%7a*4jA3Ys695(Co zYTu)dU{={T_~i2~wg81H*6xqFrOs^*oF?eZwwI67k_n{Rf?M0KBh0-JN_R8N79NN> zKZ^?&|434BlzDETmaQ@=8pt%V_!&eeMz9NqQopNc6VDTrRr)v(D6I(lwBF(AUJWFp z2YxVSC^?uT!Q>BwnR=pFPd`D$iv#3Q;9mer`I>7Rb=VR8?#wn!G;gS-)LBqvaONNG zF09@4mydg1IGfc;$1uRCPmqh`v43b3F}P5ndt>~M^SaOr@1wrlAdEEYXqyP^Nihg2T4*(0U(T%Mg0qioq!Mvuat!vNUb!+3q)7tjoeDTEdmatBNpVOQ*HS8N96bU*2m;M_9+pJH?+?zLYOO%0= zT3{gk09ijlFT^oX83qC(BKgt-g}o_z>$4tvww|Au8y&32R_J3MTX7#^Byf*%S@ol; zkwR%DJ-QfD2XY194eu>`H~Abz9501nt}ImQ{NG+_bw~V~f1%ZTJ~ssaYI@=$8xYTQ zYhEpV`3CGTeG&{86pB2IlQ;(i)6gJgqm*{ZJF-P+$2t_=t5bgu2$-HlhX1h!V1xpH zL$*KKJqwbmaf4_mRD7hTsy--UMF|IcA!+{MMEk~1OY(jj1wFX1}>+NKRyBlJ3 zfWg^7RohkQ%f`(RB37j|9+oSLKsBU#;AQ^-KMS?C^CRY~!hdn-!?F$<68qVqmrXu4 z@HCfNh{Se~$dX#Jt)Of5L5GZE@2AG4(}b+fv?J1o&N1?;X3yXHbF240(Ziu5nMb_K zGQmK$8ZMRK(D#Qo-lH{-8LFfFM+>;3{)@CngY`du{zQlW=Su9hFnsi3)vkF+m@)c( zDkfD1!I1Ds_CPWkXt0Z>V9SAfJf zTFHFL09)x1$h>KW`-oVdd}J`31;PD2Mb^6~ZByDBw?`}W4+=vniJ)y=Xrx9)^@GF_ zj_sX+t@qff?vwZYMqND`J!+PY|9-Ml6h-Kyeth{73%45R^}6rp38WSGRf)Wyvw_CP zrpncjtfp`7E50WOULg$5+aFz{;ig>b$s1BE!7&syW zL^ox{W9XB=I&REu|1JY&8v$m%EmI_IlJXmL972BTE&jyxXo!u$j~P8FReWg`9O1Nc zFIlL}ulK0f*8LxOyn6?N7OPsFW`9jjTP$$j`e!}9jPH-)^jo_NXUy%W-Z0O9Ux)V3I-aVReOXr{DLOA(`u*8GeHyMy=Y-^j z8f|acC0uUf@=S|@itAuM1m_8YU_1^uYXu!=KlmQDV-D^sblOf2!yKBOd6QY(nOQC^ z+uo-`kwXG*mN+>>v5RaMo^y7xyvAxg(i=OD)MMP4g>J_sG*3i4`pvVd7X-~CsC(q` z7!tLlN~@7fA*FdA4y0)ZnNs%E+(U}MaL8aB2Oh9_hi3wL;%^fux*SayhgHi+&r$qw zhF$OGU!%`^+7|YkulXJntT+`)(9WARpPu z;*P8aL}IYqy!{^7{g-=U}Ao&s>>0Y5`(U$&IOAt4;pG>gyJf#5+ER*vG=D3FSH z)mN4rK}M(%-(=k+^FU-lg4k4%QLxr)~31maBhrk65_GAus56GSSVm=G0q znhF*3J*5T&X@9W5ipL2cDrsx}oJ84n)FI{2aeqJe%wIXziz{+VZ-R!CGn|F?tE-0# zntCTU$dsq3@a3n8R;z2T!|Q`S#H{~<)1QjQWxwrmGy2(rN@m6ABqLtI;zBc#_}aII zrXy;JQV9`PZ+loAgKN&TlOsZLeW5ua9CA-+@4yAiRKW zAfq|K`8pQ^OyG6>_kHiFwG-GocOd~Os(2xb%TJ$8sXCBh!I%nW#&Vwr43I!V;jslL zM%=Mf-1=w&Sg*suLui7euSh8a)oM3HNnAKVjPUPCpdOnEsSn%96=0(VCRwN?zqQ$- z)AKlV)bKrV9TCgzmfKvtkErckLg#aXz&=H1ECoRlEs59 zhd0x}i+j0mab@vx`dWWOfZepavOkF2wbj#DQ)3*Cn~ppknzln{$&L-Xe^hoDUxrq# zI4Te8AI>}oeDkAV>`bU^;*7Npq4j|;6$a3+U!RwPJ`Pk`3XG2T6&ChrCNwjiA12f*K`=87Z@VC_KEP z{~_@4>pOZDn8_PCD_5OlHJe1z-=aENvbnwDAh1m$7D}SDl3odNwtOr=x!go~Zu}Nl zVd#H;D>EkAs{ZV7*U_{=Y zoR=IBEg||VS!WJIc&JTkwrOM{l=0|hrlZXuEZovGTm{zIS*i6@M=J<0%`a zzn70_6{c%r;;+KN+3;*;*<3Cf)>2m5Go);g66wd_8jg^s*nPiwlGw-cVs!4V^Ent9 zZ6TAJ!maLmbfdSPc%<8MVxS+#s38ShIRaV(G2f!GITl#UQdsX3-1_Q;NcGN2En-9w zdqvB(swS?&BF6@JnS0#*!%9X;q=SKXmjOxbxF=8TR7F>5f4$e{+C+n`kCo^Pm(w*O z@+P)a;xpEs0FegnyC1`3! z4KrJ_)Jtl(qhTC>}>CnLZ zADQvLLUhN?$Ob}017LLB=Gj?oJNod&bd@r3GRGQsumZhbwU6C2kR*2(1BV*TvfeY_ zrmJxwsTUb9-jq&XlA+*AUWws3tEbjeMAmGWim}yjryqtL@X47`*5fTjaBPo6Ab?BA z!I~9po}@#`1*-@RJ%{m4l~>S|EfvoddvA zQ6mNe7*S8A$C@kS613MyGwm3Xwyj)>I+Lt@Sou+$VF+aZMFaFHy{4^a7p#^{{ zR9`!99~6?GXg&Y2san0>sAdzryF0QuY1?Y3;}8l~X#qMXy$)@3{0QX~|NAIgZ+|em z5_~vma;4SCH|y_>OZiYS@YTs>XSiaW%_CbO=M^zSC@I~?s8a|?+B%Ejd|_0FCIinhlYyqFH}`EB&V76g1%KQ6s{Yl?{L%b9@>0|6lU(a@ zlRJpEcNYh@l|kFDt}6!|QmQh(Snpst+9uH8GV;CQ{zdlrzx5cy4<>!>zfU;U?t4_o zlXVcKxUe~4HScH!_ASFVR7!o_4MwZO0=|MOnNoKZzrjSYG`9^ULUN)vf@j1;$-mqB5<@HRbVY=EpZ~5p{P zqgn}#tT`}BEbdE)Cxa4(JP|6U5|_j_3j-#o?$YdAJfAsAprmJiKA71Y5|pI=olLa+ zH*LW}oAL7Vi%OHpvwYl=OdnZha2JI(o6&YWG5RZxsj%>#fsl@nnT{l%lOeIzL)q8p z*@VB^;(2xS;iypb{?zGUO2qH9tM&SL#mcPPHf1g`CCY>w&2qNnZ&o_TJ>WoL<@So% z@FlYU<^JlpO)%V8Sr#1oseO^FRbt7d#Z;`5cZxRKolVj zJS!-Q<_+#k1bA4{2s7PyVuD&Xm?8LIX|EcLq5Qk>D-*Q7(3YI7ml8dm1jwBNlX3xHI_;LI0H~gVT+{BLKMzYgk=hd!)0N3Xg0!A%E6u)i>xt42+97#_ZB0qC*WMk!o~h2o;_bJWXyJK+JC_6iRkucQBiq~j5 zdWcEYv~hf=_48GCk0UKpnGi_bKG<>@=YUp*pUeAa`EuJ{#nH!x7jpSuc6stc*Z=zS z^7*yq!RYhtdwth+ZYr%-`zti!?Ac!?VcnyU#9E&c4tou8U;=?_shk|RU$vepm%27o zP5{^FQy(J|uux6pw`>{XCRV#RkT@LUQ=K(9u|OF>r~s8T8Gct*n8NcWcnwb+@Mro) z+9UrxA&GL&8;Sfb=0+bpdL6ueKA<) zO|Wi$BdibOE$$&1i>}COGOPZ5i;dy4PrYE}*1-08O2$nHtA)Kl)YsnEmtOS|*u_}; zBp^VaQMUE($-kX8SyUdoH8)6I$)Zh%O%HzQs;*;RYsrh!HMRvTyVUFOwysTpc1|TN zhrl2815J@@KKA$57DcTYUsO6Z-Hj+X)xyTZOPE*)0^qVXzZ8*-!FZ@4LQ5ABA44GD zVEi35C+fceT|@%%|sKWs+UTgoIWDts%9!W zZ@)Vr3_LEcTUYp8ExBwbXkx^Un3VGG47p|L(FBjZ-52j!ZLWQ91M8k^^auX;I63bl zDsOos3%?$pwl>&m@y&=f$vu)OC9l@Cyzmn%$!U2cz^6!GR-SDinqTR)*!)Q18-}l` zldc1(r`8o|WVst(^GeYQQkN)aHvm5NOEOq!;SC~mM}~0-BEZdCF+e1NE%HALN?Hj7 z5d;EhxG1C%U`z>4LUdyRbR$L*7{mFk91ba58}WrZWL%4=M+pjV6U;;THF_HR2REjK zJ9T@$D9dfAfLLT_!L6}gNS#HmdE0$wl&lbkf;uwEcCP_o$)ZtGI9MKsV?I)5|FCey z-n{w!$IkLurQAOcouGu(M?9pijts$POY0VC9t$-tPAtX~&b(8oHHV*MNY}#E0lRQ= z%-v;Y+a!S6n$@Ycwp6^ozcuWA@N4liQjNQfowdvx8fhJ{8T{D0!M0=3!v8$KF7{Y-EK^qaXu{-Qeb#u zg1JZ!)^M_FiiHt7ezyzW&vb6fa+I`VSr$lAbXCab0rI(FQb0B%Lx^0pIH&yQLhc9% zM?j!Wp#}9SaX>nkta1fx1up^oHI0gz*0dL^f57g4yZ{nh?w^Ft;iG@sMEJS9#9F6x zGBFw+#ZcS#-JU%*Na=5C9AfZFt-uWA>I9{E;FYXGR_)oJdzrF2p9nA%G$r9; z%zNiymJwow9F2g$pRsX)bohD@Z90%~PE>v;bb!zMBeDbI?@Lyf8IE0v?u^sBP})eFO)%Q$_A(;d#-|qg^!G9x%9Xn ze=~(rY{@iV2%r%Ug(rkox;E`Rq1hcDO1-z+C|qrOnPMH=xa$n5c7Jnk7t{5BrghsI z8oR>ht9))>k5j(y?vS=XAgYEE6m~1SuW~1(@WKSx)k(+5enxR0OP&86ICdZ;lBY)pl&f~ z$TzZh8d!LUDfKxMnMw|AtT^MgGK*@H%0{8erc1CgIJi8JMRrRK7W>6(8z6~_DUrJG z{kvFOy+ByI6Rqlb_|uME=iMf~*u?mw` zr!t|Y5i~HziND1Nbbu5SAtLQn00-c$juL3fb1(`8RV^@8#n0*(4KI|#gz%ME?AtC& z0dW9Hv5F-}EO678vjY9vSXNYQ6RTW14+0CQ&Q^Y>J)=chIG$z7Q_BatV`DP=jx;u_TL-hx*EN1^jSpd({D8~06-rKq(%f@DyEmv(2JR7oO4L=qnbH_tiNYmQX|Nmr~4`xS$gkvlsA+%`M zo--w{OXUcFZ~4hkU{d+z9b2q#05omr@zCZjTjO$5N3)6!dlj5PtBC~~Oa)RmOrF$& zTX4i%>dC9IbA?%2!!Wi5IqV^$4G?b3P7e`MiR)e&NvN_C#FEjW}nSzgfYot!5wf%Dv-)-UQv(nuq zb0$xX-$hH6PRY=(4qBd83jQsHP|l-yfn8FIm~2s3HNg}A+omrCO}kVboIZ0Ef|;Rl zm2=B%pK`LPX)r#3qNHOa5X~M}`(E!K^7@8qQo6b;@gDs|$2r43Hc0Yp(?_J6MzBl{ z3BzUal3x>|OJ>Y|QGUJtwn?Jo6-11IRaIqwhSp9~?+bEzAR!8YSe>*5{0+ar`to|9 zcAfMhsLOr*pW^DzSlfPdSjXV8B| z%m1pDLkWXu?EE*GJ0gfZ!_8^6oBrO0bo+u9-$(n|BtD+ zV2dkivPK(kEHv)!?(Xi;xVuAe2n1_f1Hs*0f)m`Gpg|K{g1b9h-kERa&i)1GsXEWD zs=ZdN1+YkGr<0A$7axX}2dV`RGW_FL0|lpT%r>E>GmAh9Fku{ zU1eZFRAY1~j9h9N=m6-{Y1ZN;fQI2rI%Z990sAP09+frPFd`~GW>m#O(OuT-d2fj0cMO^AF8WV^k7c>X9AJn z8<9*ETG3gcg8HdxA8wa6gq~7WA+LHP@!pFkyElcz-?Nxotvd0i zAf%_`xi6=;u!Kxguc!c~al)ugsigAqPhW%eD?=VqSC!Gv|1Ipv;OWfkZBEq{Khvj~ zZZ{9VXsKPK;y=b*3J)Oi^mJ%7<;RFbT`^cmPRCzZWCAG-tMnA8P}X+PAT~CkEYbxO zbUxD$dkD@M#!B7hW6l%+5V?^41oP|MQD9cD9OY+*oVSnB(jz`}mYG;WYUgu$7kmaq z{se3W0b(D81uQTLdPwPa?E?Pc)o9-ZM>qk&5xK5q~XY2&N?^39os*hd}&0e+*4UkUmb&?O@V< z{EvD#_@-RCnt+K;$R=QqDWg_eG418<(sh22{`}RJUx0f-)a>!9e*I5@1e=?+yad+~ zSeOPc{E~YU6AeFwMNedReYHnPC&@0$@W*l_!#n_)%8+JGR?#wf*vF zy7R0J^S{xr{~A!rLZ`DK+K|IvKMk6l429X-_SICDek!m_!4`rwHHIQW^Gj%(@Tu9c z?_dD@XBU7iK@}epeHI z#pu^xLfjYXyFb-Fuf|@Jbf2CzntOcuQJD{nqD}&klf&XihJ63~3)P|Q z6A8)t%jL!6##3W0M)d(_t&j0%-NvhH7aQkF*0HV%@{rvAH=rI}J^_l3SRk|uem|5q z9u}ydg0K>gJQVptu0RJJiEBv|%B=vNBLNT&?Sco!^Zb5ssM~l{ELa<`;J%Psy^&EA zLHj=4g(hUK+fC7Bw@SDVCzH8TOb|!1VoRXVYt;?N)o^v$XXD0x z-{-s3!vN7A3@T_m#P@-KGQ510@--!O%T*Pt-;sUae#az3LnT7TkJe?=gVX{?af~fD zIOL*1qlx$-O}v<}eCl{?Vep8({ZzlkI(fB^~hq3K~VxBkP^d9rHvm< z4H4Rja;0}E!Teq`r}=SEaUyP{Q(yP^F&DNmo0|nocO%9YMW@&U1vhSG9G{#aBkzyf zoM*ZpxV!HRDKBbig#?!VytMTMllDAIR*zT&nyRb$%jh{w@1E$B0ZEm^%;A#ra*z84 zSg)Z8p5k?u0@ixdxg5xEJxtPL2e=*(gHxqX_8FmUrH@3R}zdBH~}AA32OSN!{tkEx-&hvi^F=eFBZe=WM}{iI-1>i)<;u@Gpu z@~$(b?>qmP37wvAhNk~){Quq5R|Wpt9>^+-@0cE1UW3(2MOE75+~E3J$IyNY3DVWjnjTm+q^q0^aIjY-^Obpt4Kc>!T@z&2Ex52^o2HdMqBGO zw=U=!ngSWg`t?vz#Tjm^c|Z3YFz0pHt>>KkHL85Qw;HjGzZ>mBdwcOvtxNc=xijHm zv|~CAAQ$yWzt+wTOn|$FTzfyBIQu^jEx&Q%q5?KA`Y4yGjobVxArC+!aO|wd8D-(` zOLwF`0oLWO3p_CtUtt}B$&1e!)L=Lh=`fffc*-q0BDK~G3s;dcp(zQE8npJyy-^r-ao~`>iVU{$HOLBMvR+$DLIQk7}-6D+o z6+sVHCo(XpAm0$)X6nN-+^i09tAY(^&J`XIjE;h=z+d4Eie;ec<3jlS87bs5(t}hS zW%}R`Yq$&}IMY^OFIMhfKoSaExjZ@z0=n@x@o01@I$#xpR>_|~Z<5*V`%Z%QkE+Lx ze>$yptXTQoRsWNffvg8g5l+QQJhgLYo;cL|r%%5{xGFK2OM-(-|jDCX_i)>AU zjBM>MWa~29KCTMbn}}gGdQLHcoQnEcoYi~(ARa+RBTYX5Xn&=nDl(Kt507T!e9}a_ zIBam8%dF~tII?-Td}>pr5Ad2y4BKh;stw-_Vz3!i4x<)Um7s{1VVRh(DO0L~L;Pwj z5++t$?-1!$7NI94m%B6~hb{InQKEaOGaZLYbJi*8kmo-fw3RS5bo%!pr|seD*!q0= z@z3YDsY8OoXmEsD5)8IabH3IZQa!|(TfnBN(RzINdPVDh@kLP#7T?3KXg`GPCRc4l z&)Zs7ZoEBB_Xk4EwJ9yZSjgyVWgp%?;>cu%;*~Q%TN!6jxTgvVKFWpXMvtX~JAN$N zOl8t{dZ=AtKQbF6xnM4?Cx5AYHLwg`idQ8!SyWKr@RWeVQ(+_9rooZEI~iT5oW>qEzM=k0b1sb8O+;|gTFho7e8-FGEi%b#c&SA9Meb2D55 zCc)kbhxkLWBw#bnSMc}oYu|t94I9ln_eW#7D=$Mb3&gY%f9FCXfuB5&@dR}z^_qZ` zjp6ULJGa;CcQ&NETD3k?HA%cqZ#e}jnikJq2AsFGbl-rI<&QzIxCso*F73f)U}9>) zS5AHgTB4w0_;g&9%u@ z@ck4ibI!e-DoX1u|&%!`q$Q2+)BOOIXa!d*C@NxFs^Ii+!d<)zx$3nN0mjiYo zKw|(A54&(@pXbhnZEDY-N4oo5=N|-6;t{4I65Vor&qRFB-KUHlYHy7+=@m-C)FImw zg5v)OznsPpF4lO3$lU$Bo)UFGah@W0ZS$ZhCaRif|JM{=^ZLA@k?5|buEVObpkZb{ z#07yCQNc?|kqQ4+ZPIX*iJa%nxs+IQ8Pk~NvC?kufY#&`LU)X}y|N`S8V|iK2jL0alpu%QuxPB^c1V9ib>?IUZPWo(^z(O3;FHD?CNTxTC9&{Nv zvl-)AgIWoe0C)ICJW2X;*nEFKX-`rm`F*&a1TT^_6_{+113&g6dEO`d?fHvz6r7b% zB0Oy%zlDDI`*NFVnD!{e&4^xB?;6i*X$E;sI%PiB( zPn+5b(j`}tyDI$iC|(iaEw1DBj-}BWe_y-P=4y=n>u=dfpWMdvo zmE8vjkElkb)}a2ZplFU`URWLnyJeam2|fR3WJZE%KvdYiZ=#-dBYWK+l3UquaP@Os zdyivxH$O@S8jcHV#B~_dPL6TDz6T#i5a4q3NZXlvr?2pFjsSA<{MOzNH|TS+x!&ek z)45-^;dQ)v7n}?!f;5vH|$PdZzfbKJ!&}7)TfjUUB`b=2_d{}_#u}YAm!y+H%@KZ=(#jBVy(7*;;Ve#(y zzjmA}cxr_ywQmZIX);OPTFPO;C$X3`&d)G=S0W`fC;9SV=Pg3uMJJ__>uUv`u zOO{k0U@nL4_VYTQlM{;K&X=o>3t$Kr+xhbD|9)11s-!Ay3RMWoxX(|>1xZR_u+kEECfVut6iK_POqV!IT3UQEVv*t(pz+2nfKM?_2s zzin6>dMB1p=FS$D+j?q@hzLg-br5ZZB@~7B6K-dRdRXvT3oKeLGMgB=-kuEY==WP0 zUH!{C^>SKYHeS}w%!~jNZE_XA0nKvdMMxF>ncMHr-_I;?a~cklxK7ZFysrx9RQb17 zgCr5SNDLcixtA6h8t|_ZW`UfXk?^Edp)-s`QQsOi3*fL!)i|L0rYq|%HgB zuNbj$qyXqjZ*>)+Ph zHqm&&IqA?87v#Y*$*F^xb|#KLBaZ4n){#k}#5PDpJ(PMxv+NyeokyjT4e@itB@R78 zy(x>-rMF=`si_?e8cQ7_Nc}NJ-j~Wg<%;?Y)`?T9;QcJSTvIOh_sYur-9ZPPGYcre zi^U*mkr87)D2JEF<_?yn(y}8d6-NS@%cTPw|4LEV{B8K`X1njivQl?j`XQcu{n@bf zpuo=v>Tl*3Q(#NJWPND$tZrrhvVOlbo{-xg)m#B*%_9$$|NVDyB+q=*0j85nwVUxK zQ}g&`pO)X2wf52Qye=Q}2-(eb-P>wYUeBH4j_wx{v0RTdw*nwu`hVuo9K7J@#c#i3 zpm>(!m1`odsMCN-=&*-E-^rd>i$jnvHw zUK^zDYuQ$kxRVCU*hW6$gMAp#Aa-x;BI<9NM%qbUUhQYE9oJ%s?`F#m^dAQzd>Ch> z@Jn{|!Dju7RojFP?hoC^^A%o4hZL^eEjRwX%H`RVf8}i$d_ehglyFK8O>huCVq|}l zH!UIDC#qme43rxZnS$^XQCouTM`9`_Fyi$dy|ES+h7|yf#+79858Y@=p!VuR1cFk2 zZen0Qudapg=Ovz8x8X9KF4uwLzW2vv_ziYR?Nv5%Po!d^MwB+sO026WkCXYhM`6J` z=5*m6$9afUA^yJZXk+UwBLIaBg#LNON%-)a8EemDEFz@g>|rKPgkrqg^D%7$45%Ko9o#lC$iZEcLsNr9DROgpFL4VT6$sa!-KV$za#9~Ok=mfipTWTH*B2}dw zr;p)I_@7%?#3U#?Z7$z13%<(WFGygxAGd$31FE(kXCUUu-(u;rQ3h~p;Fv%T^Zd0xy$_-2 zT`eFIJypqi{=LO?9A&kM?6vr-L*sr>TUr$z`xBa6=438}- z)6E(ok)=jUI`=7R3RhLc{<&SH^$ErivQZnbU%r3tHFqE9yql^0fI~Z~H zz3`XjicNRh_&xo;^Sr+Fg7>!5!v=wPOv^sK5Z(=#5O?{Dc0QM%65bURk&?cJbi7Nv zzdiXIy^qrO2tPfR2|dV;q-}WM=OCH%Sflvf9A9@`eMyPDKmC#$PHFF4XwM)~Ql4tr z*YM4x%W@&Z~01f4RrT^vSoZx-HS@h|JFmRSmbD!tiU&+6ueB^i6W|J4N)mAoj=wsN?8jOm6wwf^Myq@m3 z{87|4y6NXS9Tn$0-4#7-$8jpwn&h*1K1b=>P*UASaMw#=mdWISKuEUsp_#bW?v26h+WVaY6Qb8AnfIgLMJ5}0eBBREiu^A%-~x-mHO}{ghs4@&?!ks*+U2?q z8!0e)^iiOR%AD1bY6JC>k-qNR&#}v^TH{lt=Xxypx{-dd_XU&gf4BfwE4ZpYW@iVDB)(Q2-&xiK zybk^p{OD}J)>(52tA2Rey*%n^qtLtMO5K-dpkiEnR#5X|8seM{8HkN&{;ce z6L-Fh4jufIi&wV5Y%`b?Wjb@U^d zy)lDsd97ZuBb=xD7wOE^tktyW`>{9jM0jG+c z?!_siepwd@-%ia)b2rEFZVfd|cszsoI$$PCjWXyrf6)E6rCK+O+T4pNjihNlk<*{5 zqXLKPBbJA_tdAl4N3AydDRYOLKkoPU2?<#Q3^(S>L^gCuXkF(GBk_G%Z^Q7uS>Oem zMtlviBub9{yjY+t&EGIpphc6$$~w82`tO&v6pIfBd|vd}$_x$CjRW8II!Vasm@E8o+^K2hwmdbY0{{`lG%_cg#L-=^CT~N7oj$O0qm9(o9Sc0c8}L zbtZk!>y$9Xvgx<8>wD2V2!Y@&-9P;_n}gVVoe(i;i%kABM&(Q%M>pZ{ySuE9hGSLs z?;CoH>e3LeN`qO8FoR+be*(bemN8~TrRO@R3~7Nom616D7c&SbodmWR%osv^+56xl zSnVr8u70tnm2hso$Ig)kh;#koBOOT?lJ6GE^7O>Ho+(&Xg8kRw^%*khu94TZQt7~? zv9>5L*+@VpV*z`c8%1XDtN%>6Jkr6l|0kyG`(E}AE?S#^B~#C3!}pU{{;S1}UxisU zZ_beS3j@+*YF?vT9Y{d0D#`o;uZdOKwDJ6X8v?0;dpWzcUhSK@tv$5nW@nh&PYKtI z*^do!8l5?wh-qW4<`GH@8AnB%f3z{KtW(Ygd#i^C_Gl1`57v0uNu@K3o&Ar9vIwcR zK~sipIt=;baorj!goOMg6!AXVQnIZs`EATz&H<`$YB=3(e<}A2rO;7nI%a0O8Wu+9 zO1eqrUs}nK+M0@ssq-2D_-O4gtZ=jrw0T*$Vkuo-}CdYr@WSPwUE@B zX@kmw^-=}zht2nghm!w#b6Ezq-OH%9zJ^1LjmjwU*=?p<`)j3u&ue=i~o=#N2G zpvY&OMEmSCk*BY&7VyQw!s2^z1wF!aIei?piqhy{1}!1;*fXCD4=y$KF1Dvy@?W*Y zu^Of^X=h&Cmvtq(zlDP@XEv-tyBCnx8gZ|w_?-yUvzMvy+Ryqw&(@UYJ4myK>e9K$ zu#NfSadB5@CwFAS z$7*q$cJB!lR!9i$Q$Aj@iqgdHw)eftk^nL>?`3B}53zgyl?Tqt*YNenbm*wSIxF56 z5dqT~$2m(Y_GODdkcn@8ea|9Y0x31Q9hT#n3t5be@My`c^%>SK6yn8j(CldAmc&^& zJvkXS3yeCdc`kdssy?K7{_mU)CO#KY-5KN|%2W>di1~3MmmtI;7yO~I<=wN@m}#Ty z{##sB5|?oY1k$igN=E9Ma8AcLl6E4Xm8g~lUeX*>n*tTh=w(T zHsktsH9zL5sw$79q+_@APHpoURj7ghl_)0R{r<{w>E0 z)V_~Bkh*RpWv26o+;dLxcjNcAZ$ngH_OJcymlgGNF!*B+2g9P}Pk$KDL`_J{;A2A%4N+)pK=R`I;m_OHLje_9BqLPL)PP!)h#**NAZ z{2L&r%O@R-sXZw9{sIkoOyTdFPI_1OCQfQGg+Ur5iMt!QN`Qcwk9RuSk-X;nXjzl5 z=C8xbX}eiR$Qg!F8j66)cyo%-$glhQEfV6%D?CmeguR=hc6@I)W_owkXtHAVL$PM} z?+r`Zno}79*HU9zY)LW2ZS$CH_!OtzL4X1_Hna5_n(v$oeR4E5zL!^%e%Rn&2_gHTEnfb1f}TA z5M(ZBrdWf*BEJu%Xg-uG6LOr!Rhd1X8HIca&LsNkT-szPv(Bl3Py%H2TsPBr^cZ{q|)SOIM{8;s}8q>0g6Cg5lh8_9jWN^KSBb`7GFiKts_KUQI5NR^oNn9 zO<3@+|Ik~m_QqdZ%hnHm-o<`p)N%YXU0!N|lYx>BQjr#SrZJ`Yr5o^GP~QLP*N~3t z*>$g85f2ga65CnD#_QzV{bVPn-3C2NRi&G&yEq+sPJ+~Sd@P8Ui?-d<-DB||GO5p& zyG_aN!8(HEd3w#bQ@W+(xwj_KJahNf?7x>XlW9l&&MzBBVdD&jWoO?MelcCr#DN%~ z(4(Oe@vf@Y2TM%aoaQFv%kCeG@3y{v@4h^V>G^8;?RX(VO}>K4I*O8uox6Tdj%%la zt;gQ(CgXDd)bF(Y(r7m0p8X53t08}R|GK4mz0Pj?u3hr)9-jR1FNTduPpx8=%_KZ? zVe!p438xdR}%UAPzIJR-o|$Bl_05?;l~+ z(Fl&FD{@p&6>2X_neOoux{}BTwbi9^y8ruZldAt^FDx_p7 zwhVv6VMKla!FaLV0GDdTOMyzoHZ<%gcn?E{%uM9`XJx;6-lhBg#Pe7v?Z%lm)A#8} zgMcgnu?>WQZphL|;XAx4eWd~N=U!&C<5WlA7E~e;%Wj97Nj>uLqVUAb0;kf-vLdkC zZZ){&8gO^Y|3La){nl}t@P7HW(&f4@N)6X&DD659+#AmS;(HuY z7{iE#OzmkZ0m)$ZZ2&NKVh_to>*@%((bxEORxnQvq4(p@tFY4aIO zaRp1}5;$w+j&Z)~=qRA2SXLukgAn+pQ7Quyz`^Vv&|)gH@fvYlB+trHo_(`w@L{Uj z?6WlPzHd~2Y}!?2tD$kQ*!W$u*{OQlBKG<#!t8JQY(83??R#usPZ5kQH2J)y7SSL- zdRP>Yj)5&kjsVd!G}KZ?4TL3tu8s(z2;{%Sl66)&Fv8ESVyJboBJOyQXhzBUa?beG ze|@Ee$>itDCjXqt+pZ0%4@+#NiXD3~+DvkC@;fa{`sFX==~wF`{_3Z=iD#aSZwovQ zC)h5~XkxK5O7J3=>pdN7${z#PvYpQN2L@)@L7Wueaql2F4U?btu<=dDh+d3Y%OoVa9q|Ypwe(k zO_yLk866N0BMZ6^g$gE6dszAg4^1$Z(1XTLfwBc<%_d7n90+S4$cx+0NDk%<^&nt1)kvQgY>@dF1%#gHKdhS>F?cHW$s@kaO$_MRdxuk(4xygLhjX7C)X!1Y2^FJ`I z3~SGK-Mrjy26cUq^BqXtR_jeWV!$@%wW|H-^V)Rh!>`Hfmd_Ga)4AP>_f8Y7>cjHl z!P8o1!1^Z{n8E&Vn3$4SaZKlYAb`67ZMX-J49f<+2NhO<5Cx0#;(T!gH48w)gaXbg zp(6DMk2&{+f$R~%fv{woVwQ!#Y6ZnV?T&)CYBhBpOSvbCF=;|>zq(XUx{ktH1WSr? z69oY3>gxJbjBhma>yt9UBg5H$xNbssYMIBZW;$Pu5*mo4h{;v36oNu9rPb;3n+#-e zJ}sFYZd-X7f8Z~Fn`kxk2`D4b-g$pB?X(YoJxjR)k?MggCj!4y_CdZ+p5v*I$L+H9 zw^0S?T<)FNN@hl#xH>~>L%R%j88$btCrLg?LW-qt{Z(zB#E40CLQeJ}WOvEtdw}bF zWPq=lFCRmEDX@YPzN84c@B$IjP6J+Q_pSB{2Dh%wfM39=zcH=#)tAb|0AV50oWz3$ zOI=Ql(r6(~EjZ+~LIJCiM-b;p+{xGsDYI9;i|4<4B! zT+EKUKu}%k8(=*L8=YD1la$DWmg!(~;*ni^qEYH}U+WkvO>t0kpS*p)l0Qg8bjPtu zWzqNcH)I>1Z%Uzx+M+}{lqUYRzDZG72N7l9m=7vKc(>n!qvbB)tlV{97?1HueI91! zH1R!SB)tFJlGzROx5l44u@&&7%Tc*rfsv5ei#$R02|5}ds1}6Q_XZEt0%F6#$#}cM z9`=X(duxVJFkpH2BV&fXQLl45SKbvfDjIM%*y!x;!TRLTLA|0&O~~*>U};_K`+cb0O0;8|&IqOX9DC z85VuwE5b~ryKk~q^Ru=& zaMx)Y-j_dk8AZ=tx9>=vo_~(>%9h*9vfIcBnLhIEXtBOW|I z{kk8PXRA`H_3AGVmrTwFk4VZ77h_bkK0@z#l%J4rBo|pk4;P3SBk`t^59~4fjcp38 zL4X3ljub2BqXf`W6o&-K^d1}#4Pr?|<3gd3(NT~AY*Ys609ZF4`oI6+Kp?&n3`;Od zak==!CJy zrpu<@P9`%FVJAE8ZIh!kQQ*;Sy$d9i#7#^~OB;!ozs}U^Hv25MmTjoy@zOI#ORe4e zq8w(8)T~_;Mp%gpJ#%nBO@mI))eZ3uTO5xBYA@- z>^8h(p&}GNRh&BcvzFy?e;;zc3^UH-Y`z=#+qI*TfwHStNR#MWevuvMA_N}_CP)dq z!wFCTom!*sJ!awFojMho zJP#G0m^izw>pDjT-Fw46qKf~Rk+d-s9}1=><{)@~ zw?iv!q9P&WyqcLw7{G~|9>Bd~bEP0Z(U>5Eg>oKkcHB8W&U|^|CUknNTRF%=+7NLu z?Xi1iz(GO;q(>ssBW8#dMY{S|x4F^gbbR?LLcD;MW>b-ZDb!BHtRh# z$NILjZ(?ki^U++!eC&=h)YvZlJBz*KU0ZMI9#~cpjU*36Tn^HjevMGm(}>k}ta6496mJnuO$EGxDvo9X z%sp#&2AiFee#G?RVcAFp%L#7*qp}Dpv{J?vZw>TyQj(3|Tu)=Tomsm$S4{Q#uj@sFf_$Vln>axgAiq2f^5e(b1F;AoUvkVaUa zT{6{&X`|uF)LK(_ap9wvbC2g~#=Y>Rn*itk#Q$H5P3-dR-$s#Z|G@}DHUBWSZ6Nk zlyR0@xvkGRw_fMvJkM7l@5j+=Hc5N#izMiwNT|64(qgS^+QuocW01K}W#@s*$X6AT zDJr4SXKd>t^UE40DETiUU2^Ks0H(@w8Tkm>O5SI~-E822lr#|8*#d|M>-*~$(F%!8 zj0vRcK9qL9ET%mfNBTH3Zb@sw;~UaS3%^d{HI8pD3NTBYMsrfDsUYgQDz&!ztP`!` zW;ZwIgSOb|j9c8EsRueoG|mdNj;AXW_23(;EV$3_v*V8Y9(W7!!iLIkaM(XyAzG48 zTwCER28&S@m-AJYOG7UJqd%R#_P50}=!kH>hkrLPIr-D%YJd6$lYDoIBoeiiBStRL z$&<~#W4Jp1@AnK{$kYA$MHc&rvyu&XT}l5)Yfc=0uuEg>I8tk;f?7|-%0 zq^Hj?5)Xt#1WTcUN6&LW&|%Ph5LO~% zxu~LKtvVDef2}O9en=*~-mGzM)cmMa%BiQXfFYx%F4<+boR7Q~xIgLdujF=7LzI)F zf)+0a=F8-RP3J3Oh}M_B?IPo@abK2TYe9|-KPq-=I87Om`-#I3i2s94oai92FD0p) z>_D(aSYUa$l1579C#TcI1-0kILZY4@F)L1B4*fV9!epUoV_ACCY zch0Li{9-7=!1$WxK_x2iTEwQj{Zu^0 z=4yp+e^t4wC@p^xdsgALe}osn;{X?6pqGn>sfNO8VpOtWJt?A0!PSc-6mkZ}A;HLb zBNfU?5do0$L$ThW23R2MnxYeBn|Rc6q*Mm5ahjg+KjS;m;7wtL`gi6&$eco(**HmE z05qJH{mr=avw~$)5V;ayVTLG7uG|dJ4|^k)ty=6D!H_b$XxMBvP<}Og(slUbzqxnx z%yF_)qHj5vQ~al6<%eY3uf9qg{9s9vT!~n4bR=6|+0D^0FOy;FN{{Etyr^dlHm|Zu z*B1Q*PgEjomwka6Xs}!pPVGdR(7xpTQgTtq?e4(;P%eNArPI^?ro&;n<;z;T@!#$b z(bV(xUFu)GYPOZ|m~@D;>XeDxMy(fDXf*ux$csT;>F}CF0 zqI7o#f4=Idfi;Ds=-?wM*n{91g-&t>G0}p8TtxmH$^^lXlkbv{6eF6csI4wVV1SUQ z(*>p`@}bi=?^R%+=$OLMLOB3fP+Fj)r#qj?5XVk>5WFy(u_E7{-MYI>6Aw`mk^US zGtUPD3o^tT@zXS$_g{22`1ULRDh?Na6bSY5YUc;f+TW6y^`0S86q?RtTgYH)=@|F* z0t?z2qt?ooqovf?SF)8xv&YJ;`1^^}G+5!U1m5l`WB--a~e zIPYe*zxjjC)iJB1NjbKgo!%FmKn)AKZVD~wFF9XdIj?nlbo=PB*d)Y~)pZfQzu)N{ zqNQ16k+w5RRR9wv6RFE?p^#tc0s_HvhUa*kL#fdLX#vWnfe5HV4L#GKVNw*_e!S@G z3V;HV6d6tv)Ih1=q^&s@IU+Wca37c%8=gw~F9iU^io^{Q>cZyDp-EtA%P0-NECH~E zmGL^$u)(0#nLmo9!vMVt`uu>Pkg$+qF}S^`#T3V{t?bRWggonR>y)h7nN#`yFAWrU zek&-%-YXvWtA8{;-3y;4v$mZ7LAnf|4E~HbfwHYEA1)<8%i#L$b6Sn7zau6NtM1do z;K*L77L>X^?6k5_b-_|(fhwc9m19neA!71+ls6PMmGm~=2bX!Hspk{nl4I+2i2eA2 zd#a~ii_ZYtya#kSMnthbA7=Uzm?4Hl+ly_bLT7q-V3LE9xbJ&h3a@hWTZ>8(oC$#g z_gaV1da1iC))!|DGFg@qRG$-dFO~%`!*bf==d-6`;M@C9Y&TLk24sE&$k;v=a*ogocsW#br+y-*8B*)Ae9` zct(Nu(O{LL04QxzryIrv(wXJ9X`c$Z?XS06Uf&V3#`$}ww38_O7hjluM1--MzYnn6 zyF!{`XY@FaXPYp<*;-R%eG zzePKagH!~n=v6QKa8zZatR+F6L`4*Pg+QbbhR*NkR-Bergf%`kTK5jd-eo%ozjI#= zTHa3!x_r^Kw4*X2TI)<{P$;7K%0_u{$ritngdhmrojfEl5f6P&kXhl3_5dYH)o4 z8J+Y_8sa>9B>~n;igZN)^7F0?7**Ub9b6_32eL-$Cp5JOse$1X5V$FV$p6{E-3K-T z!QxT~B@xm?2LKEZvH%Q{Z86we%s*0$48YwRTqGfh4;2}1iXD0d>%tUH1>T6k0$W7F zM*uY748ZXa-;`G=VzoxAPtJcQI`ZSYK;|s9rrPOz3J>x^kv`GwSH7iYP)h49m&AW zZL%9h9N?8BXKg+Ygf65~nyB)|AX`YJo2!>}GadiLGf&dFA7VRw#C_Zo9NcTg39lGA zn6Cmvw5rM0*c4-4X>yABXq~##;x_9g^WNQiG`&u^y8Z9ttS4h7Laf4u%~Km^p&|h^ z$<3#Zms!Z;JvXaa%wJI4wI4br6}6G7mWN@7_>ss1D{a_)1&^UtI*d9{h-VGY8@x&y zi>(rf)*;h{3suY7cf{Gr9dfa-TiEvbLE?-HFg3c>s<7k+@@5p8s*x>V3^6HN@@Nxf zGn_%FNfeh*IT=*x=Uk*raeq2L1#$|{KwvONVBit?`alw!v|6@qh)jaDDTogy9`+TA zEc6@!77WItfDa`Pf+ENUDnLmyc_T;De^N0k2q4!Yn%p!av8*?Tg2fV6j|JRBX(em% zF|#V-)UM4u&yE;(3FfH%cbB!BZgX)uXZ4qtb~)dm?3aJpjRT(dRaDaWaw?^9qcru7 zDZUi67VD={G4u6A330>cFP|n!8clp(Bho~!wY8R$=tn4E%7mx@Y&UnZSb)l^Wy7U* z4f<`#XQnJI1se4*Kmum@EUioo2fBdAaN@$sRQJK<(#lQV)di%geJFmVwEg|bE6>+X z`n}7bIi;|)@$30Q6_5gfAe3rro^#^_op+@d^U2Z2?<6W~PEF{G?)&$pi#}u(U2d1& zUg1AKvEx7**lKXnrgB2j4G+}ZIUJL&KN?LkpII?Y3=IR6MBcxvx9z@^ZG8BNx?FDH z8mbstSq7NQ=M$vu9@tqCcDYDZBK5pIoYnslkHAExA(jE zyT4)M+0R;Q?{(~>x_xJi4!DOG|0qz!!DP_w zT?zn^%0_5RiW}n+0l<|CSU?{)QhY9lmkqOq#*xJic@H5)et?co!NqQ)mn5err|^a; zTtpN_Iqb1nJ)narfF2W9-#MOaFWSA@mCM2?nXlmIbuu)lt?baK{c_V_{NBNu%V9P> zcGd0g=c!^-{{Ma~X3>SM)3Z1{%9McWt`p!Vj&hTq<@fibyw*+0C*VaoGJ{=|C8Z0I zP`E@D+jX;JJ+E27Zsw81p`<(0xtiU4e6ZnkT?Z48w&~dpAu8dr>k%9l&r7^S67%m+ z^3U;*IG{fd#DK5J^c39=}AW}s_LavOtPfwqH6L^?={6I|Ld3T{M5n99~{jlnM zJZ2^ItRgz_WJn)$M+#Ff|Y&DiaGXK~^>@ zvyW)8Y7UMf&^@+i>AusN0_`-s>TSK!O09)#lT!aorMvxFE z=Lnp<%Q-i{0vYrkeSCN>$1T)0MbXtE-iu!rqXdrF*t(ZAf z&REALBg}j-g}&-+c~@BGHy%U9LS7C^*h>Lv%=s&!Z3s6^x_$HD;MQll>u)^3jUxU_ zQ#?)J1F(_H%%AJCE(^^k43ARyJFIQUY?+eybba zzk*-E7jDh|>yKz?qQVJD#xkouE5B!H;&Z`$w&}MGUFF z|H^!P-B#20$)^R&L+Gql7~OtIgf#KRnc0QTIkmn5#n~7tEU#9{j0Wm{Dv23$*ktBv z@E~UJq4 z%5e|#*|8`sV{A?ICj3XMQ38y>AjU&L00u1@F~QoTbBt&Zw%qK#a%KrLAOET*h=Jqw z1tr_Nw&VR9S%r>nYzKsDv2?6j=z1-$|La;^*VA6^rV`QL7N{xddXY_8C~8Kan+uWq zxVZpub>Os=>C$t;Kq32Kt;(svWLL)FJuirfCrU*nlLM>Ap_P3wRh?3b9Jw|mDTs(R zuTm?XCEszOJHGcK{6@HgKWd_-+HgJhWrUz$fILxEUYcGZv`;^(W{?|vzo5PG^5PP| zsB<+mqDS_;LPP$JRj$wXW6PDv!_J{Esy>k%KAj=ZmBC6T3&{1uppl(qvlEO3s4p`u z&6#|9b`WZ|UR$W*XR|E&))+jh2Q1H=*iDEu4|G0?D*~q=9B1(!kUYo}2(|sQMT-Y7 zpEiR%=9UiL&0eE-3-@lJw#61Jx(SZO?i3NTUQOM1u`>Ds8_In@pUqM&1P zU3@Ud-~dqo0pf$uF*eP>fih(1-~l#}8Y`Gcv@a8awlaxeKT4XsPlzux2i^?#ped@1 zHHnS7P4EvyYJY)G>YdCgf~{zncR$s=N+vl?Fs4#o@j9SbVt9vrR9_MjD{KPyb@+ZP zyW895p(DHQX|j6{!ni;G-FIrI^8c0=JHKO7tWocN)XL>xoRT&w+Bhbb8Y5Cu$oNAC zr;N1Aa>dtHJBz!~%gy}S8U5H~l&UTNJrK5jYxm>EZnUA>niV@|$m7ngd|c&fnzsF{ zt3(#BT=46o_1R-C*{excyn*eC-@UaQHk6q`X}{F(e|dxn#@cDYBh?NAyfG(d&-o9j z0({r!b^hsc&WF9%!A}D?N5ULuZ&GIqiJJ+n7NM!m?9>Yg)D7t@CG49vfj!>OjVoQx z6Y+|~DEVIRE<_@}c2^Lsa##RXn05pVg!~wCtc~z>cjNRak*mpv)}EU;l+Q3p(Ld~V zcXF?_Rg{bJQ9-zNEI`at4x>derU$e$d%jUKhuX4PlWtXz8&euAwf4y%?jzHQdSVhg zL((&11Tgr#3B^dar63eTAnN$*4DHp~K|v$k1Q5aNxFgbL{7HcP^E$ys{st?F2TyRI z8b?Z!@$c8=B`rIj&^%nAWCm72$+_!n6_4hS5kMP}06O72EPxVg)+Y7)Im2GN6_|pN z42%e<{@9sWL9QiqgDQ}YB`k&lz2Bd`r^qE6alHP!(-dy)HwjH(=qO6HcWn?$lRrLI z^Vy(g22by;Y+gT%;4WL$4Uff5|Mu1=~;=naW^Qlbyp`1g{xDg16m zaBuWucX{(ci~qU)_SKxmj8576Zoj>}u-Pk{CJV!nVypp4oDws!bT~$@$M<14<#u*E z?>zrz*nwHV_u@9y%IsXztT>r@ooZdFl6vC=R;Jyj4khMlFhuXpzsHcE7>;M7x5)PW zu4;RM%MUY~L}O78@pF11wZg-0mOD zre0#xyDk*aCaZPy|9_MFw(Yvbfv4~Ip+h93#DqpNsfaKRsXuuc(vY0stdN^bcl5c~ z@O_Ho?8<-dB0Boze2F*nreY!ka5Xr{Qj}JZXC#6(r@FAaKFrkNWX=Z< zsOy35v|^6F&%mMMx_tqcMc?!QeY}uj6f=UmyMc|PSkMaB%zG*6t8H3c`@gKtwEO(Y z{O^u4TmFCB-4t4!-q)P7sp8JWw8l{9|CS=XdaMUU8~%Quu42{KuM3$AHj|J68{f6C z93NjXRm?+E9Vbxyxr22XV+tl0L%>b*g=Fvu*GF|JQ^emfcf31bf0^NnP6!eeokxuE zyvPK0Rjv|zhk!=#pr?Hc>bl6JmB*;b3@A9Eia{u4uB!fKK!F2))_Z+@H(ovqAu4Ht zzC$oZ{KH%h_cr87x8KV#gcw2(RTb#Pi%MG*gPAWGCMd!1WEv5F9MC|)*QIHtqtpIA zD~5`Kx>P;-e@loAcltG(bup`wi~{%L>PnfEiMv=)ARDAdXp_qD z075r-|N8vrHgsj9`yLs4y$&z2mRz3udpG!{ zWnUWbJB>j_vr2a|;lvIkxNyVelJIedQ{=a}tPpWO0=o#i+rGbnRsL;8 z>u{#k_&gpiI~5cce;4};%4kJeW`hY8nII@a>no0#jxhj_zmW#&Pu3QNHcO8e%e)Es-}TX@m$R}jt!+-q+3O*j$?JaA zjMwgYsLLbn2&%kjcF6IXH7)kAc+>7~OX-QrT^vfbljq777z!}+@z?FZfBz`<%oeq) z-f4uPzBc8+6^D_*EU|$GM;o7Jg12i0H;2#R{f9%3qk(U#G+K}A5|j2+uFwytc)Mm~ ziQ>c*=ZQ&^af`vm>@f51Z*7)HD1z5J$)DcQpgKZc0+ERX9>3kbM}xjUW2Jvf|EiAH zB8MkKrmn~8x3v3v@c-D|Fv#z{{kQJ7apg2L#j`vE22;niKDbE0J(l6;;$W2Ay&-;+y%+cErsCJj>%DY7Obuk%SY(N;r z00nIk=}d@8n6k0NCgEkBF;#1s$K|j^wxr|dYBCWw)$2=5#6NPM%sGH!->+3j`8fRt zzRzXOcs_!sC&>Ovnqm?>nF@%`?DDh0UveO09|APp51GIEaB9eGuiFIWPNM%$nfLYVY*hw=zk*Bx$6Jx zVaV$!-v#~kQQcmZk^wI_E`{=fF@5YXC#=Sn$HW@^u?+)AeTMV~4^kh< z29aXD<0$9q&NaK9pKsW;zqI0eF^9LrWHD5?buE;9&z@`GUkCq)pM zm%CW#+cd%L36vt}Uo5o3#pv-R+a?MesW{;?BOpaOkQ__uQA=_h$Ds!{@%2Jg<%4nx z+2Jve2`(_dx~n*&K|yJ4!Bf=)$%p72d z+RSYStB|^#x9RgX8EfJ2A_Dyc=J;g@6MwI@AwWF>LblB(l|r=?B?7&{*#ZhaToMjNI=z$f*Uau@NTeSzXdPBl7(td}|KSKQdlh1(XZW!D^^UA|uEonn#E z-=Omium~E7U^S;h;IEd{e#t4=U>|o|?(U6-wPEF~K6b3(?%p24VmKrb_o|wXXK5p^ zJAt1c;ldM2>+ZFJM{aeS*B1gk!dMIC7Gb}#>?h@ceX55s(mLh0s~=rwZUBM;iCS>+jo`Xu zCn}(*51EewOM~qw(*>14L{Mt5A23?g*H^!VHI?JoHZi0+htC)%Vw@6rIgX7!1t-oH z4$X(Ckj7vkMTUy}H-HXOkD6v|U$sc4BtKP^8;?X$+MCpbN7Abf(>b|7QCktf$B}^| zYijxSbKl&0bk0)2virSeD!cVz>$*9dwe4amT}ZEP_`e}^*q=aW`&raqX3lME_WIgw zB#y*uBJiTK{0A}NA7fki!5VIL8%a7W^%L^sF^*$R)FYkQq$zIfXvFdA?*$=S(ohBl zLLKLg9u7p?>mD9Djd!(s?eC*H+dogXUaCJuUdNr=zgoARN2`=K8xGo)vbm#Nl%rdC zm<61H>;et!Or_G!${Bob$G+QsAb~5tTdaJa1(^61tNP)w2!Yxj&#MO`pQpU$8M`)q zGC}j@h3JxvG(BfZit?7$ap}f7Rx*ixH>TycOSE}_=U_USy}fS7zXy4tra08Y9H~G^ zxhQF>YBrM9nT0RC*4G?$hD{~^WlEKO&)m$%@sFQ}?>rF@A;dtRqr=5a`tU zo6!C2f15PBNST7BT!^`EvErPBg}rsD;)(ISf~qonA6sGmdA-eVsZ;FvzC0y>mNgta3)dDoHE!pW_UVO>_`4qYBf3z9@{&2MAI`$jyj6?su znFdeLdql_5Y+!M|gRpGbX>^Jsbtlin&OFoh2o-fQH*za(+Nh%L?YJ-bs%IR+cxG#p z%&v2BWo|9$2$kuC{*Pm4mAyi!#Y7r0s!JC77#d%tA>tPfpuS>KpnV|>xiNOPIyk=M zB~lrLoCSfvUZEnk81JpeI3qOoL`&|)iik+2jh~V+jEs|v z3oOJhu~V4R#P;#v=C&CaWqM3XjXBwZ;1Wj*_{lk#q=X?5LKlr<93~5>7BDs1$j60p zAh8F?yfW8wb8}B*WmIhUmVeaM>6pio;o2BHPC#Gjy}53)3bviI`k&@s3BEkgLbdPQgd~4<$m$@`SBAR!f8K`9g{B@ZDuujU*uoV>{D-{QsZy( z!b4_wOSJ8GK1LT$#$Ufz=0p0rNz~ioSVI90G_!dm^T?E*$NTRe z*1I!p#s-Pu;k4=B3f*SUv9{I?cX0m7f3Q|qsJ|c45qQkXbN%3`$8pXAucl$y>1c-? zo^;*yk1)i65HXacuWEdh~w-#dUj3)b`@@yQai`2&Z7kh$ZTE*T`zhjgE_)tJr%y&`RZqiVsfQIXdB;0cW?B~>&qqP#8GH8KcU8u;_W0@1|}9yTHqsCDXvhx~myO!hxwD%KgAR%ER^V)mEF&Bc<+qm{E!bMZvg4f$wW{G*irQAAWru< zhiQcY>{0Qt^O;J?h%zN{g_;SoK21LHDeVK zol611lem%mr{JL(pgY(glAav7OQuFyqbw~li59r+w}30T zt=THy?d8kG#y}D*H-C(C+BK&g+nk2>M8`<1)w+w{V+D@C=MY}+(w$jvdM}v7d!;o^ zNw39qNu2Xl^B!BNS*kRJe1H&^JEEx3*y~<(ZcQ@_=%s&g1RQsK5Q=w8&z*wcPEnT+ z#YEzSx%(A91wa&CJ(9^p4#$92uYcg6=4Ht2goi5LkH^z}sKlQQw*Hfz62J__+(;(_O=+43_f5eHk4QzbBQ9 z&}N*38}ytlW=NFsn3K3v-9IlGokT8xcD6h~7(E9vBrETe#rfSoL#bp0od)~(LVyzn&UkKx!8zG^`dJX@W zXiG+a2Fla>h_8)f0;4R|{TpXWFW;WWd!d}zgFh7C! zD+fG4&K;VO{L#8t0Jkb?1veUYIX` z+DHFb@4D~49?Bo-ePk}JGm zai7llw61zJ5dgih0A@W+g;?LV=l)!Xz5azdvdCP0KU&^=gXVH#858(#Saj^g`*C4hCZZ$Bq$o0pv0bqaS1CCHibyU2zCF15Jo2= z->;bP?O;SD%Wm74ZW^Mt=%9R>LoOCwPzfE*o6Ux_EoBIQW6_ zXOYXDUDjjLrVxzqz)=**^U&gOipbwqX~B7-Jm#hF;>3E-4ZJGY#*n^}i3WUlstHI% z?G1{t%B(27!W%DFfa?vo?Qj1-eI7u}x%b0$f=}lfws~G}HwP-y0<)Ykx$HtJycUpI zC@!c1339>M-z!i>>G!XxrJO4{%$1TtE9BdLQ;$lH=?QH>n1z%}lQ&EJx@h^jox%qU$KHCB> zRMw3vK;?ViS!@el6-lw2Z%#EZ=Z2w^PoVDt!WvxNP+}UjnO>LOX1d=WjNYa*$c}t| zt{cQZbk#e*m$o+|9bY828?zM?6zORdsd3s_gZfF+o z=n)usHv6a0CGdqQV{VuV7l_C*D9%ci(Vrw+NLsKapknP- z{)EVdHxq@zj`5#3k(7Wy)x~V691h|9r;J{kTR^1d1t-}h>P*Qr$VdfA9Unx7sg|dT z$0o%Lsm_T_9*zUc?bGCNRI6~7s#k0eSmX@^yN|RI>iAz2_I_6IOD;pKe1n$gCKwVTmZ7h|P$V;))b!LY(N%X7jFrwp>Zn4t;X zr}J!pCQDFy4ev)dcBp><4}6{ zUgO!>%6vY?xrk^#CmYFObgt?ufO*1hQt04_=il!x?*1RQcgsswAEn_MM=V`_^Gy&7 zak&f}QtXbV%7~uRjO%=*6&&^6LmfqEFAHQxueN9h+w1LKtn)Dy1F93`@{Wox$QbC~$n54}G1n?&Qtgc`ea^I9P# z7%R!l0kY(=eBRx#fF;?=n#shVUZ6{|&V7AJ4v8pG*92x#RTMz^3^QzpX{d7b^bSaa?Ye;P0E+A_T8_7K+DNiu#G|BIKX|!nd zUK%;mvwL2br*5sCOHCK)$OY2Q6c`4r{cf1;NS*n3JF|aYjvt~vZ_aPu z)@Jp(O;?buC?_&UC@T<=nMxU*PFeQ>c{P?pxy*cf+I7(P{qA=O^Mi(^ zrIl;Owbnu61GGeGnNK6 zRB4RB#dCY}XLFot{ntOba*)72q{=$JA3Z88K8KlCf{z1to8M0>vbcSOJF-GaMBMe+ z+V$ke;OEhOpa1A@cGXad$tj{n{}s~Vp%^}vcVeYE7&Si50L)SG;3$rw&`8A~ZeSgY z0|Un(JR9l<5DD=kiCNYX?8hciq!a0pN1NO;b1(5Tc(<%34OWHY!nPk~KhLVTFC3Cw zbvUf$yo~qW&+>TvT`$Y!lJVM03#v%ym(rlklx3BKv_P`ay^Yiu=TZ^;y))$@^f>%7 zxx`E0wD{cK_(gYhywf9@)A|n$Q*y*How2p90f%Mkx6kbz(BC={Ct<)OxKZV9%0u{X z^W)l)(MY7mR~zn3h*h7g9Iv2;4{VI~rS{9F^ssiWt z`nZ2zbh}kcpkObAP91qUWGRU6kd+fv?=d9Xe7fcbsu`W1q4DLXpIDj z*~odAVDrPGOu4ybH;Xo(fDj1uSTDr6Z&8JfLO>(*_eQ#I+>0_eYG0dA-&yi?St#7Q&Y276 zKx|unEau91yG^W}IrZgrJv^>)qsL}R1hTIKZL6f@=i`>at2eu4HIqO|QUWwV ziK9+2Jh4camsQU1hkPTK!>yN?URS5HgCoD^`#ZdghQi{$Ysa|D4x}&PR2(?9^DGab z?-`*E-(KH*wy%dAz@s4dZ!6Vcvn!JD#T69KSwOBMqwK=yzuEp^Sc@E|-8C}s;kw_c z^?w<|FCgF(M=H3irAwuLkxNDDYp-f?3O5HWeN$Tie+RC#HU*Kd2~Mx%ozpgk0W>ZOE;4# z?b7Y+S|9(Qq^w6Cy*a}M88JX<>S4TF6zrSIe&c`-XR@lxf+jxE36Ud*DPQ2AmwCbg z6d`JU4@L*f&{(XAcO!k}E>KI!3$-l1`TKdY>=zM$Rbs;vGzh*jQ(^Wu9~>3$jcsV!uk=Dyd&5*SqNG$}8pe#z;%fn}jdhupi z4oo6IFjN2?#tMSX5yWI6QKTir`3t|_J_&m|qQxk>(#ugJ&<&kuqE}ERDx%0@-_1G} zHy&FnW(cre2@C4`y++d6`@UbGy_s}lN{itBJV$yQaDbs{+MIK`7|`i9WpmgJ2-Dc* zHsLIm$fIVhXt3+k7|B`qt0K}=vc~WJg!G_S?F2M6s(SY+XXe#9=m{>MnQ)wio)Aw; zL|?R{jme(G%QNtOT<>|?`3|VJI;!0cbHiP>=EMvMfsPCbe-t1{=%)T!s>1iasIqMJ zQX0>oG2C0{KTe$j_gEz>=SqdOv&N7vm#5%40b90jp^y$zvT=W#j=z1^_Xq9i)OkA( zRS)lfpLLYmkBJ#Irh*~F+#q4K>l=ukX40@4xmwY2aurXbMJ5#(Xb3#d6T`w%9F7P^ zr0hM`qPW04d{0#d?7|gh+>#5H>nd#$sK2v4Y6yHxSE14=9nwjHH6!i=;WY}!0x({B z<;Sbu4e)arpaM3xqhnw0Pg zqjV-;ty6sV$Pw0%X{=w}0lcK3Pjv_}*12a9+hc>!{?+uF&WE7;a7-lV(CE=MY5Zse5&mGMiN2N%M~1_tN{f18EMbmQCfOA7XPaV0 zU3_O;QuugWeD4F<<=I-d(@f~dH$C6I4nTWnJG=+1fL5A%mD92D;bLz;x42PSkW1WnyC=5XE+r$r&7Y(|2gZ zul{vUkL-PGv}a}O7bHA+A_RNni62O_}mIa7el*LbagXm)cU zkIh2;1V~4df-cJ%1FK!^#fQy902?@N&Z&TzsH?QEmYBOEi@??>zkux_sD%m1qk~wd z35lEyM%J-d0-8F+nrqX5wW8R>N~mHKkJ;L(u_`>-zbC`i?j|fiBC|dVJZarm z+Z#F?Z&%x7GcT(wB{+})993bbO$cUR41SwGd&ZDeDZ;TthJ3@IGEo6Qr}=n%|975g z;o-3IsW5TA7vJg9&QvQYp_W1)iV!l0@xp#pkhJ8S8axo@PA5k&;{`-5spI(y{s&Wup7BwBtfF#9;r-)dj{4g5@n@lqwYBwNB(uJcT>bY3=BA+3W zmgYBka)Zu~z|}yiU%%CXxGBMD>ox9a6mv`s5NHkQEyX+PE--VWz)KE=PAvT1Br68RROkQ)&W+qt0Ky|a~X7~Vq3 z#Ecu8n8(brP|P&S8K)|&dcsFxtRnZ9FUZThYmT4dK_8o~0gjfxa}o%KEffll*o?oR zy(n`M>^3|vR@*zR9yn&+CDv})VRbumze!spBO79-sAjx985ggGO!2ynZ!cOsmBudh z-YC~RPkA5!9#L8yGCj76277)a({wQ6I+p?Ui|9vY*`mgvhUWUymg@|_Ryx}~PrZMF zydMuejz8BPgd;XAhH3IUcrNriFR$W}QTu80lB$|KD&{@HnL3!!P%0s=-|nWL|KM#q zf7de_n~QGPB$bd%W5_`Mf~ZHC3BM{UN^lrj@KP@URe*RP?Ygws&57& ziC>Ook!8er0%+AuQQvzriOV3hQ9w+}(1YqoiQi#dup%k#>L~bN`lZG;Re#$iGZqC^ zo{MCvb}&d96_y4JeBO=FO}uqnN38#)WBI91y2c#g@(>xg=yVrpb$$=iGtf|G7>OlA zZ}5>*mqeh-pcIf~>o;br$Rbt~FB5~r+}w|`1Wd*Rb&gycrV!8r4X?-zZmiLW@c!J4 zCAcJFqg*;>=-mfaePOMdO-)eZ%c#t@)jG`vP(Z>Aj%&H%8}kvH5?ge6Xi`?P0Yd`J zbcW@2=u5lN$dGEXG1l3`m3|8 zSu$xR@JPs?#cn%FZQ+U)L~Oc+kDm=2pWgGY!ouHWkSFi7cEyiOw8W(xPK%+ui5|CC#NPU`zTx8OmGlFlZ;9{x>q(cdsF>a z>)j%VL-_6FzJ|zfGt2*SjmP8h!PIkGtZ1!&+_@Y`q#&;->b{cW)pIVO!s)}mzzW$H zg!X>tUxDHHIO1?{y8S{hmBW8Ca1bvj42MNag;9~!Ll}#oY(*(IaggWx{czxU>-hAo z=H)c@7B+yh#Z^W=mf4d{a0)p=(@BzQI}#e%lubkm@M&DrB11zrRNsW;-;<#~w`n%7 zl+~W;qu4C2;VnL&56lcA>cfwrlF=g}@N=DGw5*yeKGv~-HO2-K2q^!)g{=OHU7#r5 zvRXV`wh~)b(2l4)>U?gr3+ocELPW(8iOzxVFlkW|a{esY8WdFv%S89*{I`yD&Vqcj zs6>(E*M0I5;`~%x6)3SeuV1#UpW=$0(wK?fYo+y8pY2nes^w`rLHh78h`40)H@XyL>xymopDE$RROev6*0|6|T0km^F zrU<$zw`K15&uVPm-0X`*3$gf(LGZ+4OLb{Ga#IKXR6dBOkb@Go@|K|Zw z-pFqEpSj{`Y`gS`Jjv`&__BMGaiQeh1qFTRXN^zx-a}L^xL|O-9%>5Z<VAUR+b-H~U9QdXk#bwy9oR zhc;M)IV1S7NCwe&y8T7~(Wgh&ejw6(Fw@$5Y(dDnlC}+Mv$D`*vsF+I z`T@}Yy<>sNd>lxx^z?F{g=f4$SIAr{*f3hElTu2^h_pJcCjYAih>|E8=B1O5i7H^1 zusZepy!HZePg-vk2tJW?l3&mDNzRZgCXc{EjDtrd7qeiFQX7V}$vZ>-Tt0IF>s|@} zq24@ER=iK~c@{(b)i`r?zFi9f_1Fr{fYhc+zKjn;RMqtsFxpU2GmXP*hX4jB;}3C- zo7TK+7p6s_$Le8svG>n$FU_%4)v_TsTlo4+`=`?r8X(eA-jLG5-~UDK;o@MVw!(`# za(-IU7$LuuH`et)IA$#8z^-h0&urQb$LX9mH%3a{z-eG;k3oEe?Dl_LyjN@fI-STIrv=2`j@dA6RD0C>k6A~fvqmAOdOY1rhm&@-xZo^ycz0PL9eNJS;UY84x`CW%4(MKpjgPT4fKI%-CJ= zWBF!UAd%px4&GCKQGTU7f3C1e!3e@VWpyLK6M_?^ zC*t@mUzU}!DBIwPRML9cP3_I>chS(SjJ_0sb9@P}WPgyJ^JsPBP1{j&{L zu+Jy_m|DntXu9|qeNT$US6AJyfI#G;?Wl^0A1RFF=HB*PST}qbt8-rXX86i#6ZgY^ zXBYIt$CU|gq}s;K5ivH)u|X2mSV*@ZQX+0lLf7Rnx#wf-DEC7Zj7ka{9l#WSX+|DU5LB?_Mx4o@ilMv4bF+98&OlD9I;V-wMa4da!^MOiNKUDW&DQr_c`+B5 ztvXsQ()+N)1F-xQ@_>wdR{{^-s%rhmcrM%bjzCJd%mzLB7n%Zq14hIMdP$(d97DP& zpbRqQJdReYM1hJzNmcB`y2^M~b>>+8!pgh0N6sE+39;g&QZSW%^5=qijq9W4*kpk* zx4RNhmwF7FjUoo-`!(Ka!wSr3SRh+!+*VdJS7sE{ejY4+(oP!vGGkDZf@(-%fuf3v zsrd&!+(cYn&u*ELipW(|o#CR0USkz^_X&>Qt3%gmCwE19 gR|6Qilxvj?qJ-d+P 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

diff --git a/web/src/parts/Header.tsx b/web/src/parts/Header.tsx index ac508ca..85d9535 100644 --- a/web/src/parts/Header.tsx +++ b/web/src/parts/Header.tsx @@ -29,7 +29,7 @@ export default function Header() {
Bring your own fork choice diff --git a/web/src/parts/Stage.tsx b/web/src/parts/Stage.tsx index b27c7ae..7a8d89c 100644 --- a/web/src/parts/Stage.tsx +++ b/web/src/parts/Stage.tsx @@ -1,6 +1,7 @@ import { useEffect } from 'react'; import { ProcessedData } from '@app/types/graph'; +import { partitionFramesBySlotLag } from '@app/utils/graph'; import useFocus from '@contexts/focus'; import useActive from '@hooks/useActive'; import { useFrameQueries } from '@hooks/useQuery'; @@ -8,7 +9,7 @@ import Graph from '@parts/Graph'; export default function Stage() { const { ids } = useActive(); - const { byo, stop, byoData } = useFocus(); + const { byo, stop, byoData, node: focusedNode } = useFocus(); const results = useFrameQueries(ids, !byo && ids.length > 0); useEffect(() => { @@ -37,12 +38,24 @@ export default function Stage() { ); } + // Exclude nodes whose head is too far behind their metadata slot (e.g. a + // stuck/syncing node) from the aggregated view, but keep them around so the + // sources panel can still list them crossed out. Single node views + // (/node/:name) bypass this entirely — they only render that one node, so + // there is nothing to compare it against. + const { live, behind } = focusedNode + ? { live: data.frames, behind: [] as ProcessedData[] } + : partitionFramesBySlotLag(data.frames); + const liveIds = live.map(frame => frame.frame.metadata.id); + return (
- {!isLoading && } + {!isLoading && ( + + )}
); } diff --git a/web/src/types/graph.ts b/web/src/types/graph.ts index bc7fc49..ba44c10 100644 --- a/web/src/types/graph.ts +++ b/web/src/types/graph.ts @@ -43,6 +43,10 @@ export interface GraphAttributes { slotEnd: number; id: string; head?: string; + // node ids of the (consensus, for aggregated) finalized/justified checkpoint + // blocks, used to keep them visible when the tail is truncated. + finalized?: string; + justified?: string; type: 'aggregated' | 'weighted' | 'empty'; } diff --git a/web/src/utils/graph.ts b/web/src/utils/graph.ts index c25fadb..f01cfd0 100644 --- a/web/src/utils/graph.ts +++ b/web/src/utils/graph.ts @@ -17,6 +17,58 @@ import { } from '@app/types/graph'; import { getCheckpointType } from '@app/utils/api'; +// A node whose fork choice head is more than this many slots behind its own +// metadata wall clock slot is considered "stuck" and is excluded from the +// aggregated graph (otherwise it drags slotStart back thousands of slots and +// the timeline tries to render every slot in between). Tweak to taste. +export const SLOTS_BEHIND_THRESHOLD = 5 * 32; // ~5 epochs + +// Maximum number of slots to render in a graph. When a graph spans more than +// this (e.g. viewing a single node whose head is thousands of slots ahead of +// its finalized tail), only the most recent MAX_GRAPH_SLOTS worth of slots are +// shown — the tail is truncated so the timeline stays responsive. e.g. head at +// slot 10000 only renders 9872-10000. +export const MAX_GRAPH_SLOTS = 128; + +// The slot of a frame's canonical head. Falls back to the highest slot present +// in the graph if no canonical head was resolved. +export function getFrameHeadSlot(graph: WeightedGraph): number { + try { + const headId = graph.getAttribute('head'); + if (headId) return graph.getNodeAttribute(headId, 'slot'); + } catch { + // no resolvable head, fall through to max slot + } + let maxSlot = 0; + graph.forEachNode((_node, attributes) => { + if (attributes.slot > maxSlot) maxSlot = attributes.slot; + }); + return maxSlot; +} + +// How many slots a frame's head is behind its own metadata wall clock slot. +export function getFrameSlotsBehind(frame: ProcessedData): number { + return frame.frame.metadata.wall_clock_slot - getFrameHeadSlot(frame.graph); +} + +// Splits frames into those that are current enough to render and those that are +// too far behind (e.g. a syncing/stuck node) to include in the aggregated view. +export function partitionFramesBySlotLag( + frames: ProcessedData[], + threshold: number = SLOTS_BEHIND_THRESHOLD, +): { live: ProcessedData[]; behind: ProcessedData[] } { + const live: ProcessedData[] = []; + const behind: ProcessedData[] = []; + for (const frame of frames) { + if (getFrameSlotsBehind(frame) > threshold) { + behind.push(frame); + } else { + live.push(frame); + } + } + return { live, behind }; +} + export class GraphError extends Error { forkChoiceNode?: ForkChoiceNode; @@ -476,6 +528,13 @@ export function processForkChoiceData(frame: Required): ProcessedData { } } + // record the finalized/justified checkpoint nodes so they can be pinned into + // view when the tail is truncated. + const finalizedId = blockRootNodeIds[data.finalized_checkpoint.root]; + const justifiedId = blockRootNodeIds[data.justified_checkpoint.root]; + if (finalizedId) graph.updateAttribute('finalized', () => finalizedId); + if (justifiedId) graph.updateAttribute('justified', () => justifiedId); + return { graph, frame }; } @@ -642,5 +701,32 @@ export function aggregateProcessedData(data: ProcessedData[]): AggregatedGraph { if (head) graph.updateAttribute('head', () => head); + // resolve the consensus finalized/justified checkpoint: the node the most + // sources agree on for each type (tie broken by highest slot). Pinned into + // view when the tail is truncated. + const consensusCheckpoint = (type: 'finalized' | 'justified'): string | undefined => { + let best: string | undefined; + let bestVotes = 0; + graph.forEachNode((nodeId, attributes) => { + const votes = attributes.checkpoints.filter(c => c.checkpoint === type).length; + if (votes === 0) return; + if ( + votes > bestVotes || + (votes === bestVotes && + best !== undefined && + attributes.slot > graph.getNodeAttribute(best, 'slot')) + ) { + best = nodeId; + bestVotes = votes; + } + }); + return best; + }; + + const finalized = consensusCheckpoint('finalized'); + const justified = consensusCheckpoint('justified'); + if (finalized) graph.updateAttribute('finalized', () => finalized); + if (justified) graph.updateAttribute('justified', () => justified); + return graph; } From 90525c3b8dee115f8f89fb9c24d576f575358516 Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:29:11 +1000 Subject: [PATCH 17/27] refactor: adopt skeleton layout, ogen-generated API, and web overhaul Restructure the project around the ethpandaops skeleton layout, replace the hand-rolled HTTP API with an OpenAPI-first ogen-generated server, and modernize the web UI stack. Go restructure: - Move the application root from pkg/forky to the repo root (package forky: forkchoice.go, http.go, config.go); subpackages move from pkg/forky/* to internal/* (store, source, service, db, api, ethereum, human, types, version, yaml). - Replace main.go + cmd/root.go with a cmd/forky/main.go cobra entrypoint that builds the logger, loads config, and runs the server. - Serve on a http.ServeMux: /api/ -> generated server, /openapi.yaml -> embedded spec, / -> embedded SPA fallback. - Bump Go to 1.26.2 and refresh dependencies. OpenAPI-first HTTP API: - api/openapi.yaml is now the source of truth for the HTTP API. - api/rest holds the ogen-generated server/client (go generate); internal/api implements the generated rest.Handler interface and maps domain types onto the spec schemas. - Delete the hand-rolled httprouter routing/response layer (pkg/forky/api/http); drop julienschmidt/httprouter, pkg/errors and lib/pq in favour of ogen with otel instrumentation. - Add .redocly.yaml for spec linting; make generate regenerates the Go server and the typed web client together. Web UI overhaul: - Switch npm -> pnpm (pnpm-lock.yaml, packageManager pin, CI updates). - Replace react-router-dom/wouter with TanStack Router using file-based routes (web/src/routes) and a generated route tree. - Replace hand-written API fetchers with a @hey-api/openapi-ts generated typed client (web/src/api) integrated with TanStack Query and zod. - Move Tailwind to v4 CSS-first config: tailwind.config.js removed, semantic color tokens defined in web/src/index.css and enforced by custom ESLint rules (no-hardcoded-colors, no-primitive-color-scales). - Embed built assets via web/embed.go behind the webui build tag (with a stub for tag-less builds), replacing web/static.go. - Rework major views (Events, Header, Selection, summaries) onto the semantic token theme; bump React 19.2, Vite 8, TypeScript 6, ESLint 10 and Vitest 4. Tooling and docs: - New help-driven Makefile (build, build-web, generate, lint, audit, vuln, modernize); .golangci.yml rewritten for golangci-lint v2. - CI: Go 1.26.x, golangci-lint v2.12.2, pnpm-based web jobs. - Add AGENTS.md, CLAUDE.md, web/CLAUDE.md, CONTRIBUTING.md, .editorconfig, .tool-versions and .dockerignore. Co-Authored-By: Claude Fable 5 --- .dockerignore | 10 + .editorconfig | 17 + .github/workflows/goreleaser.yaml | 4 +- .github/workflows/vet.yaml | 28 +- .gitignore | 4 + .golangci.yml | 155 +- .goreleaser.yaml | 5 +- .redocly.yaml | 13 + .tool-versions | 2 + AGENTS.md | 47 + CLAUDE.md | 55 + CONTRIBUTING.md | 52 + Dockerfile | 4 +- Makefile | 94 + README.md | 18 +- api/generate.go | 7 + api/openapi.yaml | 558 ++ api/rest/oas_cfg_gen.go | 318 + api/rest/oas_client_gen.go | 742 ++ api/rest/oas_defaults_gen.go | 15 + api/rest/oas_handlers_gen.go | 1228 +++ api/rest/oas_interfaces_gen.go | 34 + api/rest/oas_json_gen.go | 3753 +++++++++ api/rest/oas_labeler_gen.go | 42 + api/rest/oas_middleware_gen.go | 10 + api/rest/oas_operations_gen.go | 17 + api/rest/oas_parameters_gen.go | 81 + api/rest/oas_request_decoders_gen.go | 410 + api/rest/oas_request_encoders_gen.go | 81 + api/rest/oas_response_decoders_gen.go | 1303 +++ api/rest/oas_response_encoders_gen.go | 439 + api/rest/oas_router_gen.go | 665 ++ api/rest/oas_schemas_gen.go | 1516 ++++ api/rest/oas_server_gen.go | 82 + api/rest/oas_unimplemented_gen.go | 94 + api/rest/oas_validators_gen.go | 803 ++ api/spec.go | 8 + cmd/forky/main.go | 76 + cmd/root.go | 61 - pkg/forky/config.go => config.go | 5 +- pkg/forky/forkchoice.go => forkchoice.go | 42 +- pkg/forky/forky_test.go => forky_test.go | 72 +- go.mod | 56 +- go.sum | 94 +- pkg/forky/http.go => http.go | 0 {pkg/forky => internal}/api/config.go | 8 +- internal/api/ethereum.go | 44 + internal/api/frames.go | 138 + internal/api/http.go | 108 + internal/api/metadata.go | 204 + .../api/http => internal/api}/metrics.go | 44 +- {pkg/forky => internal}/api/option.go | 0 {pkg/forky => internal}/db/config.go | 0 {pkg/forky => internal}/db/event_source.go | 2 +- {pkg/forky => internal}/db/filters.go | 0 {pkg/forky => internal}/db/frame_metadata.go | 3 +- .../db/frame_metadata_label.go | 0 {pkg/forky => internal}/db/indexer.go | 13 +- {pkg/forky => internal}/db/indexer_test.go | 33 +- {pkg/forky => internal}/db/metrics.go | 0 {pkg/forky => internal}/db/operation.go | 0 {pkg/forky => internal}/db/option.go | 0 {pkg/forky => internal}/db/pagination.go | 0 {pkg/forky => internal}/ethereum/client.go | 0 {pkg/forky => internal}/ethereum/config.go | 7 +- {pkg/forky => internal}/ethereum/ethereum.go | 4 +- .../ethereum/ethereum_test.go | 5 +- {pkg/forky => internal}/human/duration.go | 4 +- {pkg/forky => internal}/service/backfill.go | 8 +- {pkg/forky => internal}/service/config.go | 10 +- {pkg/forky => internal}/service/errors.go | 0 {pkg/forky => internal}/service/forkchoice.go | 2 +- {pkg/forky => internal}/service/metrics.go | 5 +- {pkg/forky => internal}/service/operations.go | 0 {pkg/forky => internal}/service/option.go | 0 {pkg/forky => internal}/service/pagination.go | 2 +- {pkg/forky => internal}/service/purger.go | 2 +- {pkg/forky => internal}/service/service.go | 23 +- {pkg/forky => internal}/source/beacon_node.go | 25 +- {pkg/forky => internal}/source/config.go | 2 +- {pkg/forky => internal}/source/error.go | 0 {pkg/forky => internal}/source/metrics.go | 0 {pkg/forky => internal}/source/option.go | 0 {pkg/forky => internal}/source/source.go | 11 +- {pkg/forky => internal}/source/type.go | 0 {pkg/forky => internal}/source/xatu_http.go | 42 +- {pkg/forky => internal}/store/config.go | 2 +- {pkg/forky => internal}/store/errors.go | 0 {pkg/forky => internal}/store/filesystem.go | 6 +- {pkg/forky => internal}/store/memory.go | 3 +- {pkg/forky => internal}/store/metrics.go | 0 {pkg/forky => internal}/store/option.go | 0 {pkg/forky => internal}/store/s3.go | 23 +- {pkg/forky => internal}/store/store.go | 5 +- {pkg/forky => internal}/store/type.go | 0 {pkg/forky => internal}/types/event_source.go | 0 {pkg/forky => internal}/types/frame.go | 2 +- {pkg => internal}/version/version.go | 2 +- internal/yaml/raw_config.go | 15 + main.go | 26 - makefile | 3 - pkg/forky/api/ethereum.go | 62 - pkg/forky/api/frames.go | 55 - pkg/forky/api/http.go | 61 - pkg/forky/api/http/content_type.go | 81 - pkg/forky/api/http/error.go | 6 - pkg/forky/api/http/http.go | 91 - pkg/forky/api/http/response.go | 155 - pkg/forky/api/http/routing.go | 90 - pkg/forky/api/metadata.go | 225 - pkg/yaml/raw_config.go | 15 - web/CLAUDE.md | 89 + web/build/.gitkeep | 0 web/embed.go | 17 + web/embed_stub.go | 18 + web/eslint-rules/index.cjs | 14 + web/eslint-rules/no-hardcoded-colors.cjs | 263 + .../no-primitive-color-scales.cjs | 119 + web/eslint.config.js | 30 +- web/openapi-ts.config.ts | 32 + web/package-lock.json | 7025 ----------------- web/package.json | 72 +- web/pnpm-lock.yaml | 4137 ++++++++++ web/src/App.tsx | 20 +- web/src/ErrorBoundary.tsx | 4 +- web/src/NotFound.tsx | 4 +- web/src/api/@tanstack/react-query.gen.ts | 261 + web/src/api/client.gen.ts | 22 + web/src/api/client/client.gen.ts | 273 + web/src/api/client/index.ts | 22 + web/src/api/client/types.gen.ts | 207 + web/src/api/client/utils.gen.ts | 291 + web/src/api/core/auth.gen.ts | 48 + web/src/api/core/bodySerializer.gen.ts | 82 + web/src/api/core/params.gen.ts | 171 + web/src/api/core/pathSerializer.gen.ts | 167 + web/src/api/core/queryKeySerializer.gen.ts | 111 + web/src/api/core/serverSentEvents.gen.ts | 238 + web/src/api/core/types.gen.ts | 86 + web/src/api/core/utils.gen.ts | 137 + web/src/api/ethereum.ts | 45 - web/src/api/frames.ts | 20 - web/src/api/index.ts | 75 + web/src/api/metadata.ts | 42 - web/src/api/sdk.gen.ts | 174 + web/src/api/types.gen.ts | 452 ++ web/src/api/zod.gen.ts | 264 + web/src/components/AggregatedBlockSummary.tsx | 419 +- .../components/AggregatedFramesSummary.tsx | 354 +- web/src/components/AggregatedNode.tsx | 60 +- web/src/components/BYOFrameBlockSummary.tsx | 155 +- web/src/components/ClearTimeParam.tsx | 21 + web/src/components/ConcatNode.tsx | 8 +- web/src/components/Control.tsx | 30 +- web/src/components/Download.tsx | 2 +- web/src/components/EditableInput.tsx | 18 +- web/src/components/EpochDial.tsx | 8 +- web/src/components/FrameBlockSummary.tsx | 193 +- web/src/components/FrameSummary.tsx | 107 +- web/src/components/Icon.tsx | 2 +- web/src/components/Link.tsx | 24 + web/src/components/Loading.tsx | 2 +- web/src/components/ModeToggle.tsx | 6 +- web/src/components/Ruler.tsx | 10 +- web/src/components/Share.tsx | 116 +- web/src/components/Slot.tsx | 10 +- web/src/components/SlotBoundary.tsx | 72 +- web/src/components/SlotDial.tsx | 2 +- web/src/components/SnapshotMarker.tsx | 24 +- web/src/components/Summary.tsx | 97 + web/src/components/TimeDrag.tsx | 17 +- web/src/components/Walker.tsx | 5 +- web/src/components/WeightedNode.tsx | 36 +- web/src/contexts/focus.tsx | 63 +- web/src/contexts/selection.tsx | 6 +- web/src/hooks/__tests__/useActive.test.ts | 8 +- web/src/hooks/__tests__/useGraph.test.ts | 18 +- web/src/hooks/useActive.ts | 6 +- web/src/hooks/useAppNavigation.ts | 39 + web/src/hooks/useNow.ts | 23 + web/src/hooks/useQuery.ts | 83 +- web/src/index.css | 418 + web/src/index.tsx | 35 +- web/src/mocks/handlers.ts | 41 +- web/src/parts/BYOFooter.tsx | 17 +- web/src/parts/Events.tsx | 647 +- web/src/parts/FrameFooter.tsx | 10 +- web/src/parts/Graph.tsx | 44 +- web/src/parts/Header.tsx | 163 +- web/src/parts/Selection.tsx | 122 +- web/src/parts/Stage.tsx | 5 +- web/src/parts/Timeline.tsx | 8 +- web/src/providers/application.tsx | 6 - web/src/routeTree.gen.ts | 77 + web/src/routes/$.tsx | 7 + web/src/routes/-RouteView.tsx | 34 + web/src/routes/__root.tsx | 5 + web/src/routes/index.tsx | 7 + web/src/styles/global.css | 13 - web/src/types/api.ts | 130 +- web/src/types/graph.ts | 6 +- web/src/utils/__tests__/api.test.ts | 8 +- web/src/utils/__tests__/functions.test.ts | 5 +- web/src/utils/__tests__/graph.test.ts | 2 +- web/src/utils/api-config.ts | 22 + web/src/utils/api.ts | 14 +- web/src/utils/graph.ts | 2 +- web/src/utils/tailwind.ts | 43 - web/static.go | 6 - web/tailwind.config.js | 22 - web/tsconfig.app.json | 31 +- web/vite.config.ts | 18 +- web/vitest.config.ts | 7 +- 213 files changed, 23540 insertions(+), 10308 deletions(-) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .redocly.yaml create mode 100644 .tool-versions create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 CONTRIBUTING.md create mode 100644 Makefile create mode 100644 api/generate.go create mode 100644 api/openapi.yaml create mode 100644 api/rest/oas_cfg_gen.go create mode 100644 api/rest/oas_client_gen.go create mode 100644 api/rest/oas_defaults_gen.go create mode 100644 api/rest/oas_handlers_gen.go create mode 100644 api/rest/oas_interfaces_gen.go create mode 100644 api/rest/oas_json_gen.go create mode 100644 api/rest/oas_labeler_gen.go create mode 100644 api/rest/oas_middleware_gen.go create mode 100644 api/rest/oas_operations_gen.go create mode 100644 api/rest/oas_parameters_gen.go create mode 100644 api/rest/oas_request_decoders_gen.go create mode 100644 api/rest/oas_request_encoders_gen.go create mode 100644 api/rest/oas_response_decoders_gen.go create mode 100644 api/rest/oas_response_encoders_gen.go create mode 100644 api/rest/oas_router_gen.go create mode 100644 api/rest/oas_schemas_gen.go create mode 100644 api/rest/oas_server_gen.go create mode 100644 api/rest/oas_unimplemented_gen.go create mode 100644 api/rest/oas_validators_gen.go create mode 100644 api/spec.go create mode 100644 cmd/forky/main.go delete mode 100644 cmd/root.go rename pkg/forky/config.go => config.go (91%) rename pkg/forky/forkchoice.go => forkchoice.go (76%) rename pkg/forky/forky_test.go => forky_test.go (84%) rename pkg/forky/http.go => http.go (100%) rename {pkg/forky => internal}/api/config.go (80%) create mode 100644 internal/api/ethereum.go create mode 100644 internal/api/frames.go create mode 100644 internal/api/http.go create mode 100644 internal/api/metadata.go rename {pkg/forky/api/http => internal/api}/metrics.go (54%) rename {pkg/forky => internal}/api/option.go (100%) rename {pkg/forky => internal}/db/config.go (100%) rename {pkg/forky => internal}/db/event_source.go (95%) rename {pkg/forky => internal}/db/filters.go (100%) rename {pkg/forky => internal}/db/frame_metadata.go (97%) rename {pkg/forky => internal}/db/frame_metadata_label.go (100%) rename {pkg/forky => internal}/db/indexer.go (97%) rename {pkg/forky => internal}/db/indexer_test.go (97%) rename {pkg/forky => internal}/db/metrics.go (100%) rename {pkg/forky => internal}/db/operation.go (100%) rename {pkg/forky => internal}/db/option.go (100%) rename {pkg/forky => internal}/db/pagination.go (100%) rename {pkg/forky => internal}/ethereum/client.go (100%) rename {pkg/forky => internal}/ethereum/config.go (87%) rename {pkg/forky => internal}/ethereum/ethereum.go (95%) rename {pkg/forky => internal}/ethereum/ethereum_test.go (95%) rename {pkg/forky => internal}/human/duration.go (87%) rename {pkg/forky => internal}/service/backfill.go (93%) rename {pkg/forky => internal}/service/config.go (54%) rename {pkg/forky => internal}/service/errors.go (100%) rename {pkg/forky => internal}/service/forkchoice.go (96%) rename {pkg/forky => internal}/service/metrics.go (95%) rename {pkg/forky => internal}/service/operations.go (100%) rename {pkg/forky => internal}/service/option.go (100%) rename {pkg/forky => internal}/service/pagination.go (90%) rename {pkg/forky => internal}/service/purger.go (95%) rename {pkg/forky => internal}/service/service.go (95%) rename {pkg/forky => internal}/source/beacon_node.go (91%) rename {pkg/forky => internal}/source/config.go (78%) rename {pkg/forky => internal}/source/error.go (100%) rename {pkg/forky => internal}/source/metrics.go (100%) rename {pkg/forky => internal}/source/option.go (100%) rename {pkg/forky => internal}/source/source.go (89%) rename {pkg/forky => internal}/source/type.go (100%) rename {pkg/forky => internal}/source/xatu_http.go (93%) rename {pkg/forky => internal}/store/config.go (85%) rename {pkg/forky => internal}/store/errors.go (100%) rename {pkg/forky => internal}/store/filesystem.go (91%) rename {pkg/forky => internal}/store/memory.go (96%) rename {pkg/forky => internal}/store/metrics.go (100%) rename {pkg/forky => internal}/store/option.go (100%) rename {pkg/forky => internal}/store/s3.go (88%) rename {pkg/forky => internal}/store/store.go (92%) rename {pkg/forky => internal}/store/type.go (100%) rename {pkg/forky => internal}/types/event_source.go (100%) rename {pkg/forky => internal}/types/frame.go (99%) rename {pkg => internal}/version/version.go (87%) create mode 100644 internal/yaml/raw_config.go delete mode 100644 main.go delete mode 100644 makefile delete mode 100644 pkg/forky/api/ethereum.go delete mode 100644 pkg/forky/api/frames.go delete mode 100644 pkg/forky/api/http.go delete mode 100644 pkg/forky/api/http/content_type.go delete mode 100644 pkg/forky/api/http/error.go delete mode 100644 pkg/forky/api/http/http.go delete mode 100644 pkg/forky/api/http/response.go delete mode 100644 pkg/forky/api/http/routing.go delete mode 100644 pkg/forky/api/metadata.go delete mode 100644 pkg/yaml/raw_config.go create mode 100644 web/CLAUDE.md delete mode 100644 web/build/.gitkeep create mode 100644 web/embed.go create mode 100644 web/embed_stub.go create mode 100644 web/eslint-rules/index.cjs create mode 100644 web/eslint-rules/no-hardcoded-colors.cjs create mode 100644 web/eslint-rules/no-primitive-color-scales.cjs create mode 100644 web/openapi-ts.config.ts delete mode 100644 web/package-lock.json create mode 100644 web/pnpm-lock.yaml create mode 100644 web/src/api/@tanstack/react-query.gen.ts create mode 100644 web/src/api/client.gen.ts create mode 100644 web/src/api/client/client.gen.ts create mode 100644 web/src/api/client/index.ts create mode 100644 web/src/api/client/types.gen.ts create mode 100644 web/src/api/client/utils.gen.ts create mode 100644 web/src/api/core/auth.gen.ts create mode 100644 web/src/api/core/bodySerializer.gen.ts create mode 100644 web/src/api/core/params.gen.ts create mode 100644 web/src/api/core/pathSerializer.gen.ts create mode 100644 web/src/api/core/queryKeySerializer.gen.ts create mode 100644 web/src/api/core/serverSentEvents.gen.ts create mode 100644 web/src/api/core/types.gen.ts create mode 100644 web/src/api/core/utils.gen.ts delete mode 100644 web/src/api/ethereum.ts delete mode 100644 web/src/api/frames.ts create mode 100644 web/src/api/index.ts delete mode 100644 web/src/api/metadata.ts create mode 100644 web/src/api/sdk.gen.ts create mode 100644 web/src/api/types.gen.ts create mode 100644 web/src/api/zod.gen.ts create mode 100644 web/src/components/ClearTimeParam.tsx create mode 100644 web/src/components/Link.tsx create mode 100644 web/src/components/Summary.tsx create mode 100644 web/src/hooks/useAppNavigation.ts create mode 100644 web/src/hooks/useNow.ts create mode 100644 web/src/index.css create mode 100644 web/src/routeTree.gen.ts create mode 100644 web/src/routes/$.tsx create mode 100644 web/src/routes/-RouteView.tsx create mode 100644 web/src/routes/__root.tsx create mode 100644 web/src/routes/index.tsx delete mode 100644 web/src/styles/global.css create mode 100644 web/src/utils/api-config.ts delete mode 100644 web/src/utils/tailwind.ts delete mode 100644 web/static.go delete mode 100644 web/tailwind.config.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..75913c6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git/ +.github/ +.idea/ +.vscode/ +*.db +*.db-journal +*.db-wal +coverage.out +dist/ +web/node_modules/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e11a389 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.go] +indent_style = tab + +[*.{yaml,yml,md,json}] +indent_style = space +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/.github/workflows/goreleaser.yaml b/.github/workflows/goreleaser.yaml index 70a54d7..3cf92b1 100644 --- a/.github/workflows/goreleaser.yaml +++ b/.github/workflows/goreleaser.yaml @@ -38,7 +38,9 @@ jobs: - name: Set up Go uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 with: - go-version: '1.24' + go-version: '1.26' + - name: Set up pnpm + uses: pnpm/action-setup@v4 - uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3.8.2 name: Set up Node with: diff --git a/.github/workflows/vet.yaml b/.github/workflows/vet.yaml index aca445e..08bb4ac 100644 --- a/.github/workflows/vet.yaml +++ b/.github/workflows/vet.yaml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go_version: [ 1.24.x ] + go_version: [ 1.26.x ] steps: - name: Set up Go ${{ matrix.go_version }} uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 @@ -24,7 +24,7 @@ jobs: uses: golangci/golangci-lint-action@3a919529898de77ec3da873e3063ca4b10e7f5cc # v3.7.0 with: # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version - version: v1.64 + version: v2.12.2 # Optional: working directory, useful for monorepos # working-directory: somedir @@ -48,7 +48,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - go_version: [ 1.24.x ] + go_version: [ 1.26.x ] steps: - name: Set up Go ${{ matrix.go_version }} uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 @@ -72,16 +72,18 @@ jobs: node-version: [22.x] steps: - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + - name: Set up pnpm + uses: pnpm/action-setup@v4 - name: Set up NodeJS ${{ matrix.node-version }} uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3.8.2 with: node-version: ${{ matrix.node-version }} - cache: "npm" - cache-dependency-path: web/package-lock.json + cache: "pnpm" + cache-dependency-path: web/pnpm-lock.yaml - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Test - run: npm test + run: pnpm test web-lint: runs-on: ubuntu-latest defaults: @@ -92,18 +94,20 @@ jobs: node-version: [22.x] steps: - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 + - name: Set up pnpm + uses: pnpm/action-setup@v4 - name: Set up NodeJS ${{ matrix.node-version }} uses: actions/setup-node@1a4442cacd436585916779262731d5b162bc6ec7 # v3.8.2 with: node-version: ${{ matrix.node-version }} - cache: "npm" - cache-dependency-path: web/package-lock.json + cache: "pnpm" + cache-dependency-path: web/pnpm-lock.yaml - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Lint - run: npm run lint + run: pnpm lint - name: Save Report - run: npm run lint:report + run: pnpm lint:report continue-on-error: true - name: Annotate Results uses: ataylorme/eslint-annotate-action@5f4dc2e3af8d3c21b727edb597e5503510b1dc9c # 2.2.0 diff --git a/.gitignore b/.gitignore index f3d39a6..f36d817 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,12 @@ bin +/forky +.playwright-mcp/ +coverage.out config.yaml config2.yaml __debug_bin* dist/ +web/dist/ checkpointz store.db index.db diff --git a/.golangci.yml b/.golangci.yml index 98caad7..83ee435 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,65 +1,132 @@ -linters-settings: - errcheck: - check-type-assertions: true - goconst: - min-len: 2 - min-occurrences: 3 - gocritic: - enabled-tags: - - diagnostic - - experimental - - opinionated - - performance - - style - govet: - shadow: true - nolintlint: - require-explanation: true - require-specific: true +version: "2" + +run: + timeout: 5m linters: - disable-all: true + default: none enable: - - asasalint - bidichk - bodyclose - - containedctx - - decorder - - dogsled - - durationcheck + - copyloopvar + - cyclop + - dupword - errcheck - errname - - copyloopvar + - errorlint + - exhaustive + - exptostd + - fatcontext + - funlen + - gocognit - gocritic - - gocyclo - - gofmt - - goheader - - goimports - gosec - - gosimple - govet - ineffassign + - intrange - misspell - - nakedret - - nilerr + - modernize + - nestif - nilerr - - nilnil - - nlreturn + - noctx - nolintlint - - nosprintfhostport - - prealloc + - perfsprint - predeclared - - promlinter - - reassign + - revive + - sloglint - staticcheck - - stylecheck - - thelper + - tagliatelle + - testifylint - tparallel - - typecheck - unconvert + - usetesting + - unparam - unused + - usestdlibvars + - wastedassign - whitespace - - wsl -run: - issues-exit-code: 1 + settings: + cyclop: + max-complexity: 30 + + funlen: + lines: 100 + statements: 50 + + gocognit: + # Aligned with cyclop's max-complexity so the two complexity metrics agree. + min-complexity: 30 + + errcheck: + check-type-assertions: true + + exhaustive: + # A `default` case counts as handling the remaining enum members. Avoids + # enumerating large generated enums (e.g. xatu.Event_Name) exhaustively. + default-signifies-exhaustive: true + + tagliatelle: + case: + rules: + yaml: snake + json: snake + + revive: + rules: + - name: unexported-return + disabled: true + + govet: + enable-all: true + disable: + - fieldalignment + settings: + shadow: + # Non-strict: don't flag the idiomatic `if x, err := f(); err != nil` + # reuse of an outer err in nested scopes. + strict: false + + nolintlint: + require-explanation: true + require-specific: true + + sloglint: + no-global: all + context: scope + + staticcheck: + checks: + - all + + exclusions: + paths: + # ogen-generated server/client code. + - api/rest + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + rules: + # Test files are allowed to be long/complex (table-driven tests) and to + # have unused helper parameters. + - path: _test\.go + linters: + - funlen + - gocognit + - cyclop + - unparam + +formatters: + enable: + - gofumpt + - goimports + settings: + goimports: + local-prefixes: + - github.com/ethpandaops/forky + exclusions: + paths: + # ogen-generated server/client code. + - api/rest diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 4af9927..2cb79ca 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -9,6 +9,9 @@ before: - make build-web builds: - binary: forky-{{.Version}} + main: ./cmd/forky + tags: + - webui goos: - linux - windows @@ -24,7 +27,7 @@ builds: ignore: - goarch: 386 ldflags: - - -s -w -X github.com/ethpandaops/forky/pkg/version.Release={{.Tag}} -X github.com/ethpandaops/forky/pkg/version.GitCommit={{.ShortCommit}} + - -s -w -X github.com/ethpandaops/forky/internal/version.Release={{.Tag}} -X github.com/ethpandaops/forky/internal/version.GitCommit={{.ShortCommit}} mod_timestamp: "{{ .CommitTimestamp }}" checksum: diff --git a/.redocly.yaml b/.redocly.yaml new file mode 100644 index 0000000..dc9aa8a --- /dev/null +++ b/.redocly.yaml @@ -0,0 +1,13 @@ +extends: + - recommended + +rules: + info-license: error + no-server-example.com: error + tag-description: error + operation-4xx-response: error + no-unused-components: error + operation-2xx-response: off + # Forky's API is unauthenticated (read-only fork-choice data). Re-enable once + # an auth scheme is added. + security-defined: off diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..cce6461 --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +golang 1.26.2 +golangci-lint 2.12.2 diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..715e0de --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,47 @@ +# forky + +Forky captures, stores, indexes and serves Ethereum Beacon Chain fork-choice +data, providing a live and historical view of the network. It runs as a single +service with an embedded operator web UI. + +## Architecture + +- `cmd/forky/main.go` — cobra CLI entrypoint; builds the logger, loads config, + constructs the server and runs it until a signal is received. +- `forkchoice.go` / `http.go` / `config.go` — application root (package `forky` + at the repo root). `NewServer` wires dependencies; `Start` runs the service. + `NewConfigFromYAMLFile` loads `Config` from YAML. +- `internal/` — application packages, each a cohesive capability: + - `store/` — frame storage backends (memory, filesystem, S3). + - `source/` — fork-choice data sources (beacon node, Xatu). + - `service/` — fork-choice orchestration, backfill, pagination, purging. + - `db/` — frame metadata indexer (SQLite, Postgres). + - `api/` — HTTP handlers for the JSON API under `/api/v1`. + - `ethereum/`, `types/`, `human/` — domain support. + - `version/` — build metadata (set via `-ldflags`). + - `yaml/` — raw config helpers. +- `web/` — operator UI (React + Vite). The built assets are embedded into the + binary and served by the API server. See `web/CLAUDE.md`. + +New subsystems get their own package under `internal/` and are wired in from the +root `forky` package. + +## Conventions + +- Go: `github.com/sirupsen/logrus` for logging (existing project — do not mix + logging libraries), `fmt.Errorf("...: %w", err)` for error wrapping. Linting + is governed by `.golangci.yml`. +- Web: see `web/CLAUDE.md`. Colors must use the semantic tokens in + `web/src/index.css` (enforced by custom ESLint rules). +- The OpenAPI spec in `api/openapi.yaml` is the source of truth for the typed + web API client (`pnpm --dir web generate:api`). + +## Commands + +```sh +make build # compile the binary +make build-web # build the embedded frontend assets +make test # go test -race +make lint # golangci-lint +make audit # lint + test + vuln + modernize + mod verify +``` diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..962cc9c --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,55 @@ +# forky + +Forky captures, stores, indexes and serves Ethereum Beacon Chain fork-choice +data, providing a live and historical view of the network. It runs as a single +service with an embedded operator web UI. + +## Architecture + +- `cmd/forky/main.go` — cobra CLI entrypoint; builds the logger, loads config, + constructs the server and runs it until a signal is received. +- `forkchoice.go` / `http.go` / `config.go` — application root (package `forky` + at the repo root). `NewServer` wires dependencies; `Start` runs the service + on a `http.ServeMux` (`/api/` → generated server, `/openapi.yaml` → embedded + spec, `/` → SPA fallback). `NewConfigFromYAMLFile` loads `Config` from YAML. +- `api/` — the OpenAPI spec (`openapi.yaml`, the source of truth for the HTTP + API), the embedded spec (`spec.go`) and the ogen-generated server/client in + `api/rest` (generated — do not edit; see `generate.go`). +- `internal/` — application packages, each a cohesive capability: + - `store/` — frame storage backends (memory, filesystem, S3). + - `source/` — fork-choice data sources (beacon node, Xatu). + - `service/` — fork-choice orchestration, backfill, pagination, purging. + - `db/` — frame metadata indexer (SQLite, Postgres). + - `api/` — implements the generated `rest.Handler` interface; maps domain + types onto the spec schemas. + - `ethereum/`, `types/`, `human/` — domain support. + - `version/` — build metadata (set via `-ldflags`). + - `yaml/` — raw config helpers. +- `web/` — operator UI (React + Vite). The built assets are embedded into the + binary and served by the API server. See `web/CLAUDE.md`. + +New subsystems get their own package under `internal/` and are wired in from the +root `forky` package. + +## Conventions + +- Go: `github.com/sirupsen/logrus` for logging (existing project — do not mix + logging libraries), `fmt.Errorf("...: %w", err)` for error wrapping. Linting + is governed by `.golangci.yml`. +- Web: see `web/CLAUDE.md`. Colors must use the semantic tokens in + `web/src/index.css` (enforced by custom ESLint rules). +- The OpenAPI spec in `api/openapi.yaml` is the source of truth for the HTTP + API on both sides: the Go server (`api/rest`, generated by ogen) and the + typed web API client (`web/src/api`, generated by @hey-api/openapi-ts). + After editing the spec, run `make generate` to regenerate both. + +## Commands + +```sh +make build # compile the binary +make build-web # build the embedded frontend assets +make generate # regenerate the ogen server + web client from api/openapi.yaml +make test # go test -race +make lint # golangci-lint +make audit # lint + test + vuln + modernize + mod verify +``` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..06e5f96 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,52 @@ +# Contributing to Forky + +## Prerequisites + +- [Go](https://go.dev/dl/) (see `go.mod` for the minimum version) +- [Node.js](https://nodejs.org/) + [pnpm](https://pnpm.io/) (for the web UI) +- [golangci-lint](https://golangci-lint.run/welcome/install/) +- [goreleaser](https://goreleaser.com/install/) (optional, for release checks) + +## Development Workflow + +```sh +# Build the binary with the embedded web UI +make build + +# Run tests +make test + +# Run the linter +make lint + +# Run all checks (lint + test + vuln + modernize + mod verify) +make audit +``` + +The backend can be run directly against a config file: + +```sh +make run # build + run with ./config.yaml +# or +go run ./cmd/forky --config your_config.yaml +``` + +The web UI has its own workflow — see [`web/CLAUDE.md`](web/CLAUDE.md). + +## Pull Request Guidelines + +1. Create a feature branch from `master`. +2. Keep changes focused — one concern per PR. +3. Add tests for new functionality. +4. Ensure `make audit` passes before submitting. +5. Use [Conventional Commits](https://www.conventionalcommits.org/) — the web + package enforces them via commitlint. + +## Code Style + +- Follow the conventions enforced by `golangci-lint` and `.golangci.yml`. +- Use `github.com/sirupsen/logrus` for logging (consistent with the existing + codebase — do not mix logging libraries). +- Wrap errors with context using `fmt.Errorf` and `%w`. +- The OpenAPI spec in `api/openapi.yaml` is the source of truth for the typed + web API client (`pnpm --dir web generate:api`). diff --git a/Dockerfile b/Dockerfile index 9a2c3fa..202c160 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -FROM golang:1.19 AS builder +FROM golang:1.26 AS builder WORKDIR /src COPY go.sum go.mod ./ RUN go mod download COPY . . -RUN CGO_ENABLED=0 go build -o /bin/app . +RUN CGO_ENABLED=0 go build -o /bin/app ./cmd/forky FROM ubuntu:latest RUN apt-get update && apt-get -y upgrade && apt-get install -y --no-install-recommends \ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..af26637 --- /dev/null +++ b/Makefile @@ -0,0 +1,94 @@ +.DEFAULT_GOAL := help +.PHONY: build build-web setup-frontend generate lint lint-openapi fmt test clean tidy vuln modernize-check audit check-release run test/cover help + +BUILD_DIR := ./cmd/forky +BINARY := forky +VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) +COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null || echo none) +LDFLAGS := -s -w \ + -X github.com/ethpandaops/forky/internal/version.Release=$(VERSION) \ + -X github.com/ethpandaops/forky/internal/version.GitCommit=$(COMMIT) + +## setup-frontend: ensure web/dist/index.html exists for the embed +setup-frontend: + @mkdir -p web/dist + @test -f web/dist/index.html || echo 'forky

forky

' > web/dist/index.html + +## build-web: build the embedded frontend assets (output to web/dist) +build-web: setup-frontend + @if command -v pnpm >/dev/null 2>&1; then \ + echo "building embedded web assets with pnpm"; \ + cd web && pnpm install && pnpm build; \ + else \ + echo "pnpm not found, skipping web build and using existing web/dist assets"; \ + fi + +## build: compile the binary with the embedded frontend +build: setup-frontend + go build -tags=webui -trimpath -ldflags="$(LDFLAGS)" -o $(BINARY) $(BUILD_DIR) + +## generate: regenerate the ogen server (api/rest) and web API client from api/openapi.yaml +generate: + go generate ./... + @if command -v pnpm >/dev/null 2>&1; then \ + cd web && pnpm generate:api; \ + else \ + echo "pnpm not found, skipping web API client generation"; \ + fi + +## lint: run golangci-lint (only new issues vs origin/master when available) +lint: + @if git rev-parse --verify --quiet origin/master >/dev/null; then \ + golangci-lint run --new-from-rev="origin/master" ./...; \ + else \ + golangci-lint run ./...; \ + fi + +## lint-openapi: lint the OpenAPI spec with Redocly +lint-openapi: + npx -y @redocly/cli@latest lint api/openapi.yaml --config .redocly.yaml + +## fmt: format code +fmt: + golangci-lint fmt ./... + +## test: run tests with the race detector +test: + go test -race -shuffle=on -coverprofile=coverage.out -covermode=atomic ./... + +## clean: remove build outputs +clean: + rm -f $(BINARY) coverage.out + +## tidy: tidy go modules +tidy: + go mod tidy + +## vuln: run govulncheck +vuln: + go tool govulncheck ./... + +## modernize-check: preview Go modernizations without changing files +modernize-check: + go fix -n ./... + +## audit: run all checks +audit: lint test vuln modernize-check + go mod tidy -diff + go mod verify + +## run: build and run the binary against ./config.yaml +run: build + ./$(BINARY) --config config.yaml + +## test/cover: open the HTML coverage report +test/cover: test + go tool cover -html=coverage.out + +## check-release: validate the goreleaser config +check-release: + goreleaser check -q + +## help: show this help +help: + @sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' | sed -e 's/^/ /' diff --git a/README.md b/README.md index acf50fd..514ed44 100644 --- a/README.md +++ b/README.md @@ -121,19 +121,19 @@ helm install forky ethereum-helm-charts/forky -f your_values.yaml 1. Clone the repo ```sh - go get github.com/ethpandaops/forky + git clone https://github.com/ethpandaops/forky.git ``` 2. Change directories ```sh cd ./forky ``` -3. Build the binary - ```sh - go build -o forky . +3. Build the binary (embeds the web frontend; requires `pnpm`) + ```sh + make build-web && make build ``` 4. Run the service - ```sh - ./forky + ```sh + ./forky --config your_config.yaml ``` ## Contributing @@ -152,7 +152,7 @@ Contributions are greatly appreciated! Pull requests will be reviewed and merged ### Running locally #### Backend ``` -go run main.go --config your_config.yaml +go run ./cmd/forky --config your_config.yaml ``` #### Frontend @@ -165,7 +165,9 @@ The frontend can be built with the following command; make build-web ``` -Building frontend requires `npm` and `NodeJS` to be installed. +Building the frontend requires `pnpm` and `NodeJS` to be installed. For +frontend development, `pnpm --dir web dev` starts a Vite dev server that +proxies `/api` to a backend (see `web/vite.config.ts`). ## Contact diff --git a/api/generate.go b/api/generate.go new file mode 100644 index 0000000..6f9d6e7 --- /dev/null +++ b/api/generate.go @@ -0,0 +1,7 @@ +// Package api contains the OpenAPI specification and the generated server. +package api + +// The OpenAPI spec at openapi.yaml is the source of truth for the HTTP API. +// The ogen-generated server, client and schema types live in ./rest and are +// regenerated from the spec via `make generate`. +//go:generate go tool ogen --target rest --package rest --clean openapi.yaml diff --git a/api/openapi.yaml b/api/openapi.yaml new file mode 100644 index 0000000..6a78ad8 --- /dev/null +++ b/api/openapi.yaml @@ -0,0 +1,558 @@ +openapi: 3.1.0 +info: + title: Forky API + version: 1.0.0 + description: | + Forky captures, stores, indexes and serves Ethereum Beacon Chain + fork-choice data. This API exposes fork-choice frames and their metadata. + + All successful responses wrap their payload in a top-level `data` object. + Error responses return a flat `{ "code", "message" }` object. + + Frame metadata serializes slots and epochs as JSON numbers. The fork-choice + dump inside a frame mirrors the beacon node `/eth/v1/debug/fork_choice` + response, where slots, epochs and weights are serialized as strings. + license: + name: GPL-3.0-or-later + url: https://www.gnu.org/licenses/gpl-3.0.html + +servers: + - url: https://forky.mainnet.ethpandaops.io + description: Mainnet public instance + - url: https://forky.hoodi.ethpandaops.io + description: Hoodi public instance + +tags: + - name: Ethereum + description: Ethereum network timing and spec information. + - name: Metadata + description: Query stored fork-choice frame metadata. + - name: Frames + description: Retrieve individual fork-choice frames. + +paths: + /api/v1/ethereum/now: + get: + operationId: getEthereumNow + summary: Get the current wall-clock slot and epoch + tags: + - Ethereum + responses: + "200": + description: The current wall-clock slot and epoch. + headers: + Cache-Control: + $ref: "#/components/headers/CacheControl" + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + $ref: "#/components/schemas/EthereumNow" + "400": + $ref: "#/components/responses/BadRequest" + default: + $ref: "#/components/responses/UnexpectedError" + + /api/v1/ethereum/spec: + get: + operationId: getEthereumSpec + summary: Get the Ethereum network name and spec + tags: + - Ethereum + responses: + "200": + description: The configured network name and spec. + headers: + Cache-Control: + $ref: "#/components/headers/CacheControl" + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + $ref: "#/components/schemas/EthereumSpecResult" + "400": + $ref: "#/components/responses/BadRequest" + default: + $ref: "#/components/responses/UnexpectedError" + + /api/v1/frames/{id}: + get: + operationId: getFrame + summary: Get a single fork-choice frame by ID + tags: + - Frames + parameters: + - name: id + in: path + required: true + description: The frame ID. + schema: + type: string + responses: + "200": + description: The requested fork-choice frame. + headers: + Cache-Control: + $ref: "#/components/headers/CacheControl" + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + type: object + required: [frame] + properties: + frame: + $ref: "#/components/schemas/Frame" + "404": + $ref: "#/components/responses/NotFound" + default: + $ref: "#/components/responses/UnexpectedError" + + /api/v1/metadata: + post: + operationId: listMetadata + summary: List fork-choice frame metadata + tags: + - Metadata + requestBody: + $ref: "#/components/requestBodies/MetadataQuery" + responses: + "200": + description: A page of frame metadata. + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + type: object + required: [frames, pagination] + properties: + frames: + type: array + items: + $ref: "#/components/schemas/FrameMetadata" + pagination: + $ref: "#/components/schemas/PaginationResponse" + "400": + $ref: "#/components/responses/BadRequest" + default: + $ref: "#/components/responses/UnexpectedError" + + /api/v1/metadata/nodes: + post: + operationId: listMetadataNodes + summary: List distinct nodes across stored frames + tags: + - Metadata + requestBody: + $ref: "#/components/requestBodies/MetadataQuery" + responses: + "200": + description: A page of distinct node names. + headers: + Cache-Control: + $ref: "#/components/headers/CacheControl" + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + type: object + required: [nodes, pagination] + properties: + nodes: + type: array + items: + type: string + pagination: + $ref: "#/components/schemas/PaginationResponse" + "400": + $ref: "#/components/responses/BadRequest" + default: + $ref: "#/components/responses/UnexpectedError" + + /api/v1/metadata/slots: + post: + operationId: listMetadataSlots + summary: List distinct slots across stored frames + tags: + - Metadata + requestBody: + $ref: "#/components/requestBodies/MetadataQuery" + responses: + "200": + description: A page of distinct slots. + headers: + Cache-Control: + $ref: "#/components/headers/CacheControl" + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + type: object + required: [slots, pagination] + properties: + slots: + type: array + items: + $ref: "#/components/schemas/Slot" + pagination: + $ref: "#/components/schemas/PaginationResponse" + "400": + $ref: "#/components/responses/BadRequest" + default: + $ref: "#/components/responses/UnexpectedError" + + /api/v1/metadata/epochs: + post: + operationId: listMetadataEpochs + summary: List distinct epochs across stored frames + tags: + - Metadata + requestBody: + $ref: "#/components/requestBodies/MetadataQuery" + responses: + "200": + description: A page of distinct epochs. + headers: + Cache-Control: + $ref: "#/components/headers/CacheControl" + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + type: object + required: [epochs, pagination] + properties: + epochs: + type: array + items: + $ref: "#/components/schemas/Epoch" + pagination: + $ref: "#/components/schemas/PaginationResponse" + "400": + $ref: "#/components/responses/BadRequest" + default: + $ref: "#/components/responses/UnexpectedError" + + /api/v1/metadata/labels: + post: + operationId: listMetadataLabels + summary: List distinct labels across stored frames + tags: + - Metadata + requestBody: + $ref: "#/components/requestBodies/MetadataQuery" + responses: + "200": + description: A page of distinct labels. + headers: + Cache-Control: + $ref: "#/components/headers/CacheControl" + content: + application/json: + schema: + type: object + required: [data] + properties: + data: + type: object + required: [labels, pagination] + properties: + labels: + type: array + items: + type: string + pagination: + $ref: "#/components/schemas/PaginationResponse" + "400": + $ref: "#/components/responses/BadRequest" + default: + $ref: "#/components/responses/UnexpectedError" + +components: + headers: + CacheControl: + description: Caching directives for the response. + schema: + type: string + + requestBodies: + MetadataQuery: + description: Filter and pagination for a metadata query. + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/MetadataQuery" + + responses: + BadRequest: + description: The request was malformed. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + NotFound: + description: The requested resource was not found. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + UnexpectedError: + description: An unexpected error occurred. + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + schemas: + Slot: + type: integer + format: int64 + minimum: 0 + description: A beacon-chain slot number. + example: 7654321 + Epoch: + type: integer + format: int64 + minimum: 0 + description: A beacon-chain epoch number. + example: 239197 + SlotString: + type: string + description: | + A beacon-chain slot number serialized as a string, following the + beacon-API convention used by the fork-choice dump. + example: "7654321" + EpochString: + type: string + description: | + A beacon-chain epoch number serialized as a string, following the + beacon-API convention used by the fork-choice dump. + example: "239197" + Root: + type: string + description: A 32-byte hex-encoded root. + example: "0x0000000000000000000000000000000000000000000000000000000000000000" + + Error: + type: object + required: [code, message] + properties: + code: + type: integer + description: The HTTP status code. + message: + type: string + description: A human-readable error message. + + PaginationCursor: + type: object + description: Offset-based pagination cursor. + properties: + offset: + type: integer + description: The number of items to skip. + default: 0 + limit: + type: integer + description: The maximum number of items to return. + default: 1000 + + PaginationResponse: + type: object + required: [total] + properties: + total: + type: integer + format: int64 + description: The total number of matching items. + + FrameFilter: + type: object + description: Filters applied to a frame query. All fields are optional. + properties: + node: + type: string + before: + type: string + format: date-time + after: + type: string + format: date-time + slot: + $ref: "#/components/schemas/Slot" + epoch: + $ref: "#/components/schemas/Epoch" + labels: + type: array + items: + type: string + consensus_client: + type: string + event_source: + type: string + + MetadataQuery: + type: object + properties: + filter: + $ref: "#/components/schemas/FrameFilter" + pagination: + $ref: "#/components/schemas/PaginationCursor" + + FrameMetadata: + type: object + required: + - id + - node + - fetched_at + - wall_clock_slot + - wall_clock_epoch + - labels + - consensus_client + - event_source + properties: + id: + type: string + description: The frame ID. + node: + type: string + description: | + The node that provided the frame. For a beacon node this is the + configured node ID; for Xatu it is the Xatu Sentry ID. + fetched_at: + type: string + format: date-time + description: When the frame was fetched. + wall_clock_slot: + $ref: "#/components/schemas/Slot" + wall_clock_epoch: + $ref: "#/components/schemas/Epoch" + labels: + type: array + items: + type: string + consensus_client: + type: string + event_source: + type: string + + Checkpoint: + type: object + required: [epoch, root] + properties: + epoch: + $ref: "#/components/schemas/EpochString" + root: + $ref: "#/components/schemas/Root" + + ForkChoiceNode: + type: object + required: + - slot + - block_root + - parent_root + - justified_epoch + - finalized_epoch + - weight + - validity + - execution_block_hash + properties: + slot: + $ref: "#/components/schemas/SlotString" + block_root: + $ref: "#/components/schemas/Root" + parent_root: + $ref: "#/components/schemas/Root" + justified_epoch: + $ref: "#/components/schemas/EpochString" + finalized_epoch: + $ref: "#/components/schemas/EpochString" + weight: + type: string + description: The node's fork-choice weight, serialized as a string. + validity: + type: string + description: The node's validity status. + enum: [valid, invalid, optimistic, unknown] + execution_block_hash: + $ref: "#/components/schemas/Root" + extra_data: + type: object + additionalProperties: true + + ForkChoice: + type: object + description: A beacon node's fork-choice dump. + required: [justified_checkpoint, finalized_checkpoint, fork_choice_nodes] + properties: + justified_checkpoint: + $ref: "#/components/schemas/Checkpoint" + finalized_checkpoint: + $ref: "#/components/schemas/Checkpoint" + fork_choice_nodes: + type: array + items: + $ref: "#/components/schemas/ForkChoiceNode" + + Frame: + type: object + required: [data, metadata] + properties: + data: + $ref: "#/components/schemas/ForkChoice" + metadata: + $ref: "#/components/schemas/FrameMetadata" + + EthereumNow: + type: object + required: [slot, epoch] + properties: + slot: + $ref: "#/components/schemas/Slot" + epoch: + $ref: "#/components/schemas/Epoch" + + EthereumSpec: + type: object + required: [seconds_per_slot, slots_per_epoch, genesis_time] + properties: + seconds_per_slot: + type: integer + format: int64 + slots_per_epoch: + type: integer + format: int64 + genesis_time: + type: string + format: date-time + + EthereumSpecResult: + type: object + required: [network_name, spec] + properties: + network_name: + type: string + spec: + $ref: "#/components/schemas/EthereumSpec" diff --git a/api/rest/oas_cfg_gen.go b/api/rest/oas_cfg_gen.go new file mode 100644 index 0000000..9d5a059 --- /dev/null +++ b/api/rest/oas_cfg_gen.go @@ -0,0 +1,318 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "net/http" + "strings" + + ht "github.com/ogen-go/ogen/http" + "github.com/ogen-go/ogen/middleware" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/otelogen" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" +) + +var ( + // Allocate option closure once. + clientSpanKind = trace.WithSpanKind(trace.SpanKindClient) + // Allocate option closure once. + serverSpanKind = trace.WithSpanKind(trace.SpanKindServer) +) + +type ( + optionFunc[C any] func(*C) + otelOptionFunc func(*otelConfig) +) + +type otelConfig struct { + TracerProvider trace.TracerProvider + Tracer trace.Tracer + MeterProvider metric.MeterProvider + Meter metric.Meter + Attributes []attribute.KeyValue +} + +func (cfg *otelConfig) initOTEL() { + if cfg.TracerProvider == nil { + cfg.TracerProvider = otel.GetTracerProvider() + } + if cfg.MeterProvider == nil { + cfg.MeterProvider = otel.GetMeterProvider() + } + cfg.Tracer = cfg.TracerProvider.Tracer(otelogen.Name, + trace.WithInstrumentationVersion(otelogen.SemVersion()), + ) + cfg.Meter = cfg.MeterProvider.Meter(otelogen.Name, + metric.WithInstrumentationVersion(otelogen.SemVersion()), + ) +} + +// ErrorHandler is error handler. +type ErrorHandler = ogenerrors.ErrorHandler + +type serverConfig struct { + otelConfig + NotFound http.HandlerFunc + MethodNotAllowed func(w http.ResponseWriter, r *http.Request, allowed string) + ErrorHandler ErrorHandler + Prefix string + Middleware Middleware + MaxMultipartMemory int64 +} + +// ServerOption is server config option. +type ServerOption interface { + applyServer(*serverConfig) +} + +var _ ServerOption = (optionFunc[serverConfig])(nil) + +func (o optionFunc[C]) applyServer(c *C) { + o(c) +} + +var _ ServerOption = (otelOptionFunc)(nil) + +func (o otelOptionFunc) applyServer(c *serverConfig) { + o(&c.otelConfig) +} + +func newServerConfig(opts ...ServerOption) serverConfig { + cfg := serverConfig{ + NotFound: http.NotFound, + MethodNotAllowed: nil, + ErrorHandler: ogenerrors.DefaultErrorHandler, + Middleware: nil, + MaxMultipartMemory: 32 << 20, // 32 MB + } + for _, opt := range opts { + opt.applyServer(&cfg) + } + cfg.initOTEL() + return cfg +} + +type baseServer struct { + cfg serverConfig + requests metric.Int64Counter + errors metric.Int64Counter + duration metric.Float64Histogram +} + +func (s baseServer) notFound(w http.ResponseWriter, r *http.Request) { + s.cfg.NotFound(w, r) +} + +type notAllowedParams struct { + allowedMethods string + allowedHeaders map[string]string + acceptPost string + acceptPatch string +} + +func (s baseServer) notAllowed(w http.ResponseWriter, r *http.Request, params notAllowedParams) { + h := w.Header() + isOptions := r.Method == "OPTIONS" + if isOptions { + h.Set("Access-Control-Allow-Methods", params.allowedMethods) + if params.allowedHeaders != nil { + m := r.Header.Get("Access-Control-Request-Method") + if m != "" { + allowedHeaders, ok := params.allowedHeaders[strings.ToUpper(m)] + if ok { + h.Set("Access-Control-Allow-Headers", allowedHeaders) + } + } + } + if params.acceptPost != "" { + h.Set("Accept-Post", params.acceptPost) + } + if params.acceptPatch != "" { + h.Set("Accept-Patch", params.acceptPatch) + } + } + if s.cfg.MethodNotAllowed != nil { + s.cfg.MethodNotAllowed(w, r, params.allowedMethods) + return + } + status := http.StatusNoContent + if !isOptions { + h.Set("Allow", params.allowedMethods) + status = http.StatusMethodNotAllowed + } + w.WriteHeader(status) +} + +func (cfg serverConfig) baseServer() (s baseServer, err error) { + s = baseServer{cfg: cfg} + if s.requests, err = otelogen.ServerRequestCountCounter(s.cfg.Meter); err != nil { + return s, err + } + if s.errors, err = otelogen.ServerErrorsCountCounter(s.cfg.Meter); err != nil { + return s, err + } + if s.duration, err = otelogen.ServerDurationHistogram(s.cfg.Meter); err != nil { + return s, err + } + return s, nil +} + +type clientConfig struct { + otelConfig + Client ht.Client +} + +// ClientOption is client config option. +type ClientOption interface { + applyClient(*clientConfig) +} + +var _ ClientOption = (optionFunc[clientConfig])(nil) + +func (o optionFunc[C]) applyClient(c *C) { + o(c) +} + +var _ ClientOption = (otelOptionFunc)(nil) + +func (o otelOptionFunc) applyClient(c *clientConfig) { + o(&c.otelConfig) +} + +func newClientConfig(opts ...ClientOption) clientConfig { + cfg := clientConfig{ + Client: http.DefaultClient, + } + for _, opt := range opts { + opt.applyClient(&cfg) + } + cfg.initOTEL() + return cfg +} + +type baseClient struct { + cfg clientConfig + requests metric.Int64Counter + errors metric.Int64Counter + duration metric.Float64Histogram +} + +func (cfg clientConfig) baseClient() (c baseClient, err error) { + c = baseClient{cfg: cfg} + if c.requests, err = otelogen.ClientRequestCountCounter(c.cfg.Meter); err != nil { + return c, err + } + if c.errors, err = otelogen.ClientErrorsCountCounter(c.cfg.Meter); err != nil { + return c, err + } + if c.duration, err = otelogen.ClientDurationHistogram(c.cfg.Meter); err != nil { + return c, err + } + return c, nil +} + +// Option is config option. +type Option interface { + ServerOption + ClientOption +} + +// WithTracerProvider specifies a tracer provider to use for creating a tracer. +// +// If none is specified, the global provider is used. +func WithTracerProvider(provider trace.TracerProvider) Option { + return otelOptionFunc(func(cfg *otelConfig) { + if provider != nil { + cfg.TracerProvider = provider + } + }) +} + +// WithMeterProvider specifies a meter provider to use for creating a meter. +// +// If none is specified, the otel.GetMeterProvider() is used. +func WithMeterProvider(provider metric.MeterProvider) Option { + return otelOptionFunc(func(cfg *otelConfig) { + if provider != nil { + cfg.MeterProvider = provider + } + }) +} + +// WithAttributes specifies default otel attributes. +func WithAttributes(attributes ...attribute.KeyValue) Option { + return otelOptionFunc(func(cfg *otelConfig) { + cfg.Attributes = attributes + }) +} + +// WithClient specifies http client to use. +func WithClient(client ht.Client) ClientOption { + return optionFunc[clientConfig](func(cfg *clientConfig) { + if client != nil { + cfg.Client = client + } + }) +} + +// WithNotFound specifies Not Found handler to use. +func WithNotFound(notFound http.HandlerFunc) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if notFound != nil { + cfg.NotFound = notFound + } + }) +} + +// WithMethodNotAllowed specifies Method Not Allowed handler to use. +func WithMethodNotAllowed(methodNotAllowed func(w http.ResponseWriter, r *http.Request, allowed string)) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if methodNotAllowed != nil { + cfg.MethodNotAllowed = methodNotAllowed + } + }) +} + +// WithErrorHandler specifies error handler to use. +func WithErrorHandler(h ErrorHandler) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if h != nil { + cfg.ErrorHandler = h + } + }) +} + +// WithPathPrefix specifies server path prefix. +func WithPathPrefix(prefix string) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + cfg.Prefix = prefix + }) +} + +// WithMiddleware specifies middlewares to use. +func WithMiddleware(m ...Middleware) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + switch len(m) { + case 0: + cfg.Middleware = nil + case 1: + cfg.Middleware = m[0] + default: + cfg.Middleware = middleware.ChainMiddlewares(m...) + } + }) +} + +// WithMaxMultipartMemory specifies limit of memory for storing file parts. +// File parts which can't be stored in memory will be stored on disk in temporary files. +func WithMaxMultipartMemory(max int64) ServerOption { + return optionFunc[serverConfig](func(cfg *serverConfig) { + if max > 0 { + cfg.MaxMultipartMemory = max + } + }) +} diff --git a/api/rest/oas_client_gen.go b/api/rest/oas_client_gen.go new file mode 100644 index 0000000..b180041 --- /dev/null +++ b/api/rest/oas_client_gen.go @@ -0,0 +1,742 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "context" + "net/url" + "strings" + "time" + + "github.com/go-faster/errors" + "github.com/ogen-go/ogen/conv" + ht "github.com/ogen-go/ogen/http" + "github.com/ogen-go/ogen/otelogen" + "github.com/ogen-go/ogen/uri" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + semconv "go.opentelemetry.io/otel/semconv/v1.39.0" + "go.opentelemetry.io/otel/trace" +) + +func trimTrailingSlashes(u *url.URL) { + u.Path = strings.TrimRight(u.Path, "/") + u.RawPath = strings.TrimRight(u.RawPath, "/") +} + +// Invoker invokes operations described by OpenAPI v3 specification. +type Invoker interface { + // GetEthereumNow invokes getEthereumNow operation. + // + // Get the current wall-clock slot and epoch. + // + // GET /api/v1/ethereum/now + GetEthereumNow(ctx context.Context) (GetEthereumNowRes, error) + // GetEthereumSpec invokes getEthereumSpec operation. + // + // Get the Ethereum network name and spec. + // + // GET /api/v1/ethereum/spec + GetEthereumSpec(ctx context.Context) (GetEthereumSpecRes, error) + // GetFrame invokes getFrame operation. + // + // Get a single fork-choice frame by ID. + // + // GET /api/v1/frames/{id} + GetFrame(ctx context.Context, params GetFrameParams) (GetFrameRes, error) + // ListMetadata invokes listMetadata operation. + // + // List fork-choice frame metadata. + // + // POST /api/v1/metadata + ListMetadata(ctx context.Context, request *MetadataQuery) (ListMetadataRes, error) + // ListMetadataEpochs invokes listMetadataEpochs operation. + // + // List distinct epochs across stored frames. + // + // POST /api/v1/metadata/epochs + ListMetadataEpochs(ctx context.Context, request *MetadataQuery) (ListMetadataEpochsRes, error) + // ListMetadataLabels invokes listMetadataLabels operation. + // + // List distinct labels across stored frames. + // + // POST /api/v1/metadata/labels + ListMetadataLabels(ctx context.Context, request *MetadataQuery) (ListMetadataLabelsRes, error) + // ListMetadataNodes invokes listMetadataNodes operation. + // + // List distinct nodes across stored frames. + // + // POST /api/v1/metadata/nodes + ListMetadataNodes(ctx context.Context, request *MetadataQuery) (ListMetadataNodesRes, error) + // ListMetadataSlots invokes listMetadataSlots operation. + // + // List distinct slots across stored frames. + // + // POST /api/v1/metadata/slots + ListMetadataSlots(ctx context.Context, request *MetadataQuery) (ListMetadataSlotsRes, error) +} + +// Client implements OAS client. +type Client struct { + serverURL *url.URL + baseClient +} + +// NewClient initializes new Client defined by OAS. +func NewClient(serverURL string, opts ...ClientOption) (*Client, error) { + u, err := url.Parse(serverURL) + if err != nil { + return nil, err + } + trimTrailingSlashes(u) + + c, err := newClientConfig(opts...).baseClient() + if err != nil { + return nil, err + } + return &Client{ + serverURL: u, + baseClient: c, + }, nil +} + +type serverURLKey struct{} + +// WithServerURL sets context key to override server URL. +func WithServerURL(ctx context.Context, u *url.URL) context.Context { + return context.WithValue(ctx, serverURLKey{}, u) +} + +func (c *Client) requestURL(ctx context.Context) *url.URL { + u, ok := ctx.Value(serverURLKey{}).(*url.URL) + if !ok { + return c.serverURL + } + return u +} + +// GetEthereumNow invokes getEthereumNow operation. +// +// Get the current wall-clock slot and epoch. +// +// GET /api/v1/ethereum/now +func (c *Client) GetEthereumNow(ctx context.Context) (GetEthereumNowRes, error) { + res, err := c.sendGetEthereumNow(ctx) + return res, err +} + +func (c *Client) sendGetEthereumNow(ctx context.Context) (res GetEthereumNowRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getEthereumNow"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.URLTemplateKey.String("/api/v1/ethereum/now"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, GetEthereumNowOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/api/v1/ethereum/now" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeGetEthereumNowResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// GetEthereumSpec invokes getEthereumSpec operation. +// +// Get the Ethereum network name and spec. +// +// GET /api/v1/ethereum/spec +func (c *Client) GetEthereumSpec(ctx context.Context) (GetEthereumSpecRes, error) { + res, err := c.sendGetEthereumSpec(ctx) + return res, err +} + +func (c *Client) sendGetEthereumSpec(ctx context.Context) (res GetEthereumSpecRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getEthereumSpec"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.URLTemplateKey.String("/api/v1/ethereum/spec"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, GetEthereumSpecOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/api/v1/ethereum/spec" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeGetEthereumSpecResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// GetFrame invokes getFrame operation. +// +// Get a single fork-choice frame by ID. +// +// GET /api/v1/frames/{id} +func (c *Client) GetFrame(ctx context.Context, params GetFrameParams) (GetFrameRes, error) { + res, err := c.sendGetFrame(ctx, params) + return res, err +} + +func (c *Client) sendGetFrame(ctx context.Context, params GetFrameParams) (res GetFrameRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getFrame"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.URLTemplateKey.String("/api/v1/frames/{id}"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, GetFrameOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [2]string + pathParts[0] = "/api/v1/frames/" + { + // Encode "id" parameter. + e := uri.NewPathEncoder(uri.PathEncoderConfig{ + Param: "id", + Style: uri.PathStyleSimple, + Explode: false, + }) + if err := func() error { + return e.EncodeValue(conv.StringToString(params.ID)) + }(); err != nil { + return res, errors.Wrap(err, "encode path") + } + encoded, err := e.Result() + if err != nil { + return res, errors.Wrap(err, "encode path") + } + pathParts[1] = encoded + } + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeGetFrameResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ListMetadata invokes listMetadata operation. +// +// List fork-choice frame metadata. +// +// POST /api/v1/metadata +func (c *Client) ListMetadata(ctx context.Context, request *MetadataQuery) (ListMetadataRes, error) { + res, err := c.sendListMetadata(ctx, request) + return res, err +} + +func (c *Client) sendListMetadata(ctx context.Context, request *MetadataQuery) (res ListMetadataRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadata"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/api/v1/metadata"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, ListMetadataOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/api/v1/metadata" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeListMetadataRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeListMetadataResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ListMetadataEpochs invokes listMetadataEpochs operation. +// +// List distinct epochs across stored frames. +// +// POST /api/v1/metadata/epochs +func (c *Client) ListMetadataEpochs(ctx context.Context, request *MetadataQuery) (ListMetadataEpochsRes, error) { + res, err := c.sendListMetadataEpochs(ctx, request) + return res, err +} + +func (c *Client) sendListMetadataEpochs(ctx context.Context, request *MetadataQuery) (res ListMetadataEpochsRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataEpochs"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/api/v1/metadata/epochs"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, ListMetadataEpochsOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/api/v1/metadata/epochs" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeListMetadataEpochsRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeListMetadataEpochsResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ListMetadataLabels invokes listMetadataLabels operation. +// +// List distinct labels across stored frames. +// +// POST /api/v1/metadata/labels +func (c *Client) ListMetadataLabels(ctx context.Context, request *MetadataQuery) (ListMetadataLabelsRes, error) { + res, err := c.sendListMetadataLabels(ctx, request) + return res, err +} + +func (c *Client) sendListMetadataLabels(ctx context.Context, request *MetadataQuery) (res ListMetadataLabelsRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataLabels"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/api/v1/metadata/labels"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, ListMetadataLabelsOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/api/v1/metadata/labels" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeListMetadataLabelsRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeListMetadataLabelsResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ListMetadataNodes invokes listMetadataNodes operation. +// +// List distinct nodes across stored frames. +// +// POST /api/v1/metadata/nodes +func (c *Client) ListMetadataNodes(ctx context.Context, request *MetadataQuery) (ListMetadataNodesRes, error) { + res, err := c.sendListMetadataNodes(ctx, request) + return res, err +} + +func (c *Client) sendListMetadataNodes(ctx context.Context, request *MetadataQuery) (res ListMetadataNodesRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataNodes"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/api/v1/metadata/nodes"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, ListMetadataNodesOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/api/v1/metadata/nodes" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeListMetadataNodesRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeListMetadataNodesResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + +// ListMetadataSlots invokes listMetadataSlots operation. +// +// List distinct slots across stored frames. +// +// POST /api/v1/metadata/slots +func (c *Client) ListMetadataSlots(ctx context.Context, request *MetadataQuery) (ListMetadataSlotsRes, error) { + res, err := c.sendListMetadataSlots(ctx, request) + return res, err +} + +func (c *Client) sendListMetadataSlots(ctx context.Context, request *MetadataQuery) (res ListMetadataSlotsRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataSlots"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/api/v1/metadata/slots"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, ListMetadataSlotsOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/api/v1/metadata/slots" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodeListMetadataSlotsRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeListMetadataSlotsResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} diff --git a/api/rest/oas_defaults_gen.go b/api/rest/oas_defaults_gen.go new file mode 100644 index 0000000..9f9b5ee --- /dev/null +++ b/api/rest/oas_defaults_gen.go @@ -0,0 +1,15 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +// setDefaults set default value of fields. +func (s *PaginationCursor) setDefaults() { + { + val := int(0) + s.Offset.SetTo(val) + } + { + val := int(1000) + s.Limit.SetTo(val) + } +} diff --git a/api/rest/oas_handlers_gen.go b/api/rest/oas_handlers_gen.go new file mode 100644 index 0000000..01277a6 --- /dev/null +++ b/api/rest/oas_handlers_gen.go @@ -0,0 +1,1228 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "context" + "net/http" + "time" + + "github.com/go-faster/errors" + ht "github.com/ogen-go/ogen/http" + "github.com/ogen-go/ogen/middleware" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/otelogen" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + semconv "go.opentelemetry.io/otel/semconv/v1.39.0" + "go.opentelemetry.io/otel/trace" +) + +type codeRecorder struct { + http.ResponseWriter + status int +} + +func (c *codeRecorder) WriteHeader(status int) { + c.status = status + c.ResponseWriter.WriteHeader(status) +} + +func (c *codeRecorder) Unwrap() http.ResponseWriter { + return c.ResponseWriter +} + +// handleGetEthereumNowRequest handles getEthereumNow operation. +// +// Get the current wall-clock slot and epoch. +// +// GET /api/v1/ethereum/now +func (s *Server) handleGetEthereumNowRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getEthereumNow"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/api/v1/ethereum/now"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetEthereumNowOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + ) + + var rawBody []byte + + var response GetEthereumNowRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetEthereumNowOperation, + OperationSummary: "Get the current wall-clock slot and epoch", + OperationID: "getEthereumNow", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = struct{} + Params = struct{} + Response = GetEthereumNowRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetEthereumNow(ctx) + return response, err + }, + ) + } else { + response, err = s.h.GetEthereumNow(ctx) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeGetEthereumNowResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleGetEthereumSpecRequest handles getEthereumSpec operation. +// +// Get the Ethereum network name and spec. +// +// GET /api/v1/ethereum/spec +func (s *Server) handleGetEthereumSpecRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getEthereumSpec"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/api/v1/ethereum/spec"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetEthereumSpecOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + ) + + var rawBody []byte + + var response GetEthereumSpecRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetEthereumSpecOperation, + OperationSummary: "Get the Ethereum network name and spec", + OperationID: "getEthereumSpec", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = struct{} + Params = struct{} + Response = GetEthereumSpecRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetEthereumSpec(ctx) + return response, err + }, + ) + } else { + response, err = s.h.GetEthereumSpec(ctx) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeGetEthereumSpecResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleGetFrameRequest handles getFrame operation. +// +// Get a single fork-choice frame by ID. +// +// GET /api/v1/frames/{id} +func (s *Server) handleGetFrameRequest(args [1]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getFrame"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/api/v1/frames/{id}"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetFrameOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: GetFrameOperation, + ID: "getFrame", + } + ) + params, err := decodeGetFrameParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var rawBody []byte + + var response GetFrameRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetFrameOperation, + OperationSummary: "Get a single fork-choice frame by ID", + OperationID: "getFrame", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{ + { + Name: "id", + In: "path", + }: params.ID, + }, + Raw: r, + } + + type ( + Request = struct{} + Params = GetFrameParams + Response = GetFrameRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackGetFrameParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetFrame(ctx, params) + return response, err + }, + ) + } else { + response, err = s.h.GetFrame(ctx, params) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeGetFrameResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleListMetadataRequest handles listMetadata operation. +// +// List fork-choice frame metadata. +// +// POST /api/v1/metadata +func (s *Server) handleListMetadataRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadata"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/api/v1/metadata"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListMetadataOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: ListMetadataOperation, + ID: "listMetadata", + } + ) + + var rawBody []byte + request, rawBody, close, err := s.decodeListMetadataRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response ListMetadataRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListMetadataOperation, + OperationSummary: "List fork-choice frame metadata", + OperationID: "listMetadata", + Body: request, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *MetadataQuery + Params = struct{} + Response = ListMetadataRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListMetadata(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.ListMetadata(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeListMetadataResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleListMetadataEpochsRequest handles listMetadataEpochs operation. +// +// List distinct epochs across stored frames. +// +// POST /api/v1/metadata/epochs +func (s *Server) handleListMetadataEpochsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataEpochs"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/api/v1/metadata/epochs"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListMetadataEpochsOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: ListMetadataEpochsOperation, + ID: "listMetadataEpochs", + } + ) + + var rawBody []byte + request, rawBody, close, err := s.decodeListMetadataEpochsRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response ListMetadataEpochsRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListMetadataEpochsOperation, + OperationSummary: "List distinct epochs across stored frames", + OperationID: "listMetadataEpochs", + Body: request, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *MetadataQuery + Params = struct{} + Response = ListMetadataEpochsRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListMetadataEpochs(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.ListMetadataEpochs(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeListMetadataEpochsResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleListMetadataLabelsRequest handles listMetadataLabels operation. +// +// List distinct labels across stored frames. +// +// POST /api/v1/metadata/labels +func (s *Server) handleListMetadataLabelsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataLabels"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/api/v1/metadata/labels"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListMetadataLabelsOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: ListMetadataLabelsOperation, + ID: "listMetadataLabels", + } + ) + + var rawBody []byte + request, rawBody, close, err := s.decodeListMetadataLabelsRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response ListMetadataLabelsRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListMetadataLabelsOperation, + OperationSummary: "List distinct labels across stored frames", + OperationID: "listMetadataLabels", + Body: request, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *MetadataQuery + Params = struct{} + Response = ListMetadataLabelsRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListMetadataLabels(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.ListMetadataLabels(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeListMetadataLabelsResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleListMetadataNodesRequest handles listMetadataNodes operation. +// +// List distinct nodes across stored frames. +// +// POST /api/v1/metadata/nodes +func (s *Server) handleListMetadataNodesRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataNodes"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/api/v1/metadata/nodes"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListMetadataNodesOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: ListMetadataNodesOperation, + ID: "listMetadataNodes", + } + ) + + var rawBody []byte + request, rawBody, close, err := s.decodeListMetadataNodesRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response ListMetadataNodesRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListMetadataNodesOperation, + OperationSummary: "List distinct nodes across stored frames", + OperationID: "listMetadataNodes", + Body: request, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *MetadataQuery + Params = struct{} + Response = ListMetadataNodesRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListMetadataNodes(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.ListMetadataNodes(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeListMetadataNodesResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + +// handleListMetadataSlotsRequest handles listMetadataSlots operation. +// +// List distinct slots across stored frames. +// +// POST /api/v1/metadata/slots +func (s *Server) handleListMetadataSlotsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("listMetadataSlots"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/api/v1/metadata/slots"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), ListMetadataSlotsOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: ListMetadataSlotsOperation, + ID: "listMetadataSlots", + } + ) + + var rawBody []byte + request, rawBody, close, err := s.decodeListMetadataSlotsRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response ListMetadataSlotsRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: ListMetadataSlotsOperation, + OperationSummary: "List distinct slots across stored frames", + OperationID: "listMetadataSlots", + Body: request, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *MetadataQuery + Params = struct{} + Response = ListMetadataSlotsRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.ListMetadataSlots(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.ListMetadataSlots(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*UnexpectedErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeListMetadataSlotsResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} diff --git a/api/rest/oas_interfaces_gen.go b/api/rest/oas_interfaces_gen.go new file mode 100644 index 0000000..f786f4a --- /dev/null +++ b/api/rest/oas_interfaces_gen.go @@ -0,0 +1,34 @@ +// Code generated by ogen, DO NOT EDIT. +package rest + +type GetEthereumNowRes interface { + getEthereumNowRes() +} + +type GetEthereumSpecRes interface { + getEthereumSpecRes() +} + +type GetFrameRes interface { + getFrameRes() +} + +type ListMetadataEpochsRes interface { + listMetadataEpochsRes() +} + +type ListMetadataLabelsRes interface { + listMetadataLabelsRes() +} + +type ListMetadataNodesRes interface { + listMetadataNodesRes() +} + +type ListMetadataRes interface { + listMetadataRes() +} + +type ListMetadataSlotsRes interface { + listMetadataSlotsRes() +} diff --git a/api/rest/oas_json_gen.go b/api/rest/oas_json_gen.go new file mode 100644 index 0000000..33952ec --- /dev/null +++ b/api/rest/oas_json_gen.go @@ -0,0 +1,3753 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "math/bits" + "strconv" + "time" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + "github.com/ogen-go/ogen/json" + "github.com/ogen-go/ogen/validate" +) + +// Encode implements json.Marshaler. +func (s *Checkpoint) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *Checkpoint) encodeFields(e *jx.Encoder) { + { + e.FieldStart("epoch") + s.Epoch.Encode(e) + } + { + e.FieldStart("root") + s.Root.Encode(e) + } +} + +var jsonFieldsNameOfCheckpoint = [2]string{ + 0: "epoch", + 1: "root", +} + +// Decode decodes Checkpoint from json. +func (s *Checkpoint) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Checkpoint to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "epoch": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Epoch.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"epoch\"") + } + case "root": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Root.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"root\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode Checkpoint") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfCheckpoint) { + name = jsonFieldsNameOfCheckpoint[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *Checkpoint) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Checkpoint) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes Epoch as json. +func (s Epoch) Encode(e *jx.Encoder) { + unwrapped := int64(s) + + e.Int64(unwrapped) +} + +// Decode decodes Epoch from json. +func (s *Epoch) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Epoch to nil") + } + var unwrapped int64 + if err := func() error { + v, err := d.Int64() + unwrapped = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = Epoch(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s Epoch) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Epoch) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes EpochString as json. +func (s EpochString) Encode(e *jx.Encoder) { + unwrapped := string(s) + + e.Str(unwrapped) +} + +// Decode decodes EpochString from json. +func (s *EpochString) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode EpochString to nil") + } + var unwrapped string + if err := func() error { + v, err := d.Str() + unwrapped = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = EpochString(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s EpochString) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *EpochString) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *Error) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *Error) encodeFields(e *jx.Encoder) { + { + e.FieldStart("code") + e.Int(s.Code) + } + { + e.FieldStart("message") + e.Str(s.Message) + } +} + +var jsonFieldsNameOfError = [2]string{ + 0: "code", + 1: "message", +} + +// Decode decodes Error from json. +func (s *Error) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Error to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "code": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int() + s.Code = int(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"code\"") + } + case "message": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Message = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode Error") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfError) { + name = jsonFieldsNameOfError[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *Error) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Error) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *EthereumNow) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *EthereumNow) encodeFields(e *jx.Encoder) { + { + e.FieldStart("slot") + s.Slot.Encode(e) + } + { + e.FieldStart("epoch") + s.Epoch.Encode(e) + } +} + +var jsonFieldsNameOfEthereumNow = [2]string{ + 0: "slot", + 1: "epoch", +} + +// Decode decodes EthereumNow from json. +func (s *EthereumNow) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode EthereumNow to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "slot": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Slot.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"slot\"") + } + case "epoch": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Epoch.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"epoch\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode EthereumNow") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfEthereumNow) { + name = jsonFieldsNameOfEthereumNow[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *EthereumNow) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *EthereumNow) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *EthereumSpec) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *EthereumSpec) encodeFields(e *jx.Encoder) { + { + e.FieldStart("seconds_per_slot") + e.Int64(s.SecondsPerSlot) + } + { + e.FieldStart("slots_per_epoch") + e.Int64(s.SlotsPerEpoch) + } + { + e.FieldStart("genesis_time") + json.EncodeDateTime(e, s.GenesisTime) + } +} + +var jsonFieldsNameOfEthereumSpec = [3]string{ + 0: "seconds_per_slot", + 1: "slots_per_epoch", + 2: "genesis_time", +} + +// Decode decodes EthereumSpec from json. +func (s *EthereumSpec) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode EthereumSpec to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "seconds_per_slot": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.SecondsPerSlot = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"seconds_per_slot\"") + } + case "slots_per_epoch": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int64() + s.SlotsPerEpoch = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"slots_per_epoch\"") + } + case "genesis_time": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.GenesisTime = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"genesis_time\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode EthereumSpec") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfEthereumSpec) { + name = jsonFieldsNameOfEthereumSpec[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *EthereumSpec) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *EthereumSpec) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *EthereumSpecResult) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *EthereumSpecResult) encodeFields(e *jx.Encoder) { + { + e.FieldStart("network_name") + e.Str(s.NetworkName) + } + { + e.FieldStart("spec") + s.Spec.Encode(e) + } +} + +var jsonFieldsNameOfEthereumSpecResult = [2]string{ + 0: "network_name", + 1: "spec", +} + +// Decode decodes EthereumSpecResult from json. +func (s *EthereumSpecResult) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode EthereumSpecResult to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "network_name": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.NetworkName = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"network_name\"") + } + case "spec": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Spec.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"spec\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode EthereumSpecResult") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfEthereumSpecResult) { + name = jsonFieldsNameOfEthereumSpecResult[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *EthereumSpecResult) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *EthereumSpecResult) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ForkChoice) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ForkChoice) encodeFields(e *jx.Encoder) { + { + e.FieldStart("justified_checkpoint") + s.JustifiedCheckpoint.Encode(e) + } + { + e.FieldStart("finalized_checkpoint") + s.FinalizedCheckpoint.Encode(e) + } + { + e.FieldStart("fork_choice_nodes") + e.ArrStart() + for _, elem := range s.ForkChoiceNodes { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfForkChoice = [3]string{ + 0: "justified_checkpoint", + 1: "finalized_checkpoint", + 2: "fork_choice_nodes", +} + +// Decode decodes ForkChoice from json. +func (s *ForkChoice) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ForkChoice to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "justified_checkpoint": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.JustifiedCheckpoint.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"justified_checkpoint\"") + } + case "finalized_checkpoint": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.FinalizedCheckpoint.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"finalized_checkpoint\"") + } + case "fork_choice_nodes": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + s.ForkChoiceNodes = make([]ForkChoiceNode, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem ForkChoiceNode + if err := elem.Decode(d); err != nil { + return err + } + s.ForkChoiceNodes = append(s.ForkChoiceNodes, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"fork_choice_nodes\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ForkChoice") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfForkChoice) { + name = jsonFieldsNameOfForkChoice[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ForkChoice) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ForkChoice) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ForkChoiceNode) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ForkChoiceNode) encodeFields(e *jx.Encoder) { + { + e.FieldStart("slot") + s.Slot.Encode(e) + } + { + e.FieldStart("block_root") + s.BlockRoot.Encode(e) + } + { + e.FieldStart("parent_root") + s.ParentRoot.Encode(e) + } + { + e.FieldStart("justified_epoch") + s.JustifiedEpoch.Encode(e) + } + { + e.FieldStart("finalized_epoch") + s.FinalizedEpoch.Encode(e) + } + { + e.FieldStart("weight") + e.Str(s.Weight) + } + { + e.FieldStart("validity") + s.Validity.Encode(e) + } + { + e.FieldStart("execution_block_hash") + s.ExecutionBlockHash.Encode(e) + } + { + if s.ExtraData.Set { + e.FieldStart("extra_data") + s.ExtraData.Encode(e) + } + } +} + +var jsonFieldsNameOfForkChoiceNode = [9]string{ + 0: "slot", + 1: "block_root", + 2: "parent_root", + 3: "justified_epoch", + 4: "finalized_epoch", + 5: "weight", + 6: "validity", + 7: "execution_block_hash", + 8: "extra_data", +} + +// Decode decodes ForkChoiceNode from json. +func (s *ForkChoiceNode) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ForkChoiceNode to nil") + } + var requiredBitSet [2]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "slot": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Slot.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"slot\"") + } + case "block_root": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.BlockRoot.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"block_root\"") + } + case "parent_root": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + if err := s.ParentRoot.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"parent_root\"") + } + case "justified_epoch": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + if err := s.JustifiedEpoch.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"justified_epoch\"") + } + case "finalized_epoch": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + if err := s.FinalizedEpoch.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"finalized_epoch\"") + } + case "weight": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + v, err := d.Str() + s.Weight = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"weight\"") + } + case "validity": + requiredBitSet[0] |= 1 << 6 + if err := func() error { + if err := s.Validity.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"validity\"") + } + case "execution_block_hash": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + if err := s.ExecutionBlockHash.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"execution_block_hash\"") + } + case "extra_data": + if err := func() error { + s.ExtraData.Reset() + if err := s.ExtraData.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"extra_data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ForkChoiceNode") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [2]uint8{ + 0b11111111, + 0b00000000, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfForkChoiceNode) { + name = jsonFieldsNameOfForkChoiceNode[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ForkChoiceNode) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ForkChoiceNode) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s ForkChoiceNodeExtraData) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields implements json.Marshaler. +func (s ForkChoiceNodeExtraData) encodeFields(e *jx.Encoder) { + for k, elem := range s { + e.FieldStart(k) + + if len(elem) != 0 { + e.Raw(elem) + } + } +} + +// Decode decodes ForkChoiceNodeExtraData from json. +func (s *ForkChoiceNodeExtraData) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ForkChoiceNodeExtraData to nil") + } + m := s.init() + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + var elem jx.Raw + if err := func() error { + v, err := d.RawAppend(nil) + elem = jx.Raw(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrapf(err, "decode field %q", k) + } + m[string(k)] = elem + return nil + }); err != nil { + return errors.Wrap(err, "decode ForkChoiceNodeExtraData") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s ForkChoiceNodeExtraData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ForkChoiceNodeExtraData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes ForkChoiceNodeValidity as json. +func (s ForkChoiceNodeValidity) Encode(e *jx.Encoder) { + e.Str(string(s)) +} + +// Decode decodes ForkChoiceNodeValidity from json. +func (s *ForkChoiceNodeValidity) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ForkChoiceNodeValidity to nil") + } + v, err := d.StrBytes() + if err != nil { + return err + } + // Try to use constant string. + switch ForkChoiceNodeValidity(v) { + case ForkChoiceNodeValidityValid: + *s = ForkChoiceNodeValidityValid + case ForkChoiceNodeValidityInvalid: + *s = ForkChoiceNodeValidityInvalid + case ForkChoiceNodeValidityOptimistic: + *s = ForkChoiceNodeValidityOptimistic + case ForkChoiceNodeValidityUnknown: + *s = ForkChoiceNodeValidityUnknown + default: + *s = ForkChoiceNodeValidity(v) + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s ForkChoiceNodeValidity) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ForkChoiceNodeValidity) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *Frame) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *Frame) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } + { + e.FieldStart("metadata") + s.Metadata.Encode(e) + } +} + +var jsonFieldsNameOfFrame = [2]string{ + 0: "data", + 1: "metadata", +} + +// Decode decodes Frame from json. +func (s *Frame) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Frame to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + case "metadata": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Metadata.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"metadata\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode Frame") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfFrame) { + name = jsonFieldsNameOfFrame[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *Frame) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Frame) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *FrameFilter) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *FrameFilter) encodeFields(e *jx.Encoder) { + { + if s.Node.Set { + e.FieldStart("node") + s.Node.Encode(e) + } + } + { + if s.Before.Set { + e.FieldStart("before") + s.Before.Encode(e, json.EncodeDateTime) + } + } + { + if s.After.Set { + e.FieldStart("after") + s.After.Encode(e, json.EncodeDateTime) + } + } + { + if s.Slot.Set { + e.FieldStart("slot") + s.Slot.Encode(e) + } + } + { + if s.Epoch.Set { + e.FieldStart("epoch") + s.Epoch.Encode(e) + } + } + { + if s.Labels != nil { + e.FieldStart("labels") + e.ArrStart() + for _, elem := range s.Labels { + e.Str(elem) + } + e.ArrEnd() + } + } + { + if s.ConsensusClient.Set { + e.FieldStart("consensus_client") + s.ConsensusClient.Encode(e) + } + } + { + if s.EventSource.Set { + e.FieldStart("event_source") + s.EventSource.Encode(e) + } + } +} + +var jsonFieldsNameOfFrameFilter = [8]string{ + 0: "node", + 1: "before", + 2: "after", + 3: "slot", + 4: "epoch", + 5: "labels", + 6: "consensus_client", + 7: "event_source", +} + +// Decode decodes FrameFilter from json. +func (s *FrameFilter) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode FrameFilter to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "node": + if err := func() error { + s.Node.Reset() + if err := s.Node.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"node\"") + } + case "before": + if err := func() error { + s.Before.Reset() + if err := s.Before.Decode(d, json.DecodeDateTime); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"before\"") + } + case "after": + if err := func() error { + s.After.Reset() + if err := s.After.Decode(d, json.DecodeDateTime); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"after\"") + } + case "slot": + if err := func() error { + s.Slot.Reset() + if err := s.Slot.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"slot\"") + } + case "epoch": + if err := func() error { + s.Epoch.Reset() + if err := s.Epoch.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"epoch\"") + } + case "labels": + if err := func() error { + s.Labels = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Labels = append(s.Labels, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"labels\"") + } + case "consensus_client": + if err := func() error { + s.ConsensusClient.Reset() + if err := s.ConsensusClient.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"consensus_client\"") + } + case "event_source": + if err := func() error { + s.EventSource.Reset() + if err := s.EventSource.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"event_source\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode FrameFilter") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *FrameFilter) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *FrameFilter) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *FrameMetadata) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *FrameMetadata) encodeFields(e *jx.Encoder) { + { + e.FieldStart("id") + e.Str(s.ID) + } + { + e.FieldStart("node") + e.Str(s.Node) + } + { + e.FieldStart("fetched_at") + json.EncodeDateTime(e, s.FetchedAt) + } + { + e.FieldStart("wall_clock_slot") + s.WallClockSlot.Encode(e) + } + { + e.FieldStart("wall_clock_epoch") + s.WallClockEpoch.Encode(e) + } + { + e.FieldStart("labels") + e.ArrStart() + for _, elem := range s.Labels { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("consensus_client") + e.Str(s.ConsensusClient) + } + { + e.FieldStart("event_source") + e.Str(s.EventSource) + } +} + +var jsonFieldsNameOfFrameMetadata = [8]string{ + 0: "id", + 1: "node", + 2: "fetched_at", + 3: "wall_clock_slot", + 4: "wall_clock_epoch", + 5: "labels", + 6: "consensus_client", + 7: "event_source", +} + +// Decode decodes FrameMetadata from json. +func (s *FrameMetadata) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode FrameMetadata to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.ID = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"id\"") + } + case "node": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Node = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"node\"") + } + case "fetched_at": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := json.DecodeDateTime(d) + s.FetchedAt = v + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"fetched_at\"") + } + case "wall_clock_slot": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + if err := s.WallClockSlot.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wall_clock_slot\"") + } + case "wall_clock_epoch": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + if err := s.WallClockEpoch.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wall_clock_epoch\"") + } + case "labels": + requiredBitSet[0] |= 1 << 5 + if err := func() error { + s.Labels = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Labels = append(s.Labels, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"labels\"") + } + case "consensus_client": + requiredBitSet[0] |= 1 << 6 + if err := func() error { + v, err := d.Str() + s.ConsensusClient = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"consensus_client\"") + } + case "event_source": + requiredBitSet[0] |= 1 << 7 + if err := func() error { + v, err := d.Str() + s.EventSource = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"event_source\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode FrameMetadata") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b11111111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfFrameMetadata) { + name = jsonFieldsNameOfFrameMetadata[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *FrameMetadata) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *FrameMetadata) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetEthereumNowOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetEthereumNowOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfGetEthereumNowOK = [1]string{ + 0: "data", +} + +// Decode decodes GetEthereumNowOK from json. +func (s *GetEthereumNowOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetEthereumNowOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetEthereumNowOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfGetEthereumNowOK) { + name = jsonFieldsNameOfGetEthereumNowOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetEthereumNowOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetEthereumNowOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetEthereumSpecOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetEthereumSpecOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfGetEthereumSpecOK = [1]string{ + 0: "data", +} + +// Decode decodes GetEthereumSpecOK from json. +func (s *GetEthereumSpecOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetEthereumSpecOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetEthereumSpecOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfGetEthereumSpecOK) { + name = jsonFieldsNameOfGetEthereumSpecOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetEthereumSpecOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetEthereumSpecOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetFrameOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetFrameOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfGetFrameOK = [1]string{ + 0: "data", +} + +// Decode decodes GetFrameOK from json. +func (s *GetFrameOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetFrameOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetFrameOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfGetFrameOK) { + name = jsonFieldsNameOfGetFrameOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetFrameOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetFrameOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetFrameOKData) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetFrameOKData) encodeFields(e *jx.Encoder) { + { + e.FieldStart("frame") + s.Frame.Encode(e) + } +} + +var jsonFieldsNameOfGetFrameOKData = [1]string{ + 0: "frame", +} + +// Decode decodes GetFrameOKData from json. +func (s *GetFrameOKData) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetFrameOKData to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "frame": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Frame.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"frame\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetFrameOKData") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfGetFrameOKData) { + name = jsonFieldsNameOfGetFrameOKData[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetFrameOKData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetFrameOKData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataEpochsOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataEpochsOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataEpochsOK = [1]string{ + 0: "data", +} + +// Decode decodes ListMetadataEpochsOK from json. +func (s *ListMetadataEpochsOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataEpochsOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataEpochsOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataEpochsOK) { + name = jsonFieldsNameOfListMetadataEpochsOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataEpochsOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataEpochsOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataEpochsOKData) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataEpochsOKData) encodeFields(e *jx.Encoder) { + { + e.FieldStart("epochs") + e.ArrStart() + for _, elem := range s.Epochs { + elem.Encode(e) + } + e.ArrEnd() + } + { + e.FieldStart("pagination") + s.Pagination.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataEpochsOKData = [2]string{ + 0: "epochs", + 1: "pagination", +} + +// Decode decodes ListMetadataEpochsOKData from json. +func (s *ListMetadataEpochsOKData) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataEpochsOKData to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "epochs": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Epochs = make([]Epoch, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem Epoch + if err := elem.Decode(d); err != nil { + return err + } + s.Epochs = append(s.Epochs, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"epochs\"") + } + case "pagination": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Pagination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"pagination\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataEpochsOKData") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataEpochsOKData) { + name = jsonFieldsNameOfListMetadataEpochsOKData[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataEpochsOKData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataEpochsOKData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataLabelsOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataLabelsOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataLabelsOK = [1]string{ + 0: "data", +} + +// Decode decodes ListMetadataLabelsOK from json. +func (s *ListMetadataLabelsOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataLabelsOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataLabelsOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataLabelsOK) { + name = jsonFieldsNameOfListMetadataLabelsOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataLabelsOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataLabelsOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataLabelsOKData) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataLabelsOKData) encodeFields(e *jx.Encoder) { + { + e.FieldStart("labels") + e.ArrStart() + for _, elem := range s.Labels { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("pagination") + s.Pagination.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataLabelsOKData = [2]string{ + 0: "labels", + 1: "pagination", +} + +// Decode decodes ListMetadataLabelsOKData from json. +func (s *ListMetadataLabelsOKData) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataLabelsOKData to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "labels": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Labels = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Labels = append(s.Labels, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"labels\"") + } + case "pagination": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Pagination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"pagination\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataLabelsOKData") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataLabelsOKData) { + name = jsonFieldsNameOfListMetadataLabelsOKData[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataLabelsOKData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataLabelsOKData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataNodesOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataNodesOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataNodesOK = [1]string{ + 0: "data", +} + +// Decode decodes ListMetadataNodesOK from json. +func (s *ListMetadataNodesOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataNodesOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataNodesOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataNodesOK) { + name = jsonFieldsNameOfListMetadataNodesOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataNodesOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataNodesOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataNodesOKData) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataNodesOKData) encodeFields(e *jx.Encoder) { + { + e.FieldStart("nodes") + e.ArrStart() + for _, elem := range s.Nodes { + e.Str(elem) + } + e.ArrEnd() + } + { + e.FieldStart("pagination") + s.Pagination.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataNodesOKData = [2]string{ + 0: "nodes", + 1: "pagination", +} + +// Decode decodes ListMetadataNodesOKData from json. +func (s *ListMetadataNodesOKData) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataNodesOKData to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "nodes": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Nodes = make([]string, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem string + v, err := d.Str() + elem = string(v) + if err != nil { + return err + } + s.Nodes = append(s.Nodes, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"nodes\"") + } + case "pagination": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Pagination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"pagination\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataNodesOKData") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataNodesOKData) { + name = jsonFieldsNameOfListMetadataNodesOKData[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataNodesOKData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataNodesOKData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataOK = [1]string{ + 0: "data", +} + +// Decode decodes ListMetadataOK from json. +func (s *ListMetadataOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataOK) { + name = jsonFieldsNameOfListMetadataOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataOKData) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataOKData) encodeFields(e *jx.Encoder) { + { + e.FieldStart("frames") + e.ArrStart() + for _, elem := range s.Frames { + elem.Encode(e) + } + e.ArrEnd() + } + { + e.FieldStart("pagination") + s.Pagination.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataOKData = [2]string{ + 0: "frames", + 1: "pagination", +} + +// Decode decodes ListMetadataOKData from json. +func (s *ListMetadataOKData) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataOKData to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "frames": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Frames = make([]FrameMetadata, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem FrameMetadata + if err := elem.Decode(d); err != nil { + return err + } + s.Frames = append(s.Frames, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"frames\"") + } + case "pagination": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Pagination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"pagination\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataOKData") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataOKData) { + name = jsonFieldsNameOfListMetadataOKData[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataOKData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataOKData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataSlotsOK) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataSlotsOK) encodeFields(e *jx.Encoder) { + { + e.FieldStart("data") + s.Data.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataSlotsOK = [1]string{ + 0: "data", +} + +// Decode decodes ListMetadataSlotsOK from json. +func (s *ListMetadataSlotsOK) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataSlotsOK to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "data": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Data.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"data\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataSlotsOK") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataSlotsOK) { + name = jsonFieldsNameOfListMetadataSlotsOK[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataSlotsOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataSlotsOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *ListMetadataSlotsOKData) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *ListMetadataSlotsOKData) encodeFields(e *jx.Encoder) { + { + e.FieldStart("slots") + e.ArrStart() + for _, elem := range s.Slots { + elem.Encode(e) + } + e.ArrEnd() + } + { + e.FieldStart("pagination") + s.Pagination.Encode(e) + } +} + +var jsonFieldsNameOfListMetadataSlotsOKData = [2]string{ + 0: "slots", + 1: "pagination", +} + +// Decode decodes ListMetadataSlotsOKData from json. +func (s *ListMetadataSlotsOKData) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode ListMetadataSlotsOKData to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "slots": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Slots = make([]Slot, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem Slot + if err := elem.Decode(d); err != nil { + return err + } + s.Slots = append(s.Slots, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"slots\"") + } + case "pagination": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + if err := s.Pagination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"pagination\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode ListMetadataSlotsOKData") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfListMetadataSlotsOKData) { + name = jsonFieldsNameOfListMetadataSlotsOKData[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *ListMetadataSlotsOKData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *ListMetadataSlotsOKData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *MetadataQuery) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *MetadataQuery) encodeFields(e *jx.Encoder) { + { + if s.Filter.Set { + e.FieldStart("filter") + s.Filter.Encode(e) + } + } + { + if s.Pagination.Set { + e.FieldStart("pagination") + s.Pagination.Encode(e) + } + } +} + +var jsonFieldsNameOfMetadataQuery = [2]string{ + 0: "filter", + 1: "pagination", +} + +// Decode decodes MetadataQuery from json. +func (s *MetadataQuery) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode MetadataQuery to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "filter": + if err := func() error { + s.Filter.Reset() + if err := s.Filter.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"filter\"") + } + case "pagination": + if err := func() error { + s.Pagination.Reset() + if err := s.Pagination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"pagination\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode MetadataQuery") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *MetadataQuery) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *MetadataQuery) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes time.Time as json. +func (o OptDateTime) Encode(e *jx.Encoder, format func(*jx.Encoder, time.Time)) { + if !o.Set { + return + } + format(e, o.Value) +} + +// Decode decodes time.Time from json. +func (o *OptDateTime) Decode(d *jx.Decoder, format func(*jx.Decoder) (time.Time, error)) error { + if o == nil { + return errors.New("invalid: unable to decode OptDateTime to nil") + } + o.Set = true + v, err := format(d) + if err != nil { + return err + } + o.Value = v + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDateTime) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e, json.EncodeDateTime) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDateTime) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d, json.DecodeDateTime) +} + +// Encode encodes Epoch as json. +func (o OptEpoch) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes Epoch from json. +func (o *OptEpoch) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptEpoch to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptEpoch) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptEpoch) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes ForkChoiceNodeExtraData as json. +func (o OptForkChoiceNodeExtraData) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes ForkChoiceNodeExtraData from json. +func (o *OptForkChoiceNodeExtraData) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptForkChoiceNodeExtraData to nil") + } + o.Set = true + o.Value = make(ForkChoiceNodeExtraData) + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptForkChoiceNodeExtraData) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptForkChoiceNodeExtraData) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes FrameFilter as json. +func (o OptFrameFilter) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes FrameFilter from json. +func (o *OptFrameFilter) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptFrameFilter to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptFrameFilter) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptFrameFilter) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes int as json. +func (o OptInt) Encode(e *jx.Encoder) { + if !o.Set { + return + } + e.Int(int(o.Value)) +} + +// Decode decodes int from json. +func (o *OptInt) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptInt to nil") + } + o.Set = true + v, err := d.Int() + if err != nil { + return err + } + o.Value = int(v) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptInt) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptInt) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes PaginationCursor as json. +func (o OptPaginationCursor) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes PaginationCursor from json. +func (o *OptPaginationCursor) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptPaginationCursor to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptPaginationCursor) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptPaginationCursor) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes Slot as json. +func (o OptSlot) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes Slot from json. +func (o *OptSlot) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptSlot to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptSlot) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptSlot) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes string as json. +func (o OptString) Encode(e *jx.Encoder) { + if !o.Set { + return + } + e.Str(string(o.Value)) +} + +// Decode decodes string from json. +func (o *OptString) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptString to nil") + } + o.Set = true + v, err := d.Str() + if err != nil { + return err + } + o.Value = string(v) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptString) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptString) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *PaginationCursor) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PaginationCursor) encodeFields(e *jx.Encoder) { + { + if s.Offset.Set { + e.FieldStart("offset") + s.Offset.Encode(e) + } + } + { + if s.Limit.Set { + e.FieldStart("limit") + s.Limit.Encode(e) + } + } +} + +var jsonFieldsNameOfPaginationCursor = [2]string{ + 0: "offset", + 1: "limit", +} + +// Decode decodes PaginationCursor from json. +func (s *PaginationCursor) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PaginationCursor to nil") + } + s.setDefaults() + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "offset": + if err := func() error { + s.Offset.Reset() + if err := s.Offset.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"offset\"") + } + case "limit": + if err := func() error { + s.Limit.Reset() + if err := s.Limit.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"limit\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode PaginationCursor") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PaginationCursor) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PaginationCursor) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *PaginationResponse) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PaginationResponse) encodeFields(e *jx.Encoder) { + { + e.FieldStart("total") + e.Int64(s.Total) + } +} + +var jsonFieldsNameOfPaginationResponse = [1]string{ + 0: "total", +} + +// Decode decodes PaginationResponse from json. +func (s *PaginationResponse) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PaginationResponse to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "total": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.Total = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"total\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode PaginationResponse") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfPaginationResponse) { + name = jsonFieldsNameOfPaginationResponse[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PaginationResponse) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PaginationResponse) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes Root as json. +func (s Root) Encode(e *jx.Encoder) { + unwrapped := string(s) + + e.Str(unwrapped) +} + +// Decode decodes Root from json. +func (s *Root) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Root to nil") + } + var unwrapped string + if err := func() error { + v, err := d.Str() + unwrapped = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = Root(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s Root) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Root) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes Slot as json. +func (s Slot) Encode(e *jx.Encoder) { + unwrapped := int64(s) + + e.Int64(unwrapped) +} + +// Decode decodes Slot from json. +func (s *Slot) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode Slot to nil") + } + var unwrapped int64 + if err := func() error { + v, err := d.Int64() + unwrapped = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = Slot(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s Slot) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *Slot) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes SlotString as json. +func (s SlotString) Encode(e *jx.Encoder) { + unwrapped := string(s) + + e.Str(unwrapped) +} + +// Decode decodes SlotString from json. +func (s *SlotString) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode SlotString to nil") + } + var unwrapped string + if err := func() error { + v, err := d.Str() + unwrapped = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = SlotString(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s SlotString) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *SlotString) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} diff --git a/api/rest/oas_labeler_gen.go b/api/rest/oas_labeler_gen.go new file mode 100644 index 0000000..b726eef --- /dev/null +++ b/api/rest/oas_labeler_gen.go @@ -0,0 +1,42 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "context" + + "go.opentelemetry.io/otel/attribute" +) + +// Labeler is used to allow adding custom attributes to the server request metrics. +type Labeler struct { + attrs []attribute.KeyValue +} + +// Add attributes to the Labeler. +func (l *Labeler) Add(attrs ...attribute.KeyValue) { + l.attrs = append(l.attrs, attrs...) +} + +// AttributeSet returns the attributes added to the Labeler as an attribute.Set. +func (l *Labeler) AttributeSet() attribute.Set { + return attribute.NewSet(l.attrs...) +} + +type labelerContextKey struct{} + +// LabelerFromContext retrieves the Labeler from the provided context, if present. +// +// If no Labeler was found in the provided context a new, empty Labeler is returned and the second +// return value is false. In this case it is safe to use the Labeler but any attributes added to +// it will not be used. +func LabelerFromContext(ctx context.Context) (*Labeler, bool) { + if l, ok := ctx.Value(labelerContextKey{}).(*Labeler); ok { + return l, true + } + return &Labeler{}, false +} + +func contextWithLabeler(ctx context.Context, l *Labeler) context.Context { + return context.WithValue(ctx, labelerContextKey{}, l) +} diff --git a/api/rest/oas_middleware_gen.go b/api/rest/oas_middleware_gen.go new file mode 100644 index 0000000..57ea1b4 --- /dev/null +++ b/api/rest/oas_middleware_gen.go @@ -0,0 +1,10 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "github.com/ogen-go/ogen/middleware" +) + +// Middleware is middleware type. +type Middleware = middleware.Middleware diff --git a/api/rest/oas_operations_gen.go b/api/rest/oas_operations_gen.go new file mode 100644 index 0000000..8b3ad65 --- /dev/null +++ b/api/rest/oas_operations_gen.go @@ -0,0 +1,17 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +// OperationName is the ogen operation name +type OperationName = string + +const ( + GetEthereumNowOperation OperationName = "GetEthereumNow" + GetEthereumSpecOperation OperationName = "GetEthereumSpec" + GetFrameOperation OperationName = "GetFrame" + ListMetadataOperation OperationName = "ListMetadata" + ListMetadataEpochsOperation OperationName = "ListMetadataEpochs" + ListMetadataLabelsOperation OperationName = "ListMetadataLabels" + ListMetadataNodesOperation OperationName = "ListMetadataNodes" + ListMetadataSlotsOperation OperationName = "ListMetadataSlots" +) diff --git a/api/rest/oas_parameters_gen.go b/api/rest/oas_parameters_gen.go new file mode 100644 index 0000000..ff99d45 --- /dev/null +++ b/api/rest/oas_parameters_gen.go @@ -0,0 +1,81 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "net/http" + "net/url" + + "github.com/go-faster/errors" + "github.com/ogen-go/ogen/conv" + "github.com/ogen-go/ogen/middleware" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/uri" + "github.com/ogen-go/ogen/validate" +) + +// GetFrameParams is parameters of getFrame operation. +type GetFrameParams struct { + // The frame ID. + ID string +} + +func unpackGetFrameParams(packed middleware.Parameters) (params GetFrameParams) { + { + key := middleware.ParameterKey{ + Name: "id", + In: "path", + } + params.ID = packed[key].(string) + } + return params +} + +func decodeGetFrameParams(args [1]string, argsEscaped bool, r *http.Request) (params GetFrameParams, _ error) { + // Decode path: id. + if err := func() error { + param := args[0] + if argsEscaped { + unescaped, err := url.PathUnescape(args[0]) + if err != nil { + return errors.Wrap(err, "unescape path") + } + param = unescaped + } + if len(param) > 0 { + d := uri.NewPathDecoder(uri.PathDecoderConfig{ + Param: "id", + Value: param, + Style: uri.PathStyleSimple, + Explode: false, + }) + + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + params.ID = c + return nil + }(); err != nil { + return err + } + } else { + return validate.ErrFieldRequired + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "id", + In: "path", + Err: err, + } + } + return params, nil +} diff --git a/api/rest/oas_request_decoders_gen.go b/api/rest/oas_request_decoders_gen.go new file mode 100644 index 0000000..2e0a01e --- /dev/null +++ b/api/rest/oas_request_decoders_gen.go @@ -0,0 +1,410 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "bytes" + "io" + "mime" + "net/http" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/validate" +) + +func (s *Server) decodeListMetadataRequest(r *http.Request) ( + req *MetadataQuery, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request MetadataQuery + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + if err := func() error { + if err := request.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return req, rawBody, close, errors.Wrap(err, "validate") + } + return &request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} + +func (s *Server) decodeListMetadataEpochsRequest(r *http.Request) ( + req *MetadataQuery, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request MetadataQuery + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + if err := func() error { + if err := request.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return req, rawBody, close, errors.Wrap(err, "validate") + } + return &request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} + +func (s *Server) decodeListMetadataLabelsRequest(r *http.Request) ( + req *MetadataQuery, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request MetadataQuery + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + if err := func() error { + if err := request.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return req, rawBody, close, errors.Wrap(err, "validate") + } + return &request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} + +func (s *Server) decodeListMetadataNodesRequest(r *http.Request) ( + req *MetadataQuery, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request MetadataQuery + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + if err := func() error { + if err := request.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return req, rawBody, close, errors.Wrap(err, "validate") + } + return &request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} + +func (s *Server) decodeListMetadataSlotsRequest(r *http.Request) ( + req *MetadataQuery, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request MetadataQuery + if err := func() error { + if err := request.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + if err := func() error { + if err := request.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return req, rawBody, close, errors.Wrap(err, "validate") + } + return &request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} diff --git a/api/rest/oas_request_encoders_gen.go b/api/rest/oas_request_encoders_gen.go new file mode 100644 index 0000000..b849798 --- /dev/null +++ b/api/rest/oas_request_encoders_gen.go @@ -0,0 +1,81 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "bytes" + "net/http" + + "github.com/go-faster/jx" + ht "github.com/ogen-go/ogen/http" +) + +func encodeListMetadataRequest( + req *MetadataQuery, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + +func encodeListMetadataEpochsRequest( + req *MetadataQuery, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + +func encodeListMetadataLabelsRequest( + req *MetadataQuery, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + +func encodeListMetadataNodesRequest( + req *MetadataQuery, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + +func encodeListMetadataSlotsRequest( + req *MetadataQuery, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} diff --git a/api/rest/oas_response_decoders_gen.go b/api/rest/oas_response_decoders_gen.go new file mode 100644 index 0000000..bd891e6 --- /dev/null +++ b/api/rest/oas_response_decoders_gen.go @@ -0,0 +1,1303 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "io" + "mime" + "net/http" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + "github.com/ogen-go/ogen/conv" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/ogen-go/ogen/uri" + "github.com/ogen-go/ogen/validate" +) + +func decodeGetEthereumNowResponse(resp *http.Response) (res GetEthereumNowRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetEthereumNowOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper GetEthereumNowOKHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Cache-Control" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotCacheControlVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + wrapperDotCacheControlVal = c + return nil + }(); err != nil { + return err + } + wrapper.CacheControl.SetTo(wrapperDotCacheControlVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Cache-Control header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + +func decodeGetEthereumSpecResponse(resp *http.Response) (res GetEthereumSpecRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetEthereumSpecOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + var wrapper GetEthereumSpecOKHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Cache-Control" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotCacheControlVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + wrapperDotCacheControlVal = c + return nil + }(); err != nil { + return err + } + wrapper.CacheControl.SetTo(wrapperDotCacheControlVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Cache-Control header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + +func decodeGetFrameResponse(resp *http.Response) (res GetFrameRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetFrameOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper GetFrameOKHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Cache-Control" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotCacheControlVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + wrapperDotCacheControlVal = c + return nil + }(); err != nil { + return err + } + wrapper.CacheControl.SetTo(wrapperDotCacheControlVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Cache-Control header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + case 404: + // Code 404. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + +func decodeListMetadataResponse(resp *http.Response) (res ListMetadataRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ListMetadataOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + +func decodeListMetadataEpochsResponse(resp *http.Response) (res ListMetadataEpochsRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ListMetadataEpochsOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper ListMetadataEpochsOKHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Cache-Control" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotCacheControlVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + wrapperDotCacheControlVal = c + return nil + }(); err != nil { + return err + } + wrapper.CacheControl.SetTo(wrapperDotCacheControlVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Cache-Control header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + +func decodeListMetadataLabelsResponse(resp *http.Response) (res ListMetadataLabelsRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ListMetadataLabelsOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper ListMetadataLabelsOKHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Cache-Control" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotCacheControlVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + wrapperDotCacheControlVal = c + return nil + }(); err != nil { + return err + } + wrapper.CacheControl.SetTo(wrapperDotCacheControlVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Cache-Control header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + +func decodeListMetadataNodesResponse(resp *http.Response) (res ListMetadataNodesRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ListMetadataNodesOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper ListMetadataNodesOKHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Cache-Control" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotCacheControlVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + wrapperDotCacheControlVal = c + return nil + }(); err != nil { + return err + } + wrapper.CacheControl.SetTo(wrapperDotCacheControlVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Cache-Control header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + +func decodeListMetadataSlotsResponse(resp *http.Response) (res ListMetadataSlotsRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response ListMetadataSlotsOK + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + var wrapper ListMetadataSlotsOKHeaders + wrapper.Response = response + h := uri.NewHeaderDecoder(resp.Header) + // Parse "Cache-Control" header. + { + cfg := uri.HeaderParameterDecodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := func() error { + if err := h.HasParam(cfg); err == nil { + if err := h.DecodeParam(cfg, func(d uri.Decoder) error { + var wrapperDotCacheControlVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + wrapperDotCacheControlVal = c + return nil + }(); err != nil { + return err + } + wrapper.CacheControl.SetTo(wrapperDotCacheControlVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "parse Cache-Control header") + } + } + return &wrapper, nil + default: + return res, validate.InvalidContentType(ct) + } + case 400: + // Code 400. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *UnexpectedErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &UnexpectedErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} diff --git a/api/rest/oas_response_encoders_gen.go b/api/rest/oas_response_encoders_gen.go new file mode 100644 index 0000000..9bc67b5 --- /dev/null +++ b/api/rest/oas_response_encoders_gen.go @@ -0,0 +1,439 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "net/http" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" + "github.com/ogen-go/ogen/conv" + ht "github.com/ogen-go/ogen/http" + "github.com/ogen-go/ogen/uri" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" +) + +func encodeGetEthereumNowResponse(response GetEthereumNowRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *GetEthereumNowOKHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Cache-Control" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.CacheControl.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Cache-Control header") + } + } + } + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeGetEthereumSpecResponse(response GetEthereumSpecRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *GetEthereumSpecOKHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Cache-Control" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.CacheControl.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Cache-Control header") + } + } + } + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeGetFrameResponse(response GetFrameRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *GetFrameOKHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Cache-Control" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.CacheControl.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Cache-Control header") + } + } + } + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(404) + span.SetStatus(codes.Error, http.StatusText(404)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeListMetadataResponse(response ListMetadataRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *ListMetadataOK: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeListMetadataEpochsResponse(response ListMetadataEpochsRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *ListMetadataEpochsOKHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Cache-Control" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.CacheControl.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Cache-Control header") + } + } + } + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeListMetadataLabelsResponse(response ListMetadataLabelsRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *ListMetadataLabelsOKHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Cache-Control" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.CacheControl.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Cache-Control header") + } + } + } + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeListMetadataNodesResponse(response ListMetadataNodesRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *ListMetadataNodesOKHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Cache-Control" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.CacheControl.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Cache-Control header") + } + } + } + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeListMetadataSlotsResponse(response ListMetadataSlotsRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *ListMetadataSlotsOKHeaders: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + // Encoding response headers. + { + h := uri.NewHeaderEncoder(w.Header()) + // Encode "Cache-Control" header. + { + cfg := uri.HeaderParameterEncodingConfig{ + Name: "Cache-Control", + Explode: false, + } + if err := h.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := response.CacheControl.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return errors.Wrap(err, "encode Cache-Control header") + } + } + } + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *Error: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(400) + span.SetStatus(codes.Error, http.StatusText(400)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + +func encodeErrorResponse(response *UnexpectedErrorStatusCode, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + code := response.StatusCode + if code == 0 { + // Set default status code. + code = http.StatusOK + } + w.WriteHeader(code) + if st := http.StatusText(code); code >= http.StatusBadRequest { + span.SetStatus(codes.Error, st) + } else { + span.SetStatus(codes.Ok, st) + } + + e := new(jx.Encoder) + response.Response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + if code >= http.StatusInternalServerError { + return errors.Wrapf(ht.ErrInternalServerErrorResponse, "code: %d, message: %s", code, http.StatusText(code)) + } + return nil + +} diff --git a/api/rest/oas_router_gen.go b/api/rest/oas_router_gen.go new file mode 100644 index 0000000..68d41bc --- /dev/null +++ b/api/rest/oas_router_gen.go @@ -0,0 +1,665 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "net/http" + "net/url" + "strings" + + "github.com/ogen-go/ogen/uri" +) + +var ( + rn7AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } + rn8AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } + rn10AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } + rn11AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } + rn12AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } +) + +func (s *Server) cutPrefix(path string) (string, bool) { + prefix := s.cfg.Prefix + if prefix == "" { + return path, true + } + if !strings.HasPrefix(path, prefix) { + // Prefix doesn't match. + return "", false + } + // Cut prefix from the path. + return strings.TrimPrefix(path, prefix), true +} + +// ServeHTTP serves http request as defined by OpenAPI v3 specification, +// calling handler that matches the path or returning not found error. +func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + elem := r.URL.Path + elemIsEscaped := false + if rawPath := r.URL.RawPath; rawPath != "" { + if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok { + elem = normalized + elemIsEscaped = strings.ContainsRune(elem, '%') + } + } + + elem, ok := s.cutPrefix(elem) + if !ok || len(elem) == 0 { + s.notFound(w, r) + return + } + args := [1]string{} + + // Static code generated router with unwrapped path search. + switch { + default: + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/api/v1/" + + if l := len("/api/v1/"); len(elem) >= l && elem[0:l] == "/api/v1/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "ethereum/" + + if l := len("ethereum/"); len(elem) >= l && elem[0:l] == "ethereum/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'n': // Prefix: "now" + + if l := len("now"); len(elem) >= l && elem[0:l] == "now" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetEthereumNowRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 's': // Prefix: "spec" + + if l := len("spec"); len(elem) >= l && elem[0:l] == "spec" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetEthereumSpecRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 'f': // Prefix: "frames/" + + if l := len("frames/"); len(elem) >= l && elem[0:l] == "frames/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetFrameRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 'm': // Prefix: "metadata" + + if l := len("metadata"); len(elem) >= l && elem[0:l] == "metadata" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "POST": + s.handleListMetadataRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn7AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "epochs" + + if l := len("epochs"); len(elem) >= l && elem[0:l] == "epochs" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleListMetadataEpochsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn8AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + case 'l': // Prefix: "labels" + + if l := len("labels"); len(elem) >= l && elem[0:l] == "labels" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleListMetadataLabelsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn10AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + case 'n': // Prefix: "nodes" + + if l := len("nodes"); len(elem) >= l && elem[0:l] == "nodes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleListMetadataNodesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn11AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + case 's': // Prefix: "slots" + + if l := len("slots"); len(elem) >= l && elem[0:l] == "slots" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleListMetadataSlotsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn12AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + } + + } + + } + + } + } + s.notFound(w, r) +} + +// Route is route object. +type Route struct { + name string + summary string + operationID string + operationGroup string + pathPattern string + count int + args [1]string +} + +// Name returns ogen operation name. +// +// It is guaranteed to be unique and not empty. +func (r Route) Name() string { + return r.name +} + +// Summary returns OpenAPI summary. +func (r Route) Summary() string { + return r.summary +} + +// OperationID returns OpenAPI operationId. +func (r Route) OperationID() string { + return r.operationID +} + +// OperationGroup returns the x-ogen-operation-group value. +func (r Route) OperationGroup() string { + return r.operationGroup +} + +// PathPattern returns OpenAPI path. +func (r Route) PathPattern() string { + return r.pathPattern +} + +// Args returns parsed arguments. +func (r Route) Args() []string { + return r.args[:r.count] +} + +// FindRoute finds Route for given method and path. +// +// Note: this method does not unescape path or handle reserved characters in path properly. Use FindPath instead. +func (s *Server) FindRoute(method, path string) (Route, bool) { + return s.FindPath(method, &url.URL{Path: path}) +} + +// FindPath finds Route for given method and URL. +func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { + var ( + elem = u.Path + args = r.args + ) + if rawPath := u.RawPath; rawPath != "" { + if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok { + elem = normalized + } + defer func() { + for i, arg := range r.args[:r.count] { + if unescaped, err := url.PathUnescape(arg); err == nil { + r.args[i] = unescaped + } + } + }() + } + + elem, ok := s.cutPrefix(elem) + if !ok { + return r, false + } + + // Static code generated router with unwrapped path search. + switch { + default: + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/api/v1/" + + if l := len("/api/v1/"); len(elem) >= l && elem[0:l] == "/api/v1/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "ethereum/" + + if l := len("ethereum/"); len(elem) >= l && elem[0:l] == "ethereum/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'n': // Prefix: "now" + + if l := len("now"); len(elem) >= l && elem[0:l] == "now" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetEthereumNowOperation + r.summary = "Get the current wall-clock slot and epoch" + r.operationID = "getEthereumNow" + r.operationGroup = "" + r.pathPattern = "/api/v1/ethereum/now" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 's': // Prefix: "spec" + + if l := len("spec"); len(elem) >= l && elem[0:l] == "spec" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetEthereumSpecOperation + r.summary = "Get the Ethereum network name and spec" + r.operationID = "getEthereumSpec" + r.operationGroup = "" + r.pathPattern = "/api/v1/ethereum/spec" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + case 'f': // Prefix: "frames/" + + if l := len("frames/"); len(elem) >= l && elem[0:l] == "frames/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetFrameOperation + r.summary = "Get a single fork-choice frame by ID" + r.operationID = "getFrame" + r.operationGroup = "" + r.pathPattern = "/api/v1/frames/{id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'm': // Prefix: "metadata" + + if l := len("metadata"); len(elem) >= l && elem[0:l] == "metadata" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "POST": + r.name = ListMetadataOperation + r.summary = "List fork-choice frame metadata" + r.operationID = "listMetadata" + r.operationGroup = "" + r.pathPattern = "/api/v1/metadata" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "epochs" + + if l := len("epochs"); len(elem) >= l && elem[0:l] == "epochs" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ListMetadataEpochsOperation + r.summary = "List distinct epochs across stored frames" + r.operationID = "listMetadataEpochs" + r.operationGroup = "" + r.pathPattern = "/api/v1/metadata/epochs" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 'l': // Prefix: "labels" + + if l := len("labels"); len(elem) >= l && elem[0:l] == "labels" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ListMetadataLabelsOperation + r.summary = "List distinct labels across stored frames" + r.operationID = "listMetadataLabels" + r.operationGroup = "" + r.pathPattern = "/api/v1/metadata/labels" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 'n': // Prefix: "nodes" + + if l := len("nodes"); len(elem) >= l && elem[0:l] == "nodes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ListMetadataNodesOperation + r.summary = "List distinct nodes across stored frames" + r.operationID = "listMetadataNodes" + r.operationGroup = "" + r.pathPattern = "/api/v1/metadata/nodes" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 's': // Prefix: "slots" + + if l := len("slots"); len(elem) >= l && elem[0:l] == "slots" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ListMetadataSlotsOperation + r.summary = "List distinct slots across stored frames" + r.operationID = "listMetadataSlots" + r.operationGroup = "" + r.pathPattern = "/api/v1/metadata/slots" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + } + + } + + } + } + return r, false +} diff --git a/api/rest/oas_schemas_gen.go b/api/rest/oas_schemas_gen.go new file mode 100644 index 0000000..42f9ccd --- /dev/null +++ b/api/rest/oas_schemas_gen.go @@ -0,0 +1,1516 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "fmt" + "time" + + "github.com/go-faster/errors" + "github.com/go-faster/jx" +) + +func (s *UnexpectedErrorStatusCode) Error() string { + return fmt.Sprintf("code %d: %+v", s.StatusCode, s.Response) +} + +// Ref: #/components/schemas/Checkpoint +type Checkpoint struct { + Epoch EpochString `json:"epoch"` + Root Root `json:"root"` +} + +// GetEpoch returns the value of Epoch. +func (s *Checkpoint) GetEpoch() EpochString { + return s.Epoch +} + +// GetRoot returns the value of Root. +func (s *Checkpoint) GetRoot() Root { + return s.Root +} + +// SetEpoch sets the value of Epoch. +func (s *Checkpoint) SetEpoch(val EpochString) { + s.Epoch = val +} + +// SetRoot sets the value of Root. +func (s *Checkpoint) SetRoot(val Root) { + s.Root = val +} + +type Epoch int64 + +type EpochString string + +// Ref: #/components/schemas/Error +type Error struct { + // The HTTP status code. + Code int `json:"code"` + // A human-readable error message. + Message string `json:"message"` +} + +// GetCode returns the value of Code. +func (s *Error) GetCode() int { + return s.Code +} + +// GetMessage returns the value of Message. +func (s *Error) GetMessage() string { + return s.Message +} + +// SetCode sets the value of Code. +func (s *Error) SetCode(val int) { + s.Code = val +} + +// SetMessage sets the value of Message. +func (s *Error) SetMessage(val string) { + s.Message = val +} + +func (*Error) getEthereumNowRes() {} +func (*Error) getEthereumSpecRes() {} +func (*Error) getFrameRes() {} +func (*Error) listMetadataEpochsRes() {} +func (*Error) listMetadataLabelsRes() {} +func (*Error) listMetadataNodesRes() {} +func (*Error) listMetadataRes() {} +func (*Error) listMetadataSlotsRes() {} + +// Ref: #/components/schemas/EthereumNow +type EthereumNow struct { + Slot Slot `json:"slot"` + Epoch Epoch `json:"epoch"` +} + +// GetSlot returns the value of Slot. +func (s *EthereumNow) GetSlot() Slot { + return s.Slot +} + +// GetEpoch returns the value of Epoch. +func (s *EthereumNow) GetEpoch() Epoch { + return s.Epoch +} + +// SetSlot sets the value of Slot. +func (s *EthereumNow) SetSlot(val Slot) { + s.Slot = val +} + +// SetEpoch sets the value of Epoch. +func (s *EthereumNow) SetEpoch(val Epoch) { + s.Epoch = val +} + +// Ref: #/components/schemas/EthereumSpec +type EthereumSpec struct { + SecondsPerSlot int64 `json:"seconds_per_slot"` + SlotsPerEpoch int64 `json:"slots_per_epoch"` + GenesisTime time.Time `json:"genesis_time"` +} + +// GetSecondsPerSlot returns the value of SecondsPerSlot. +func (s *EthereumSpec) GetSecondsPerSlot() int64 { + return s.SecondsPerSlot +} + +// GetSlotsPerEpoch returns the value of SlotsPerEpoch. +func (s *EthereumSpec) GetSlotsPerEpoch() int64 { + return s.SlotsPerEpoch +} + +// GetGenesisTime returns the value of GenesisTime. +func (s *EthereumSpec) GetGenesisTime() time.Time { + return s.GenesisTime +} + +// SetSecondsPerSlot sets the value of SecondsPerSlot. +func (s *EthereumSpec) SetSecondsPerSlot(val int64) { + s.SecondsPerSlot = val +} + +// SetSlotsPerEpoch sets the value of SlotsPerEpoch. +func (s *EthereumSpec) SetSlotsPerEpoch(val int64) { + s.SlotsPerEpoch = val +} + +// SetGenesisTime sets the value of GenesisTime. +func (s *EthereumSpec) SetGenesisTime(val time.Time) { + s.GenesisTime = val +} + +// Ref: #/components/schemas/EthereumSpecResult +type EthereumSpecResult struct { + NetworkName string `json:"network_name"` + Spec EthereumSpec `json:"spec"` +} + +// GetNetworkName returns the value of NetworkName. +func (s *EthereumSpecResult) GetNetworkName() string { + return s.NetworkName +} + +// GetSpec returns the value of Spec. +func (s *EthereumSpecResult) GetSpec() EthereumSpec { + return s.Spec +} + +// SetNetworkName sets the value of NetworkName. +func (s *EthereumSpecResult) SetNetworkName(val string) { + s.NetworkName = val +} + +// SetSpec sets the value of Spec. +func (s *EthereumSpecResult) SetSpec(val EthereumSpec) { + s.Spec = val +} + +// A beacon node's fork-choice dump. +// Ref: #/components/schemas/ForkChoice +type ForkChoice struct { + JustifiedCheckpoint Checkpoint `json:"justified_checkpoint"` + FinalizedCheckpoint Checkpoint `json:"finalized_checkpoint"` + ForkChoiceNodes []ForkChoiceNode `json:"fork_choice_nodes"` +} + +// GetJustifiedCheckpoint returns the value of JustifiedCheckpoint. +func (s *ForkChoice) GetJustifiedCheckpoint() Checkpoint { + return s.JustifiedCheckpoint +} + +// GetFinalizedCheckpoint returns the value of FinalizedCheckpoint. +func (s *ForkChoice) GetFinalizedCheckpoint() Checkpoint { + return s.FinalizedCheckpoint +} + +// GetForkChoiceNodes returns the value of ForkChoiceNodes. +func (s *ForkChoice) GetForkChoiceNodes() []ForkChoiceNode { + return s.ForkChoiceNodes +} + +// SetJustifiedCheckpoint sets the value of JustifiedCheckpoint. +func (s *ForkChoice) SetJustifiedCheckpoint(val Checkpoint) { + s.JustifiedCheckpoint = val +} + +// SetFinalizedCheckpoint sets the value of FinalizedCheckpoint. +func (s *ForkChoice) SetFinalizedCheckpoint(val Checkpoint) { + s.FinalizedCheckpoint = val +} + +// SetForkChoiceNodes sets the value of ForkChoiceNodes. +func (s *ForkChoice) SetForkChoiceNodes(val []ForkChoiceNode) { + s.ForkChoiceNodes = val +} + +// Ref: #/components/schemas/ForkChoiceNode +type ForkChoiceNode struct { + Slot SlotString `json:"slot"` + BlockRoot Root `json:"block_root"` + ParentRoot Root `json:"parent_root"` + JustifiedEpoch EpochString `json:"justified_epoch"` + FinalizedEpoch EpochString `json:"finalized_epoch"` + // The node's fork-choice weight, serialized as a string. + Weight string `json:"weight"` + // The node's validity status. + Validity ForkChoiceNodeValidity `json:"validity"` + ExecutionBlockHash Root `json:"execution_block_hash"` + ExtraData OptForkChoiceNodeExtraData `json:"extra_data"` +} + +// GetSlot returns the value of Slot. +func (s *ForkChoiceNode) GetSlot() SlotString { + return s.Slot +} + +// GetBlockRoot returns the value of BlockRoot. +func (s *ForkChoiceNode) GetBlockRoot() Root { + return s.BlockRoot +} + +// GetParentRoot returns the value of ParentRoot. +func (s *ForkChoiceNode) GetParentRoot() Root { + return s.ParentRoot +} + +// GetJustifiedEpoch returns the value of JustifiedEpoch. +func (s *ForkChoiceNode) GetJustifiedEpoch() EpochString { + return s.JustifiedEpoch +} + +// GetFinalizedEpoch returns the value of FinalizedEpoch. +func (s *ForkChoiceNode) GetFinalizedEpoch() EpochString { + return s.FinalizedEpoch +} + +// GetWeight returns the value of Weight. +func (s *ForkChoiceNode) GetWeight() string { + return s.Weight +} + +// GetValidity returns the value of Validity. +func (s *ForkChoiceNode) GetValidity() ForkChoiceNodeValidity { + return s.Validity +} + +// GetExecutionBlockHash returns the value of ExecutionBlockHash. +func (s *ForkChoiceNode) GetExecutionBlockHash() Root { + return s.ExecutionBlockHash +} + +// GetExtraData returns the value of ExtraData. +func (s *ForkChoiceNode) GetExtraData() OptForkChoiceNodeExtraData { + return s.ExtraData +} + +// SetSlot sets the value of Slot. +func (s *ForkChoiceNode) SetSlot(val SlotString) { + s.Slot = val +} + +// SetBlockRoot sets the value of BlockRoot. +func (s *ForkChoiceNode) SetBlockRoot(val Root) { + s.BlockRoot = val +} + +// SetParentRoot sets the value of ParentRoot. +func (s *ForkChoiceNode) SetParentRoot(val Root) { + s.ParentRoot = val +} + +// SetJustifiedEpoch sets the value of JustifiedEpoch. +func (s *ForkChoiceNode) SetJustifiedEpoch(val EpochString) { + s.JustifiedEpoch = val +} + +// SetFinalizedEpoch sets the value of FinalizedEpoch. +func (s *ForkChoiceNode) SetFinalizedEpoch(val EpochString) { + s.FinalizedEpoch = val +} + +// SetWeight sets the value of Weight. +func (s *ForkChoiceNode) SetWeight(val string) { + s.Weight = val +} + +// SetValidity sets the value of Validity. +func (s *ForkChoiceNode) SetValidity(val ForkChoiceNodeValidity) { + s.Validity = val +} + +// SetExecutionBlockHash sets the value of ExecutionBlockHash. +func (s *ForkChoiceNode) SetExecutionBlockHash(val Root) { + s.ExecutionBlockHash = val +} + +// SetExtraData sets the value of ExtraData. +func (s *ForkChoiceNode) SetExtraData(val OptForkChoiceNodeExtraData) { + s.ExtraData = val +} + +type ForkChoiceNodeExtraData map[string]jx.Raw + +func (s *ForkChoiceNodeExtraData) init() ForkChoiceNodeExtraData { + m := *s + if m == nil { + m = map[string]jx.Raw{} + *s = m + } + return m +} + +// The node's validity status. +type ForkChoiceNodeValidity string + +const ( + ForkChoiceNodeValidityValid ForkChoiceNodeValidity = "valid" + ForkChoiceNodeValidityInvalid ForkChoiceNodeValidity = "invalid" + ForkChoiceNodeValidityOptimistic ForkChoiceNodeValidity = "optimistic" + ForkChoiceNodeValidityUnknown ForkChoiceNodeValidity = "unknown" +) + +// AllValues returns all ForkChoiceNodeValidity values. +func (ForkChoiceNodeValidity) AllValues() []ForkChoiceNodeValidity { + return []ForkChoiceNodeValidity{ + ForkChoiceNodeValidityValid, + ForkChoiceNodeValidityInvalid, + ForkChoiceNodeValidityOptimistic, + ForkChoiceNodeValidityUnknown, + } +} + +// MarshalText implements encoding.TextMarshaler. +func (s ForkChoiceNodeValidity) MarshalText() ([]byte, error) { + switch s { + case ForkChoiceNodeValidityValid: + return []byte(s), nil + case ForkChoiceNodeValidityInvalid: + return []byte(s), nil + case ForkChoiceNodeValidityOptimistic: + return []byte(s), nil + case ForkChoiceNodeValidityUnknown: + return []byte(s), nil + default: + return nil, errors.Errorf("invalid value: %q", s) + } +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (s *ForkChoiceNodeValidity) UnmarshalText(data []byte) error { + switch ForkChoiceNodeValidity(data) { + case ForkChoiceNodeValidityValid: + *s = ForkChoiceNodeValidityValid + return nil + case ForkChoiceNodeValidityInvalid: + *s = ForkChoiceNodeValidityInvalid + return nil + case ForkChoiceNodeValidityOptimistic: + *s = ForkChoiceNodeValidityOptimistic + return nil + case ForkChoiceNodeValidityUnknown: + *s = ForkChoiceNodeValidityUnknown + return nil + default: + return errors.Errorf("invalid value: %q", data) + } +} + +// Ref: #/components/schemas/Frame +type Frame struct { + Data ForkChoice `json:"data"` + Metadata FrameMetadata `json:"metadata"` +} + +// GetData returns the value of Data. +func (s *Frame) GetData() ForkChoice { + return s.Data +} + +// GetMetadata returns the value of Metadata. +func (s *Frame) GetMetadata() FrameMetadata { + return s.Metadata +} + +// SetData sets the value of Data. +func (s *Frame) SetData(val ForkChoice) { + s.Data = val +} + +// SetMetadata sets the value of Metadata. +func (s *Frame) SetMetadata(val FrameMetadata) { + s.Metadata = val +} + +// Filters applied to a frame query. All fields are optional. +// Ref: #/components/schemas/FrameFilter +type FrameFilter struct { + Node OptString `json:"node"` + Before OptDateTime `json:"before"` + After OptDateTime `json:"after"` + Slot OptSlot `json:"slot"` + Epoch OptEpoch `json:"epoch"` + Labels []string `json:"labels"` + ConsensusClient OptString `json:"consensus_client"` + EventSource OptString `json:"event_source"` +} + +// GetNode returns the value of Node. +func (s *FrameFilter) GetNode() OptString { + return s.Node +} + +// GetBefore returns the value of Before. +func (s *FrameFilter) GetBefore() OptDateTime { + return s.Before +} + +// GetAfter returns the value of After. +func (s *FrameFilter) GetAfter() OptDateTime { + return s.After +} + +// GetSlot returns the value of Slot. +func (s *FrameFilter) GetSlot() OptSlot { + return s.Slot +} + +// GetEpoch returns the value of Epoch. +func (s *FrameFilter) GetEpoch() OptEpoch { + return s.Epoch +} + +// GetLabels returns the value of Labels. +func (s *FrameFilter) GetLabels() []string { + return s.Labels +} + +// GetConsensusClient returns the value of ConsensusClient. +func (s *FrameFilter) GetConsensusClient() OptString { + return s.ConsensusClient +} + +// GetEventSource returns the value of EventSource. +func (s *FrameFilter) GetEventSource() OptString { + return s.EventSource +} + +// SetNode sets the value of Node. +func (s *FrameFilter) SetNode(val OptString) { + s.Node = val +} + +// SetBefore sets the value of Before. +func (s *FrameFilter) SetBefore(val OptDateTime) { + s.Before = val +} + +// SetAfter sets the value of After. +func (s *FrameFilter) SetAfter(val OptDateTime) { + s.After = val +} + +// SetSlot sets the value of Slot. +func (s *FrameFilter) SetSlot(val OptSlot) { + s.Slot = val +} + +// SetEpoch sets the value of Epoch. +func (s *FrameFilter) SetEpoch(val OptEpoch) { + s.Epoch = val +} + +// SetLabels sets the value of Labels. +func (s *FrameFilter) SetLabels(val []string) { + s.Labels = val +} + +// SetConsensusClient sets the value of ConsensusClient. +func (s *FrameFilter) SetConsensusClient(val OptString) { + s.ConsensusClient = val +} + +// SetEventSource sets the value of EventSource. +func (s *FrameFilter) SetEventSource(val OptString) { + s.EventSource = val +} + +// Ref: #/components/schemas/FrameMetadata +type FrameMetadata struct { + // The frame ID. + ID string `json:"id"` + // The node that provided the frame. For a beacon node this is the + // configured node ID; for Xatu it is the Xatu Sentry ID. + Node string `json:"node"` + // When the frame was fetched. + FetchedAt time.Time `json:"fetched_at"` + WallClockSlot Slot `json:"wall_clock_slot"` + WallClockEpoch Epoch `json:"wall_clock_epoch"` + Labels []string `json:"labels"` + ConsensusClient string `json:"consensus_client"` + EventSource string `json:"event_source"` +} + +// GetID returns the value of ID. +func (s *FrameMetadata) GetID() string { + return s.ID +} + +// GetNode returns the value of Node. +func (s *FrameMetadata) GetNode() string { + return s.Node +} + +// GetFetchedAt returns the value of FetchedAt. +func (s *FrameMetadata) GetFetchedAt() time.Time { + return s.FetchedAt +} + +// GetWallClockSlot returns the value of WallClockSlot. +func (s *FrameMetadata) GetWallClockSlot() Slot { + return s.WallClockSlot +} + +// GetWallClockEpoch returns the value of WallClockEpoch. +func (s *FrameMetadata) GetWallClockEpoch() Epoch { + return s.WallClockEpoch +} + +// GetLabels returns the value of Labels. +func (s *FrameMetadata) GetLabels() []string { + return s.Labels +} + +// GetConsensusClient returns the value of ConsensusClient. +func (s *FrameMetadata) GetConsensusClient() string { + return s.ConsensusClient +} + +// GetEventSource returns the value of EventSource. +func (s *FrameMetadata) GetEventSource() string { + return s.EventSource +} + +// SetID sets the value of ID. +func (s *FrameMetadata) SetID(val string) { + s.ID = val +} + +// SetNode sets the value of Node. +func (s *FrameMetadata) SetNode(val string) { + s.Node = val +} + +// SetFetchedAt sets the value of FetchedAt. +func (s *FrameMetadata) SetFetchedAt(val time.Time) { + s.FetchedAt = val +} + +// SetWallClockSlot sets the value of WallClockSlot. +func (s *FrameMetadata) SetWallClockSlot(val Slot) { + s.WallClockSlot = val +} + +// SetWallClockEpoch sets the value of WallClockEpoch. +func (s *FrameMetadata) SetWallClockEpoch(val Epoch) { + s.WallClockEpoch = val +} + +// SetLabels sets the value of Labels. +func (s *FrameMetadata) SetLabels(val []string) { + s.Labels = val +} + +// SetConsensusClient sets the value of ConsensusClient. +func (s *FrameMetadata) SetConsensusClient(val string) { + s.ConsensusClient = val +} + +// SetEventSource sets the value of EventSource. +func (s *FrameMetadata) SetEventSource(val string) { + s.EventSource = val +} + +type GetEthereumNowOK struct { + Data EthereumNow `json:"data"` +} + +// GetData returns the value of Data. +func (s *GetEthereumNowOK) GetData() EthereumNow { + return s.Data +} + +// SetData sets the value of Data. +func (s *GetEthereumNowOK) SetData(val EthereumNow) { + s.Data = val +} + +// GetEthereumNowOKHeaders wraps GetEthereumNowOK with response headers. +type GetEthereumNowOKHeaders struct { + CacheControl OptString + Response GetEthereumNowOK +} + +// GetCacheControl returns the value of CacheControl. +func (s *GetEthereumNowOKHeaders) GetCacheControl() OptString { + return s.CacheControl +} + +// GetResponse returns the value of Response. +func (s *GetEthereumNowOKHeaders) GetResponse() GetEthereumNowOK { + return s.Response +} + +// SetCacheControl sets the value of CacheControl. +func (s *GetEthereumNowOKHeaders) SetCacheControl(val OptString) { + s.CacheControl = val +} + +// SetResponse sets the value of Response. +func (s *GetEthereumNowOKHeaders) SetResponse(val GetEthereumNowOK) { + s.Response = val +} + +func (*GetEthereumNowOKHeaders) getEthereumNowRes() {} + +type GetEthereumSpecOK struct { + Data EthereumSpecResult `json:"data"` +} + +// GetData returns the value of Data. +func (s *GetEthereumSpecOK) GetData() EthereumSpecResult { + return s.Data +} + +// SetData sets the value of Data. +func (s *GetEthereumSpecOK) SetData(val EthereumSpecResult) { + s.Data = val +} + +// GetEthereumSpecOKHeaders wraps GetEthereumSpecOK with response headers. +type GetEthereumSpecOKHeaders struct { + CacheControl OptString + Response GetEthereumSpecOK +} + +// GetCacheControl returns the value of CacheControl. +func (s *GetEthereumSpecOKHeaders) GetCacheControl() OptString { + return s.CacheControl +} + +// GetResponse returns the value of Response. +func (s *GetEthereumSpecOKHeaders) GetResponse() GetEthereumSpecOK { + return s.Response +} + +// SetCacheControl sets the value of CacheControl. +func (s *GetEthereumSpecOKHeaders) SetCacheControl(val OptString) { + s.CacheControl = val +} + +// SetResponse sets the value of Response. +func (s *GetEthereumSpecOKHeaders) SetResponse(val GetEthereumSpecOK) { + s.Response = val +} + +func (*GetEthereumSpecOKHeaders) getEthereumSpecRes() {} + +type GetFrameOK struct { + Data GetFrameOKData `json:"data"` +} + +// GetData returns the value of Data. +func (s *GetFrameOK) GetData() GetFrameOKData { + return s.Data +} + +// SetData sets the value of Data. +func (s *GetFrameOK) SetData(val GetFrameOKData) { + s.Data = val +} + +type GetFrameOKData struct { + Frame Frame `json:"frame"` +} + +// GetFrame returns the value of Frame. +func (s *GetFrameOKData) GetFrame() Frame { + return s.Frame +} + +// SetFrame sets the value of Frame. +func (s *GetFrameOKData) SetFrame(val Frame) { + s.Frame = val +} + +// GetFrameOKHeaders wraps GetFrameOK with response headers. +type GetFrameOKHeaders struct { + CacheControl OptString + Response GetFrameOK +} + +// GetCacheControl returns the value of CacheControl. +func (s *GetFrameOKHeaders) GetCacheControl() OptString { + return s.CacheControl +} + +// GetResponse returns the value of Response. +func (s *GetFrameOKHeaders) GetResponse() GetFrameOK { + return s.Response +} + +// SetCacheControl sets the value of CacheControl. +func (s *GetFrameOKHeaders) SetCacheControl(val OptString) { + s.CacheControl = val +} + +// SetResponse sets the value of Response. +func (s *GetFrameOKHeaders) SetResponse(val GetFrameOK) { + s.Response = val +} + +func (*GetFrameOKHeaders) getFrameRes() {} + +type ListMetadataEpochsOK struct { + Data ListMetadataEpochsOKData `json:"data"` +} + +// GetData returns the value of Data. +func (s *ListMetadataEpochsOK) GetData() ListMetadataEpochsOKData { + return s.Data +} + +// SetData sets the value of Data. +func (s *ListMetadataEpochsOK) SetData(val ListMetadataEpochsOKData) { + s.Data = val +} + +type ListMetadataEpochsOKData struct { + Epochs []Epoch `json:"epochs"` + Pagination PaginationResponse `json:"pagination"` +} + +// GetEpochs returns the value of Epochs. +func (s *ListMetadataEpochsOKData) GetEpochs() []Epoch { + return s.Epochs +} + +// GetPagination returns the value of Pagination. +func (s *ListMetadataEpochsOKData) GetPagination() PaginationResponse { + return s.Pagination +} + +// SetEpochs sets the value of Epochs. +func (s *ListMetadataEpochsOKData) SetEpochs(val []Epoch) { + s.Epochs = val +} + +// SetPagination sets the value of Pagination. +func (s *ListMetadataEpochsOKData) SetPagination(val PaginationResponse) { + s.Pagination = val +} + +// ListMetadataEpochsOKHeaders wraps ListMetadataEpochsOK with response headers. +type ListMetadataEpochsOKHeaders struct { + CacheControl OptString + Response ListMetadataEpochsOK +} + +// GetCacheControl returns the value of CacheControl. +func (s *ListMetadataEpochsOKHeaders) GetCacheControl() OptString { + return s.CacheControl +} + +// GetResponse returns the value of Response. +func (s *ListMetadataEpochsOKHeaders) GetResponse() ListMetadataEpochsOK { + return s.Response +} + +// SetCacheControl sets the value of CacheControl. +func (s *ListMetadataEpochsOKHeaders) SetCacheControl(val OptString) { + s.CacheControl = val +} + +// SetResponse sets the value of Response. +func (s *ListMetadataEpochsOKHeaders) SetResponse(val ListMetadataEpochsOK) { + s.Response = val +} + +func (*ListMetadataEpochsOKHeaders) listMetadataEpochsRes() {} + +type ListMetadataLabelsOK struct { + Data ListMetadataLabelsOKData `json:"data"` +} + +// GetData returns the value of Data. +func (s *ListMetadataLabelsOK) GetData() ListMetadataLabelsOKData { + return s.Data +} + +// SetData sets the value of Data. +func (s *ListMetadataLabelsOK) SetData(val ListMetadataLabelsOKData) { + s.Data = val +} + +type ListMetadataLabelsOKData struct { + Labels []string `json:"labels"` + Pagination PaginationResponse `json:"pagination"` +} + +// GetLabels returns the value of Labels. +func (s *ListMetadataLabelsOKData) GetLabels() []string { + return s.Labels +} + +// GetPagination returns the value of Pagination. +func (s *ListMetadataLabelsOKData) GetPagination() PaginationResponse { + return s.Pagination +} + +// SetLabels sets the value of Labels. +func (s *ListMetadataLabelsOKData) SetLabels(val []string) { + s.Labels = val +} + +// SetPagination sets the value of Pagination. +func (s *ListMetadataLabelsOKData) SetPagination(val PaginationResponse) { + s.Pagination = val +} + +// ListMetadataLabelsOKHeaders wraps ListMetadataLabelsOK with response headers. +type ListMetadataLabelsOKHeaders struct { + CacheControl OptString + Response ListMetadataLabelsOK +} + +// GetCacheControl returns the value of CacheControl. +func (s *ListMetadataLabelsOKHeaders) GetCacheControl() OptString { + return s.CacheControl +} + +// GetResponse returns the value of Response. +func (s *ListMetadataLabelsOKHeaders) GetResponse() ListMetadataLabelsOK { + return s.Response +} + +// SetCacheControl sets the value of CacheControl. +func (s *ListMetadataLabelsOKHeaders) SetCacheControl(val OptString) { + s.CacheControl = val +} + +// SetResponse sets the value of Response. +func (s *ListMetadataLabelsOKHeaders) SetResponse(val ListMetadataLabelsOK) { + s.Response = val +} + +func (*ListMetadataLabelsOKHeaders) listMetadataLabelsRes() {} + +type ListMetadataNodesOK struct { + Data ListMetadataNodesOKData `json:"data"` +} + +// GetData returns the value of Data. +func (s *ListMetadataNodesOK) GetData() ListMetadataNodesOKData { + return s.Data +} + +// SetData sets the value of Data. +func (s *ListMetadataNodesOK) SetData(val ListMetadataNodesOKData) { + s.Data = val +} + +type ListMetadataNodesOKData struct { + Nodes []string `json:"nodes"` + Pagination PaginationResponse `json:"pagination"` +} + +// GetNodes returns the value of Nodes. +func (s *ListMetadataNodesOKData) GetNodes() []string { + return s.Nodes +} + +// GetPagination returns the value of Pagination. +func (s *ListMetadataNodesOKData) GetPagination() PaginationResponse { + return s.Pagination +} + +// SetNodes sets the value of Nodes. +func (s *ListMetadataNodesOKData) SetNodes(val []string) { + s.Nodes = val +} + +// SetPagination sets the value of Pagination. +func (s *ListMetadataNodesOKData) SetPagination(val PaginationResponse) { + s.Pagination = val +} + +// ListMetadataNodesOKHeaders wraps ListMetadataNodesOK with response headers. +type ListMetadataNodesOKHeaders struct { + CacheControl OptString + Response ListMetadataNodesOK +} + +// GetCacheControl returns the value of CacheControl. +func (s *ListMetadataNodesOKHeaders) GetCacheControl() OptString { + return s.CacheControl +} + +// GetResponse returns the value of Response. +func (s *ListMetadataNodesOKHeaders) GetResponse() ListMetadataNodesOK { + return s.Response +} + +// SetCacheControl sets the value of CacheControl. +func (s *ListMetadataNodesOKHeaders) SetCacheControl(val OptString) { + s.CacheControl = val +} + +// SetResponse sets the value of Response. +func (s *ListMetadataNodesOKHeaders) SetResponse(val ListMetadataNodesOK) { + s.Response = val +} + +func (*ListMetadataNodesOKHeaders) listMetadataNodesRes() {} + +type ListMetadataOK struct { + Data ListMetadataOKData `json:"data"` +} + +// GetData returns the value of Data. +func (s *ListMetadataOK) GetData() ListMetadataOKData { + return s.Data +} + +// SetData sets the value of Data. +func (s *ListMetadataOK) SetData(val ListMetadataOKData) { + s.Data = val +} + +func (*ListMetadataOK) listMetadataRes() {} + +type ListMetadataOKData struct { + Frames []FrameMetadata `json:"frames"` + Pagination PaginationResponse `json:"pagination"` +} + +// GetFrames returns the value of Frames. +func (s *ListMetadataOKData) GetFrames() []FrameMetadata { + return s.Frames +} + +// GetPagination returns the value of Pagination. +func (s *ListMetadataOKData) GetPagination() PaginationResponse { + return s.Pagination +} + +// SetFrames sets the value of Frames. +func (s *ListMetadataOKData) SetFrames(val []FrameMetadata) { + s.Frames = val +} + +// SetPagination sets the value of Pagination. +func (s *ListMetadataOKData) SetPagination(val PaginationResponse) { + s.Pagination = val +} + +type ListMetadataSlotsOK struct { + Data ListMetadataSlotsOKData `json:"data"` +} + +// GetData returns the value of Data. +func (s *ListMetadataSlotsOK) GetData() ListMetadataSlotsOKData { + return s.Data +} + +// SetData sets the value of Data. +func (s *ListMetadataSlotsOK) SetData(val ListMetadataSlotsOKData) { + s.Data = val +} + +type ListMetadataSlotsOKData struct { + Slots []Slot `json:"slots"` + Pagination PaginationResponse `json:"pagination"` +} + +// GetSlots returns the value of Slots. +func (s *ListMetadataSlotsOKData) GetSlots() []Slot { + return s.Slots +} + +// GetPagination returns the value of Pagination. +func (s *ListMetadataSlotsOKData) GetPagination() PaginationResponse { + return s.Pagination +} + +// SetSlots sets the value of Slots. +func (s *ListMetadataSlotsOKData) SetSlots(val []Slot) { + s.Slots = val +} + +// SetPagination sets the value of Pagination. +func (s *ListMetadataSlotsOKData) SetPagination(val PaginationResponse) { + s.Pagination = val +} + +// ListMetadataSlotsOKHeaders wraps ListMetadataSlotsOK with response headers. +type ListMetadataSlotsOKHeaders struct { + CacheControl OptString + Response ListMetadataSlotsOK +} + +// GetCacheControl returns the value of CacheControl. +func (s *ListMetadataSlotsOKHeaders) GetCacheControl() OptString { + return s.CacheControl +} + +// GetResponse returns the value of Response. +func (s *ListMetadataSlotsOKHeaders) GetResponse() ListMetadataSlotsOK { + return s.Response +} + +// SetCacheControl sets the value of CacheControl. +func (s *ListMetadataSlotsOKHeaders) SetCacheControl(val OptString) { + s.CacheControl = val +} + +// SetResponse sets the value of Response. +func (s *ListMetadataSlotsOKHeaders) SetResponse(val ListMetadataSlotsOK) { + s.Response = val +} + +func (*ListMetadataSlotsOKHeaders) listMetadataSlotsRes() {} + +// Ref: #/components/schemas/MetadataQuery +type MetadataQuery struct { + Filter OptFrameFilter `json:"filter"` + Pagination OptPaginationCursor `json:"pagination"` +} + +// GetFilter returns the value of Filter. +func (s *MetadataQuery) GetFilter() OptFrameFilter { + return s.Filter +} + +// GetPagination returns the value of Pagination. +func (s *MetadataQuery) GetPagination() OptPaginationCursor { + return s.Pagination +} + +// SetFilter sets the value of Filter. +func (s *MetadataQuery) SetFilter(val OptFrameFilter) { + s.Filter = val +} + +// SetPagination sets the value of Pagination. +func (s *MetadataQuery) SetPagination(val OptPaginationCursor) { + s.Pagination = val +} + +// NewOptDateTime returns new OptDateTime with value set to v. +func NewOptDateTime(v time.Time) OptDateTime { + return OptDateTime{ + Value: v, + Set: true, + } +} + +// OptDateTime is optional time.Time. +type OptDateTime struct { + Value time.Time + Set bool +} + +// IsSet returns true if OptDateTime was set. +func (o OptDateTime) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDateTime) Reset() { + var v time.Time + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDateTime) SetTo(v time.Time) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDateTime) Get() (v time.Time, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptDateTime) Or(d time.Time) time.Time { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptEpoch returns new OptEpoch with value set to v. +func NewOptEpoch(v Epoch) OptEpoch { + return OptEpoch{ + Value: v, + Set: true, + } +} + +// OptEpoch is optional Epoch. +type OptEpoch struct { + Value Epoch + Set bool +} + +// IsSet returns true if OptEpoch was set. +func (o OptEpoch) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptEpoch) Reset() { + var v Epoch + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptEpoch) SetTo(v Epoch) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptEpoch) Get() (v Epoch, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptEpoch) Or(d Epoch) Epoch { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptForkChoiceNodeExtraData returns new OptForkChoiceNodeExtraData with value set to v. +func NewOptForkChoiceNodeExtraData(v ForkChoiceNodeExtraData) OptForkChoiceNodeExtraData { + return OptForkChoiceNodeExtraData{ + Value: v, + Set: true, + } +} + +// OptForkChoiceNodeExtraData is optional ForkChoiceNodeExtraData. +type OptForkChoiceNodeExtraData struct { + Value ForkChoiceNodeExtraData + Set bool +} + +// IsSet returns true if OptForkChoiceNodeExtraData was set. +func (o OptForkChoiceNodeExtraData) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptForkChoiceNodeExtraData) Reset() { + var v ForkChoiceNodeExtraData + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptForkChoiceNodeExtraData) SetTo(v ForkChoiceNodeExtraData) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptForkChoiceNodeExtraData) Get() (v ForkChoiceNodeExtraData, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptForkChoiceNodeExtraData) Or(d ForkChoiceNodeExtraData) ForkChoiceNodeExtraData { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptFrameFilter returns new OptFrameFilter with value set to v. +func NewOptFrameFilter(v FrameFilter) OptFrameFilter { + return OptFrameFilter{ + Value: v, + Set: true, + } +} + +// OptFrameFilter is optional FrameFilter. +type OptFrameFilter struct { + Value FrameFilter + Set bool +} + +// IsSet returns true if OptFrameFilter was set. +func (o OptFrameFilter) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptFrameFilter) Reset() { + var v FrameFilter + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptFrameFilter) SetTo(v FrameFilter) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptFrameFilter) Get() (v FrameFilter, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptFrameFilter) Or(d FrameFilter) FrameFilter { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptInt returns new OptInt with value set to v. +func NewOptInt(v int) OptInt { + return OptInt{ + Value: v, + Set: true, + } +} + +// OptInt is optional int. +type OptInt struct { + Value int + Set bool +} + +// IsSet returns true if OptInt was set. +func (o OptInt) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptInt) Reset() { + var v int + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptInt) SetTo(v int) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptInt) Get() (v int, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptInt) Or(d int) int { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptPaginationCursor returns new OptPaginationCursor with value set to v. +func NewOptPaginationCursor(v PaginationCursor) OptPaginationCursor { + return OptPaginationCursor{ + Value: v, + Set: true, + } +} + +// OptPaginationCursor is optional PaginationCursor. +type OptPaginationCursor struct { + Value PaginationCursor + Set bool +} + +// IsSet returns true if OptPaginationCursor was set. +func (o OptPaginationCursor) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptPaginationCursor) Reset() { + var v PaginationCursor + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptPaginationCursor) SetTo(v PaginationCursor) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptPaginationCursor) Get() (v PaginationCursor, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptPaginationCursor) Or(d PaginationCursor) PaginationCursor { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptSlot returns new OptSlot with value set to v. +func NewOptSlot(v Slot) OptSlot { + return OptSlot{ + Value: v, + Set: true, + } +} + +// OptSlot is optional Slot. +type OptSlot struct { + Value Slot + Set bool +} + +// IsSet returns true if OptSlot was set. +func (o OptSlot) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptSlot) Reset() { + var v Slot + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptSlot) SetTo(v Slot) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptSlot) Get() (v Slot, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptSlot) Or(d Slot) Slot { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptString returns new OptString with value set to v. +func NewOptString(v string) OptString { + return OptString{ + Value: v, + Set: true, + } +} + +// OptString is optional string. +type OptString struct { + Value string + Set bool +} + +// IsSet returns true if OptString was set. +func (o OptString) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptString) Reset() { + var v string + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptString) SetTo(v string) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptString) Get() (v string, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptString) Or(d string) string { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// Offset-based pagination cursor. +// Ref: #/components/schemas/PaginationCursor +type PaginationCursor struct { + // The number of items to skip. + Offset OptInt `json:"offset"` + // The maximum number of items to return. + Limit OptInt `json:"limit"` +} + +// GetOffset returns the value of Offset. +func (s *PaginationCursor) GetOffset() OptInt { + return s.Offset +} + +// GetLimit returns the value of Limit. +func (s *PaginationCursor) GetLimit() OptInt { + return s.Limit +} + +// SetOffset sets the value of Offset. +func (s *PaginationCursor) SetOffset(val OptInt) { + s.Offset = val +} + +// SetLimit sets the value of Limit. +func (s *PaginationCursor) SetLimit(val OptInt) { + s.Limit = val +} + +// Ref: #/components/schemas/PaginationResponse +type PaginationResponse struct { + // The total number of matching items. + Total int64 `json:"total"` +} + +// GetTotal returns the value of Total. +func (s *PaginationResponse) GetTotal() int64 { + return s.Total +} + +// SetTotal sets the value of Total. +func (s *PaginationResponse) SetTotal(val int64) { + s.Total = val +} + +type Root string + +type Slot int64 + +type SlotString string + +// UnexpectedErrorStatusCode wraps Error with StatusCode. +type UnexpectedErrorStatusCode struct { + StatusCode int + Response Error +} + +// GetStatusCode returns the value of StatusCode. +func (s *UnexpectedErrorStatusCode) GetStatusCode() int { + return s.StatusCode +} + +// GetResponse returns the value of Response. +func (s *UnexpectedErrorStatusCode) GetResponse() Error { + return s.Response +} + +// SetStatusCode sets the value of StatusCode. +func (s *UnexpectedErrorStatusCode) SetStatusCode(val int) { + s.StatusCode = val +} + +// SetResponse sets the value of Response. +func (s *UnexpectedErrorStatusCode) SetResponse(val Error) { + s.Response = val +} diff --git a/api/rest/oas_server_gen.go b/api/rest/oas_server_gen.go new file mode 100644 index 0000000..4f9118c --- /dev/null +++ b/api/rest/oas_server_gen.go @@ -0,0 +1,82 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "context" +) + +// Handler handles operations described by OpenAPI v3 specification. +type Handler interface { + // GetEthereumNow implements getEthereumNow operation. + // + // Get the current wall-clock slot and epoch. + // + // GET /api/v1/ethereum/now + GetEthereumNow(ctx context.Context) (GetEthereumNowRes, error) + // GetEthereumSpec implements getEthereumSpec operation. + // + // Get the Ethereum network name and spec. + // + // GET /api/v1/ethereum/spec + GetEthereumSpec(ctx context.Context) (GetEthereumSpecRes, error) + // GetFrame implements getFrame operation. + // + // Get a single fork-choice frame by ID. + // + // GET /api/v1/frames/{id} + GetFrame(ctx context.Context, params GetFrameParams) (GetFrameRes, error) + // ListMetadata implements listMetadata operation. + // + // List fork-choice frame metadata. + // + // POST /api/v1/metadata + ListMetadata(ctx context.Context, req *MetadataQuery) (ListMetadataRes, error) + // ListMetadataEpochs implements listMetadataEpochs operation. + // + // List distinct epochs across stored frames. + // + // POST /api/v1/metadata/epochs + ListMetadataEpochs(ctx context.Context, req *MetadataQuery) (ListMetadataEpochsRes, error) + // ListMetadataLabels implements listMetadataLabels operation. + // + // List distinct labels across stored frames. + // + // POST /api/v1/metadata/labels + ListMetadataLabels(ctx context.Context, req *MetadataQuery) (ListMetadataLabelsRes, error) + // ListMetadataNodes implements listMetadataNodes operation. + // + // List distinct nodes across stored frames. + // + // POST /api/v1/metadata/nodes + ListMetadataNodes(ctx context.Context, req *MetadataQuery) (ListMetadataNodesRes, error) + // ListMetadataSlots implements listMetadataSlots operation. + // + // List distinct slots across stored frames. + // + // POST /api/v1/metadata/slots + ListMetadataSlots(ctx context.Context, req *MetadataQuery) (ListMetadataSlotsRes, error) + // NewError creates *UnexpectedErrorStatusCode from error returned by handler. + // + // Used for common default response. + NewError(ctx context.Context, err error) *UnexpectedErrorStatusCode +} + +// Server implements http server based on OpenAPI v3 specification and +// calls Handler to handle requests. +type Server struct { + h Handler + baseServer +} + +// NewServer creates new Server. +func NewServer(h Handler, opts ...ServerOption) (*Server, error) { + s, err := newServerConfig(opts...).baseServer() + if err != nil { + return nil, err + } + return &Server{ + h: h, + baseServer: s, + }, nil +} diff --git a/api/rest/oas_unimplemented_gen.go b/api/rest/oas_unimplemented_gen.go new file mode 100644 index 0000000..8af8d5c --- /dev/null +++ b/api/rest/oas_unimplemented_gen.go @@ -0,0 +1,94 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "context" + + ht "github.com/ogen-go/ogen/http" +) + +// UnimplementedHandler is no-op Handler which returns http.ErrNotImplemented. +type UnimplementedHandler struct{} + +var _ Handler = UnimplementedHandler{} + +// GetEthereumNow implements getEthereumNow operation. +// +// Get the current wall-clock slot and epoch. +// +// GET /api/v1/ethereum/now +func (UnimplementedHandler) GetEthereumNow(ctx context.Context) (r GetEthereumNowRes, _ error) { + return r, ht.ErrNotImplemented +} + +// GetEthereumSpec implements getEthereumSpec operation. +// +// Get the Ethereum network name and spec. +// +// GET /api/v1/ethereum/spec +func (UnimplementedHandler) GetEthereumSpec(ctx context.Context) (r GetEthereumSpecRes, _ error) { + return r, ht.ErrNotImplemented +} + +// GetFrame implements getFrame operation. +// +// Get a single fork-choice frame by ID. +// +// GET /api/v1/frames/{id} +func (UnimplementedHandler) GetFrame(ctx context.Context, params GetFrameParams) (r GetFrameRes, _ error) { + return r, ht.ErrNotImplemented +} + +// ListMetadata implements listMetadata operation. +// +// List fork-choice frame metadata. +// +// POST /api/v1/metadata +func (UnimplementedHandler) ListMetadata(ctx context.Context, req *MetadataQuery) (r ListMetadataRes, _ error) { + return r, ht.ErrNotImplemented +} + +// ListMetadataEpochs implements listMetadataEpochs operation. +// +// List distinct epochs across stored frames. +// +// POST /api/v1/metadata/epochs +func (UnimplementedHandler) ListMetadataEpochs(ctx context.Context, req *MetadataQuery) (r ListMetadataEpochsRes, _ error) { + return r, ht.ErrNotImplemented +} + +// ListMetadataLabels implements listMetadataLabels operation. +// +// List distinct labels across stored frames. +// +// POST /api/v1/metadata/labels +func (UnimplementedHandler) ListMetadataLabels(ctx context.Context, req *MetadataQuery) (r ListMetadataLabelsRes, _ error) { + return r, ht.ErrNotImplemented +} + +// ListMetadataNodes implements listMetadataNodes operation. +// +// List distinct nodes across stored frames. +// +// POST /api/v1/metadata/nodes +func (UnimplementedHandler) ListMetadataNodes(ctx context.Context, req *MetadataQuery) (r ListMetadataNodesRes, _ error) { + return r, ht.ErrNotImplemented +} + +// ListMetadataSlots implements listMetadataSlots operation. +// +// List distinct slots across stored frames. +// +// POST /api/v1/metadata/slots +func (UnimplementedHandler) ListMetadataSlots(ctx context.Context, req *MetadataQuery) (r ListMetadataSlotsRes, _ error) { + return r, ht.ErrNotImplemented +} + +// NewError creates *UnexpectedErrorStatusCode from error returned by handler. +// +// Used for common default response. +func (UnimplementedHandler) NewError(ctx context.Context, err error) (r *UnexpectedErrorStatusCode) { + r = new(UnexpectedErrorStatusCode) + return r +} diff --git a/api/rest/oas_validators_gen.go b/api/rest/oas_validators_gen.go new file mode 100644 index 0000000..9610601 --- /dev/null +++ b/api/rest/oas_validators_gen.go @@ -0,0 +1,803 @@ +// Code generated by ogen, DO NOT EDIT. + +package rest + +import ( + "fmt" + + "github.com/go-faster/errors" + "github.com/ogen-go/ogen/validate" +) + +func (s Epoch) Validate() error { + alias := (int64)(s) + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(alias)); err != nil { + return errors.Wrap(err, "int") + } + return nil +} + +func (s *EthereumNow) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Slot.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "slot", + Error: err, + }) + } + if err := func() error { + if err := s.Epoch.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "epoch", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ForkChoice) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.ForkChoiceNodes == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.ForkChoiceNodes { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "fork_choice_nodes", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ForkChoiceNode) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Validity.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "validity", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s ForkChoiceNodeValidity) Validate() error { + switch s { + case "valid": + return nil + case "invalid": + return nil + case "optimistic": + return nil + case "unknown": + return nil + default: + return errors.Errorf("invalid value: %v", s) + } +} + +func (s *Frame) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if err := func() error { + if err := s.Metadata.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "metadata", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *FrameFilter) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if value, ok := s.Slot.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "slot", + Error: err, + }) + } + if err := func() error { + if value, ok := s.Epoch.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "epoch", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *FrameMetadata) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.WallClockSlot.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wall_clock_slot", + Error: err, + }) + } + if err := func() error { + if err := s.WallClockEpoch.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wall_clock_epoch", + Error: err, + }) + } + if err := func() error { + if s.Labels == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "labels", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *GetEthereumNowOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *GetEthereumNowOKHeaders) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Response", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *GetFrameOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *GetFrameOKData) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Frame.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "frame", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *GetFrameOKHeaders) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Response", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataEpochsOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataEpochsOKData) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Epochs == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Epochs { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "epochs", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataEpochsOKHeaders) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Response", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataLabelsOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataLabelsOKData) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Labels == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "labels", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataLabelsOKHeaders) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Response", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataNodesOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataNodesOKData) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Nodes == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "nodes", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataNodesOKHeaders) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Response", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataOKData) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Frames == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Frames { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "frames", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataSlotsOK) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Data.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "data", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataSlotsOKData) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Slots == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Slots { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "slots", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *ListMetadataSlotsOKHeaders) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := s.Response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "Response", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *MetadataQuery) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if value, ok := s.Filter.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "filter", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s Slot) Validate() error { + alias := (int64)(s) + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(alias)); err != nil { + return errors.Wrap(err, "int") + } + return nil +} diff --git a/api/spec.go b/api/spec.go new file mode 100644 index 0000000..87722c1 --- /dev/null +++ b/api/spec.go @@ -0,0 +1,8 @@ +package api + +import _ "embed" + +// OpenAPISpec contains the canonical Forky OpenAPI specification. +// +//go:embed openapi.yaml +var OpenAPISpec []byte diff --git a/cmd/forky/main.go b/cmd/forky/main.go new file mode 100644 index 0000000..47a52f1 --- /dev/null +++ b/cmd/forky/main.go @@ -0,0 +1,76 @@ +// Command forky fetches and serves Ethereum fork choice data. It wires up the +// CLI, loads configuration, and runs the application. +package main + +import ( + "context" + //nolint:gosec // pprof is served on a separate, operator-controlled port + _ "net/http/pprof" + "os" + + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + + forky "github.com/ethpandaops/forky" + "github.com/ethpandaops/forky/internal/version" +) + +var ( + cfgFile string + log = logrus.New() +) + +func main() { + if err := rootCmd().Execute(); err != nil { + os.Exit(1) + } +} + +func rootCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "forky", + Short: "Fetches and serves Ethereum fork choice data", + Run: func(_ *cobra.Command, _ []string) { + cfg := initCommon() + + server := forky.NewServer(log, cfg) + if err := server.Start(context.Background()); err != nil { + log.WithError(err).Fatal("failed to serve") + } + }, + } + + cmd.PersistentFlags().StringVar(&cfgFile, "config", "config.yaml", "config file (default is config.yaml)") + cmd.AddCommand(versionCmd()) + + return cmd +} + +func initCommon() *forky.Config { + log.SetFormatter(&logrus.TextFormatter{}) + log.WithField("file", cfgFile).Info("Loading config") + + config, err := forky.NewConfigFromYAMLFile(cfgFile) + if err != nil { + log.Fatal(err) + } + + logLevel, err := logrus.ParseLevel(config.LogLevel) + if err != nil { + log.WithField("log_level", config.LogLevel).Fatal("invalid log level") + } + + log.SetLevel(logLevel) + + return config +} + +func versionCmd() *cobra.Command { + return &cobra.Command{ + Use: "version", + Short: "Print version information", + Run: func(cmd *cobra.Command, _ []string) { + cmd.Println(version.Full()) + }, + } +} diff --git a/cmd/root.go b/cmd/root.go deleted file mode 100644 index 5df3253..0000000 --- a/cmd/root.go +++ /dev/null @@ -1,61 +0,0 @@ -package cmd - -import ( - "context" - "os" - - "github.com/ethpandaops/forky/pkg/forky" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "forky", - Short: "Fetches and serves Ethereum fork choice data", - Run: func(cmd *cobra.Command, args []string) { - cfg := initCommon() - p := forky.NewServer(log, cfg) - if err := p.Start(context.Background()); err != nil { - log.WithError(err).Fatal("failed to serve") - } - }, -} - -var ( - cfgFile string - log = logrus.New() -) - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - err := rootCmd.Execute() - if err != nil { - os.Exit(1) - } -} - -func init() { - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "config.yaml", "config file (default is config.yaml)") -} - -func initCommon() *forky.Config { - log.SetFormatter(&logrus.TextFormatter{}) - - log.WithField("file", cfgFile).Info("Loading config") - - config, err := forky.NewConfigFromYAMLFile(cfgFile) - if err != nil { - log.Fatal(err) - } - - logLevel, err := logrus.ParseLevel(config.LogLevel) - if err != nil { - log.WithField("log_level", config.LogLevel).Fatal("invalid log level") - } - - log.SetLevel(logLevel) - - return config -} diff --git a/pkg/forky/config.go b/config.go similarity index 91% rename from pkg/forky/config.go rename to config.go index 564c008..d66340b 100644 --- a/pkg/forky/config.go +++ b/config.go @@ -4,9 +4,10 @@ import ( "os" "github.com/creasty/defaults" - "github.com/ethpandaops/forky/pkg/forky/api" - "github.com/ethpandaops/forky/pkg/forky/service" "gopkg.in/yaml.v2" + + "github.com/ethpandaops/forky/internal/api" + "github.com/ethpandaops/forky/internal/service" ) type Config struct { diff --git a/pkg/forky/forkchoice.go b/forkchoice.go similarity index 76% rename from pkg/forky/forkchoice.go rename to forkchoice.go index dd6bea0..1d3bc1f 100644 --- a/pkg/forky/forkchoice.go +++ b/forkchoice.go @@ -2,16 +2,16 @@ package forky import ( "context" - "io/fs" "net/http" "time" - "github.com/ethpandaops/forky/pkg/forky/api" - "github.com/ethpandaops/forky/pkg/forky/service" - static "github.com/ethpandaops/forky/web" - "github.com/julienschmidt/httprouter" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" + + openapi "github.com/ethpandaops/forky/api" + "github.com/ethpandaops/forky/internal/api" + "github.com/ethpandaops/forky/internal/service" + "github.com/ethpandaops/forky/web" ) // Server is the main server for the forkchoice service. @@ -66,34 +66,42 @@ func (s *Server) Start(ctx context.Context) error { } } - router := httprouter.New() - - frontend, err := fs.Sub(static.FS, "build/frontend") + frontend, err := web.GetFS() if err != nil { return err } filesystem := http.FS(frontend) - router.NotFound = wrapHandler(http.FileServer(filesystem), filesystem) - if s.Cfg.Metrics.Enabled { - if err := s.ServeMetrics(ctx); err != nil { - return err + if metricsErr := s.ServeMetrics(ctx); metricsErr != nil { + return metricsErr } } + apiHandler, err := s.http.Handler() + if err != nil { + return err + } + + mux := http.NewServeMux() + mux.Handle("/api/", apiHandler) + mux.HandleFunc("GET /openapi.yaml", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/yaml") + + if _, err := w.Write(openapi.OpenAPISpec); err != nil { + s.log.WithError(err).Error("Failed to write OpenAPI spec") + } + }) + mux.Handle("/", wrapHandler(http.FileServer(filesystem), filesystem)) + server := &http.Server{ Addr: s.Cfg.ListenAddr, ReadHeaderTimeout: 3 * time.Minute, WriteTimeout: 15 * time.Minute, } - if err := s.http.BindToRouter(ctx, router); err != nil { - return err - } - - server.Handler = router + server.Handler = mux s.log.Infof("Serving http at %s", s.Cfg.ListenAddr) diff --git a/pkg/forky/forky_test.go b/forky_test.go similarity index 84% rename from pkg/forky/forky_test.go rename to forky_test.go index ae35633..9c07a21 100644 --- a/pkg/forky/forky_test.go +++ b/forky_test.go @@ -7,16 +7,16 @@ import ( "testing" "time" - "github.com/ethpandaops/forky/pkg/forky/service" - "github.com/ethpandaops/forky/pkg/forky/types" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" -) + "github.com/stretchr/testify/require" -var ( - testDBCounter = 0 + "github.com/ethpandaops/forky/internal/service" + "github.com/ethpandaops/forky/internal/types" ) +var testDBCounter = 0 + func newTestServer(withConfig string) (Server, error) { // create mock log object log := logrus.New() @@ -72,7 +72,7 @@ forky: func TestForkChoiceServer(t *testing.T) { t.Run("Add a random frame", func(t *testing.T) { s, err := newTestServer("") - assert.NoError(t, err) + require.NoError(t, err) go func() { err = s.Start(context.Background()) @@ -83,12 +83,12 @@ func TestForkChoiceServer(t *testing.T) { frame := types.GenerateFakeFrame() err = s.svc.AddNewFrame(context.Background(), "fake", frame) - assert.NoError(t, err) + require.NoError(t, err) }) t.Run("Add and get a frame", func(t *testing.T) { s, err := newTestServer("") - assert.NoError(t, err) + require.NoError(t, err) go func() { err = s.Start(context.Background()) @@ -99,17 +99,17 @@ func TestForkChoiceServer(t *testing.T) { frame := types.GenerateFakeFrame() err = s.svc.AddNewFrame(context.Background(), "fake", frame) - assert.NoError(t, err) + require.NoError(t, err) // query the frame f, err := s.svc.GetFrame(context.Background(), frame.Metadata.ID) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, frame.Metadata.ID, f.Metadata.ID) }) t.Run("Add and list a frame", func(t *testing.T) { s, err := newTestServer("") - assert.NoError(t, err) + require.NoError(t, err) go func() { err = s.Start(context.Background()) @@ -120,19 +120,19 @@ func TestForkChoiceServer(t *testing.T) { frame := types.GenerateFakeFrame() err = s.svc.AddNewFrame(context.Background(), "fake", frame) - assert.NoError(t, err) + require.NoError(t, err) // query the frame f, _, err := s.svc.ListMetadata(context.Background(), &service.FrameFilter{ Node: &frame.Metadata.Node, }, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, frame.Metadata.ID, f[0].ID) }) t.Run("Add and list a frame by its metadata types", func(t *testing.T) { s, err := newTestServer("") - assert.NoError(t, err) + require.NoError(t, err) go func() { err = s.Start(context.Background()) @@ -143,37 +143,37 @@ func TestForkChoiceServer(t *testing.T) { frame := types.GenerateFakeFrame() err = s.svc.AddNewFrame(context.Background(), "fake", frame) - assert.NoError(t, err) + require.NoError(t, err) // query the frame f, _, err := s.svc.ListNodes(context.Background(), &service.FrameFilter{ Node: &frame.Metadata.Node, }, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, frame.Metadata.Node, f[0]) f, _, err = s.svc.ListLabels(context.Background(), &service.FrameFilter{ Node: &frame.Metadata.Node, }, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, frame.Metadata.Labels[0], f[0]) epochs, _, err := s.svc.ListEpochs(context.Background(), &service.FrameFilter{ Node: &frame.Metadata.Node, }, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, frame.Metadata.WallClockEpoch, epochs[0]) slots, _, err := s.svc.ListSlots(context.Background(), &service.FrameFilter{ Node: &frame.Metadata.Node, }, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, frame.Metadata.WallClockSlot, slots[0]) }) t.Run("Pagination", func(t *testing.T) { s, err := newTestServer("") - assert.NoError(t, err) + require.NoError(t, err) go func() { err = s.Start(context.Background()) @@ -184,21 +184,21 @@ func TestForkChoiceServer(t *testing.T) { //nolint:gosec // This is a test function. framesToCreate := rand.Intn(500) - for i := 0; i < framesToCreate; i++ { + for range framesToCreate { f := types.GenerateFakeFrame() err = s.svc.AddNewFrame(context.Background(), "fake", f) - assert.NoError(t, err) + require.NoError(t, err) } // query the frame _, page, err := s.svc.ListMetadata(context.Background(), &service.FrameFilter{}, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, page.Total, int64(framesToCreate)) }) t.Run("Retention period purging", func(t *testing.T) { s, err := newTestServer("") - assert.NoError(t, err) + require.NoError(t, err) s.Cfg.Forky.RetentionPeriod.Duration = 1 * time.Second @@ -211,26 +211,26 @@ func TestForkChoiceServer(t *testing.T) { //nolint:gosec // This is a test function. framesToCreate := rand.Intn(500) - for i := 0; i < framesToCreate; i++ { + for range framesToCreate { f := types.GenerateFakeFrame() err = s.svc.AddNewFrame(context.Background(), "fake", f) - assert.NoError(t, err) + require.NoError(t, err) } time.Sleep(5 * time.Second) err = s.svc.DeleteOldFrames(context.Background()) - assert.NoError(t, err) + require.NoError(t, err) // query the frame _, page, err := s.svc.ListMetadata(context.Background(), &service.FrameFilter{}, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int64(0), page.Total) }) t.Run("Add and delete frames", func(t *testing.T) { s, err := newTestServer("") - assert.NoError(t, err) + require.NoError(t, err) go func() { err = s.Start(context.Background()) @@ -241,26 +241,26 @@ func TestForkChoiceServer(t *testing.T) { //nolint:gosec // This is a test function. framesToCreate := rand.Intn(500) - for i := 0; i < framesToCreate; i++ { + for range framesToCreate { f := types.GenerateFakeFrame() err = s.svc.AddNewFrame(context.Background(), "fake", f) - assert.NoError(t, err) + require.NoError(t, err) } frames, page, err := s.svc.ListMetadata(context.Background(), &service.FrameFilter{}, *service.DefaultPagination()) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, page.Total, int64(framesToCreate)) assert.Equal(t, len(frames), framesToCreate) for _, f := range frames { err = s.svc.DeleteFrame(context.Background(), f.ID) - assert.NoError(t, err) + require.NoError(t, err) } // query the frame newFrames, page, err := s.svc.ListMetadata(context.Background(), &service.FrameFilter{}, *service.DefaultPagination()) - assert.NoError(t, err) - assert.Equal(t, page.Total, int64(0)) - assert.Equal(t, len(newFrames), 0) + require.NoError(t, err) + assert.Equal(t, int64(0), page.Total) + assert.Empty(t, newFrames) }) } diff --git a/go.mod b/go.mod index 58d6892..a58606e 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/ethpandaops/forky -go 1.24.0 - -toolchain go1.24.5 +go 1.26.2 replace github.com/probe-lab/hermes => github.com/ethpandaops/hermes v0.0.4-0.20250715094801-db6021d1c703 @@ -20,16 +18,19 @@ require ( github.com/ethpandaops/xatu v1.3.2 github.com/glebarez/sqlite v1.10.0 github.com/go-co-op/gocron v1.37.0 + github.com/go-faster/errors v0.7.1 + github.com/go-faster/jx v1.2.0 github.com/google/uuid v1.6.0 github.com/jellydator/ttlcache/v3 v3.4.0 - github.com/julienschmidt/httprouter v1.3.0 - github.com/lib/pq v1.10.9 - github.com/pkg/errors v0.9.1 + github.com/ogen-go/ogen v1.20.3 github.com/prometheus/client_golang v1.22.0 github.com/rs/zerolog v1.34.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.9.1 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 + go.opentelemetry.io/otel v1.42.0 + go.opentelemetry.io/otel/metric v1.42.0 + go.opentelemetry.io/otel/trace v1.42.0 google.golang.org/protobuf v1.36.6 gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0 gopkg.in/yaml.v2 v2.4.0 @@ -40,7 +41,7 @@ require ( require ( github.com/OffchainLabs/prysm/v6 v6.0.5-0.20250610223352-6087875da526 // indirect - github.com/andybalholm/brotli v1.1.1 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect github.com/aws/aws-sdk-go-v2/config v1.29.9 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect @@ -65,16 +66,20 @@ require ( github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/dennis-tra/go-kinesis v0.0.0-20240326083914-7acf5f8dc24e // indirect + github.com/dlclark/regexp2 v1.11.5 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/elastic/gosigar v0.14.3 // indirect github.com/emicklei/dot v1.8.0 // indirect github.com/ethereum/go-ethereum v1.16.1 // indirect + github.com/fatih/color v1.19.0 // indirect github.com/ferranbt/fastssz v0.1.4 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect + github.com/ghodss/yaml v1.0.0 // indirect github.com/glebarez/go-sqlite v1.22.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-faster/yaml v0.4.6 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/goccy/go-yaml v1.17.1 // indirect @@ -99,7 +104,7 @@ require ( github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/compress v1.18.2 // indirect github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/koron/go-ssdp v0.0.6 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect @@ -158,6 +163,7 @@ require ( github.com/pion/turn/v4 v4.0.1 // indirect github.com/pion/webrtc/v4 v4.1.0 // indirect github.com/pk910/dynamic-ssz v0.0.6 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/probe-lab/hermes v0.0.0-20250328140724-f552d3382c38 // indirect github.com/prometheus/client_model v0.6.2 // indirect @@ -174,20 +180,19 @@ require ( github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/segmentio/asm v1.2.1 // indirect + github.com/shopspring/decimal v1.4.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/thejerf/suture/v4 v4.0.6 // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect github.com/wlynxg/anet v0.0.5 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.57.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk v1.35.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/otel/sdk v1.42.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.42.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect @@ -195,16 +200,17 @@ require ( go.uber.org/fx v1.23.0 // indirect go.uber.org/mock v0.5.2 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.38.0 // indirect + go.uber.org/zap v1.27.1 // indirect + golang.org/x/crypto v0.49.0 // indirect golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect - golang.org/x/mod v0.24.0 // indirect - golang.org/x/net v0.40.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.25.0 // indirect + golang.org/x/mod v0.33.0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 // indirect + golang.org/x/text v0.35.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.33.0 // indirect + golang.org/x/tools v0.42.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250512202823-5a2f75b736a9 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9 // indirect google.golang.org/grpc v1.72.1 // indirect @@ -217,3 +223,5 @@ require ( modernc.org/memory v1.7.2 // indirect modernc.org/sqlite v1.28.0 // indirect ) + +tool github.com/ogen-go/ogen/cmd/ogen diff --git a/go.sum b/go.sum index bff2493..645672a 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= -github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/attestantio/go-eth2-client v0.26.1-0.20250721122214-dc2928832acc h1:rLrx/o7WeRqmE9iXvhyBMDrugOPZRhNBLQD/4XbG6hU= github.com/attestantio/go-eth2-client v0.26.1-0.20250721122214-dc2928832acc/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY= @@ -144,6 +144,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/dennis-tra/go-kinesis v0.0.0-20240326083914-7acf5f8dc24e h1:y6QyYh8YZyRQDdfnQqUgC5tRBmEwUFAjavnybKboCm4= github.com/dennis-tra/go-kinesis v0.0.0-20240326083914-7acf5f8dc24e/go.mod h1:5Hm3EOeNP1/lYm9qcFwWgYgjixQilwcZA+hZ05bUz54= +github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= +github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -167,6 +169,8 @@ github.com/ethpandaops/hermes v0.0.4-0.20250715094801-db6021d1c703 h1:kgbDt5VGau github.com/ethpandaops/hermes v0.0.4-0.20250715094801-db6021d1c703/go.mod h1:btvQ5XIwNLN1xKq0/G4HE+wxa7C93IFnxqfkM4PjMZA= github.com/ethpandaops/xatu v1.3.2 h1:2ieq1Db9GoAFngv6u/HCWo8U3Cz6BAAqY2UPF+7Macg= github.com/ethpandaops/xatu v1.3.2/go.mod h1:kld9Upqa0DRoNNyKzufXpYvY1YAnEU3s4ATJb1MaY94= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -175,6 +179,7 @@ github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwU github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= @@ -184,6 +189,12 @@ github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0= github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= +github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= +github.com/go-faster/jx v1.2.0 h1:T2YHJPrFaYu21fJtUxC9GzmluKu8rVIFDwwGBKTDseI= +github.com/go-faster/jx v1.2.0/go.mod h1:UWLOVDmMG597a5tBFPLIWJdUxz5/2emOpfsj9Neg0PE= +github.com/go-faster/yaml v0.4.6 h1:lOK/EhI04gCpPgPhgt0bChS6bvw7G3WwI8xxVe0sw9I= +github.com/go-faster/yaml v0.4.6/go.mod h1:390dRIvV4zbnO7qC9FGo6YYutc+wyyUSHBgbXL52eXk= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -197,8 +208,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -344,13 +355,12 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -370,8 +380,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= @@ -459,6 +467,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/ogen-go/ogen v1.20.3 h1:1tvJuJE0BnQ7Nukd6ykiTOP0ucfL0yrAjHUg3S1DCQk= +github.com/ogen-go/ogen v1.20.3/go.mod h1:sJ1pJVp4S1RcSZlYIiMLo0QSMSt2pls4zfrc+hNKnzk= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= @@ -606,7 +616,11 @@ github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= +github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -657,8 +671,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/thejerf/suture/v4 v4.0.6 h1:QsuCEsCqb03xF9tPAsWAj8QOAJBgQI1c0VqJNaingg8= github.com/thejerf/suture/v4 v4.0.6/go.mod h1:gu9Y4dXNUWFrByqRt30Rm9/UZ0wzRSt9AJS6xu/ZGxU= @@ -685,24 +699,24 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho= +go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo= go.opentelemetry.io/otel/exporters/prometheus v0.57.0 h1:AHh/lAP1BHrY5gBwk8ncc25FXWm/gmmY3BX258z5nuk= go.opentelemetry.io/otel/exporters/prometheus v0.57.0/go.mod h1:QpFWz1QxqevfjwzYdbMb4Y1NnlJvqSGwyuU0B4iuc9c= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4= +go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI= +go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo= +go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts= +go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA= +go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc= +go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY= +go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -720,8 +734,8 @@ go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -739,8 +753,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -776,8 +790,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -824,8 +838,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -853,8 +867,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -914,8 +928,10 @@ golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 h1:bTLqdHv7xrGlFbvf5/TXNxy/iUwwdkjhqQTJDjW7aj0= +golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -934,8 +950,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -989,8 +1005,8 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/forky/http.go b/http.go similarity index 100% rename from pkg/forky/http.go rename to http.go diff --git a/pkg/forky/api/config.go b/internal/api/config.go similarity index 80% rename from pkg/forky/api/config.go rename to internal/api/config.go index a1572be..e8460df 100644 --- a/pkg/forky/api/config.go +++ b/internal/api/config.go @@ -1,8 +1,10 @@ package api import ( - "github.com/ethpandaops/forky/pkg/forky/human" - "github.com/pkg/errors" + "errors" + "fmt" + + "github.com/ethpandaops/forky/internal/human" ) type Config struct { @@ -17,7 +19,7 @@ type EdgeCacheConfig struct { func (c *Config) Validate() error { if err := c.EdgeCacheConfig.Validate(); err != nil { - return errors.Wrap(err, "invalid edge cache config") + return fmt.Errorf("invalid edge cache config: %w", err) } return nil diff --git a/internal/api/ethereum.go b/internal/api/ethereum.go new file mode 100644 index 0000000..a0c8200 --- /dev/null +++ b/internal/api/ethereum.go @@ -0,0 +1,44 @@ +package api + +import ( + "context" + + "github.com/ethpandaops/forky/api/rest" +) + +// GetEthereumNow implements getEthereumNow: the current wall-clock slot and +// epoch. +func (h *HTTP) GetEthereumNow(ctx context.Context) (rest.GetEthereumNowRes, error) { + slot, epoch, err := h.svc.GetEthereumNow(ctx) + if err != nil { + return nil, err + } + + return &rest.GetEthereumNowOKHeaders{ + CacheControl: rest.NewOptString("public, max-age=1, s-maxage=1"), + Response: rest.GetEthereumNowOK{ + Data: rest.EthereumNow{ + Slot: rest.Slot(safeInt64(uint64(slot))), + Epoch: rest.Epoch(safeInt64(uint64(epoch))), + }, + }, + }, nil +} + +// GetEthereumSpec implements getEthereumSpec: the configured network name and +// spec. +func (h *HTTP) GetEthereumSpec(ctx context.Context) (rest.GetEthereumSpecRes, error) { + return &rest.GetEthereumSpecOKHeaders{ + CacheControl: rest.NewOptString("public, max-age=60, s-maxage=60"), + Response: rest.GetEthereumSpecOK{ + Data: rest.EthereumSpecResult{ + NetworkName: h.svc.GetEthereumNetworkName(ctx), + Spec: rest.EthereumSpec{ + SecondsPerSlot: safeInt64(h.svc.GetEthereumSpecSecondsPerSlot(ctx)), + SlotsPerEpoch: safeInt64(h.svc.GetEthereumSpecSlotsPerEpoch(ctx)), + GenesisTime: h.svc.GetEthereumSpecGenesisTime(ctx).UTC(), + }, + }, + }, + }, nil +} diff --git a/internal/api/frames.go b/internal/api/frames.go new file mode 100644 index 0000000..2c804d1 --- /dev/null +++ b/internal/api/frames.go @@ -0,0 +1,138 @@ +package api + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + v1 "github.com/attestantio/go-eth2-client/api/v1" + "github.com/attestantio/go-eth2-client/spec/phase0" + "github.com/go-faster/jx" + + "github.com/ethpandaops/forky/api/rest" + "github.com/ethpandaops/forky/internal/service" + "github.com/ethpandaops/forky/internal/types" +) + +// GetFrame implements getFrame: a single fork-choice frame by ID. +func (h *HTTP) GetFrame(ctx context.Context, params rest.GetFrameParams) (rest.GetFrameRes, error) { + frame, err := h.svc.GetFrame(ctx, params.ID) + if err != nil { + if errors.Is(err, service.ErrFrameNotFound) { + return &rest.Error{ + Code: http.StatusNotFound, + Message: err.Error(), + }, nil + } + + return nil, err + } + + restFrame, err := frameToRest(frame) + if err != nil { + return nil, err + } + + rsp := &rest.GetFrameOKHeaders{ + Response: rest.GetFrameOK{ + Data: rest.GetFrameOKData{ + Frame: restFrame, + }, + }, + } + + if h.config.EdgeCacheConfig.Enabled { + ttl := int64(h.config.EdgeCacheConfig.FrameTTL.Seconds()) + rsp.CacheControl = rest.NewOptString(fmt.Sprintf("public, max-age=%[1]d, s-maxage=%[1]d", ttl)) + } + + return rsp, nil +} + +// frameToRest maps a domain frame onto the spec's Frame schema. +func frameToRest(frame *types.Frame) (rest.Frame, error) { + data, err := forkChoiceToRest(frame.Data) + if err != nil { + return rest.Frame{}, err + } + + return rest.Frame{ + Data: data, + Metadata: frameMetadataToRest(&frame.Metadata), + }, nil +} + +// frameMetadataToRest maps domain frame metadata onto the spec's +// FrameMetadata schema. +func frameMetadataToRest(m *types.FrameMetadata) rest.FrameMetadata { + labels := m.Labels + if labels == nil { + labels = []string{} + } + + return rest.FrameMetadata{ + ID: m.ID, + Node: m.Node, + FetchedAt: m.FetchedAt.UTC(), + WallClockSlot: rest.Slot(safeInt64(uint64(m.WallClockSlot))), + WallClockEpoch: rest.Epoch(safeInt64(uint64(m.WallClockEpoch))), + Labels: labels, + ConsensusClient: m.ConsensusClient, + EventSource: m.EventSource, + } +} + +// forkChoiceToRest maps a beacon node fork-choice dump onto the spec's +// ForkChoice schema, following the beacon-API string serialization for +// slots, epochs and weights. +func forkChoiceToRest(fc *v1.ForkChoice) (rest.ForkChoice, error) { + nodes := make([]rest.ForkChoiceNode, 0, len(fc.ForkChoiceNodes)) + + for _, node := range fc.ForkChoiceNodes { + restNode := rest.ForkChoiceNode{ + Slot: rest.SlotString(strconv.FormatUint(uint64(node.Slot), 10)), + BlockRoot: rest.Root(node.BlockRoot.String()), + ParentRoot: rest.Root(node.ParentRoot.String()), + JustifiedEpoch: rest.EpochString(strconv.FormatUint(uint64(node.JustifiedEpoch), 10)), + FinalizedEpoch: rest.EpochString(strconv.FormatUint(uint64(node.FinalizedEpoch), 10)), + Weight: strconv.FormatUint(node.Weight, 10), + Validity: rest.ForkChoiceNodeValidity(node.Validity.String()), + ExecutionBlockHash: rest.Root(node.ExecutionBlockHash.String()), + } + + if len(node.ExtraData) > 0 { + extra := make(rest.ForkChoiceNodeExtraData, len(node.ExtraData)) + + for key, value := range node.ExtraData { + raw, err := json.Marshal(value) + if err != nil { + return rest.ForkChoice{}, fmt.Errorf("failed to marshal extra_data %q: %w", key, err) + } + + extra[key] = jx.Raw(raw) + } + + restNode.ExtraData = rest.NewOptForkChoiceNodeExtraData(extra) + } + + nodes = append(nodes, restNode) + } + + return rest.ForkChoice{ + JustifiedCheckpoint: checkpointToRest(fc.JustifiedCheckpoint), + FinalizedCheckpoint: checkpointToRest(fc.FinalizedCheckpoint), + ForkChoiceNodes: nodes, + }, nil +} + +// checkpointToRest maps a beacon checkpoint onto the spec's Checkpoint +// schema. +func checkpointToRest(cp phase0.Checkpoint) rest.Checkpoint { + return rest.Checkpoint{ + Epoch: rest.EpochString(strconv.FormatUint(uint64(cp.Epoch), 10)), + Root: rest.Root(cp.Root.String()), + } +} diff --git a/internal/api/http.go b/internal/api/http.go new file mode 100644 index 0000000..eb9756c --- /dev/null +++ b/internal/api/http.go @@ -0,0 +1,108 @@ +// Package api implements the Forky HTTP API as defined by the OpenAPI spec +// at api/openapi.yaml. The handlers implement the ogen-generated +// rest.Handler interface and map domain types onto the generated schema +// types, so the wire format is enforced by the spec. +package api + +import ( + "context" + "errors" + "fmt" + "math" + "net/http" + + "github.com/go-faster/jx" + "github.com/ogen-go/ogen/ogenerrors" + "github.com/sirupsen/logrus" + + "github.com/ethpandaops/forky/api/rest" + "github.com/ethpandaops/forky/internal/service" +) + +// HTTP serves the Forky API over HTTP. +type HTTP struct { + log logrus.FieldLogger + svc *service.ForkChoice + metrics Metrics + config *Config + opts *Options +} + +var _ rest.Handler = (*HTTP)(nil) + +// NewHTTP creates a new HTTP API around the fork-choice service. +func NewHTTP(log logrus.FieldLogger, svc *service.ForkChoice, config *Config, opts *Options) (*HTTP, error) { + if err := config.Validate(); err != nil { + return nil, fmt.Errorf("invalid http config: %w", err) + } + + return &HTTP{ + opts: opts, + config: config, + svc: svc, + log: log.WithField("component", "http"), + metrics: NewMetrics(opts.MetricsEnabled, "http"), + }, nil +} + +// Handler returns the http.Handler serving the API, instrumented with +// per-route metrics. +func (h *HTTP) Handler() (http.Handler, error) { + srv, err := rest.NewServer(h, rest.WithErrorHandler(h.handleRequestError)) + if err != nil { + return nil, fmt.Errorf("failed to create rest server: %w", err) + } + + return h.instrument(srv), nil +} + +// NewError maps handler errors onto the spec's default error response. +func (h *HTTP) NewError(_ context.Context, err error) *rest.UnexpectedErrorStatusCode { + code := http.StatusInternalServerError + if errors.Is(err, service.ErrFrameNotFound) { + code = http.StatusNotFound + } + + if code >= http.StatusInternalServerError { + h.log.WithError(err).Error("Handler error") + } + + return &rest.UnexpectedErrorStatusCode{ + StatusCode: code, + Response: rest.Error{ + Code: code, + Message: err.Error(), + }, + } +} + +// handleRequestError writes ogen-level errors (request decoding, routing) +// using the spec's error envelope. +func (h *HTTP) handleRequestError(_ context.Context, w http.ResponseWriter, _ *http.Request, err error) { + code := ogenerrors.ErrorCode(err) + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(code) + + e := new(jx.Encoder) + + rsp := rest.Error{ + Code: code, + Message: err.Error(), + } + rsp.Encode(e) + + if _, writeErr := e.WriteTo(w); writeErr != nil { + h.log.WithError(writeErr).Error("Failed to write error response") + } +} + +// safeInt64 converts an unsigned value to int64, clamping at the maximum +// rather than overflowing. +func safeInt64(v uint64) int64 { + if v > math.MaxInt64 { + return math.MaxInt64 + } + + return int64(v) +} diff --git a/internal/api/metadata.go b/internal/api/metadata.go new file mode 100644 index 0000000..9be9c8d --- /dev/null +++ b/internal/api/metadata.go @@ -0,0 +1,204 @@ +package api + +import ( + "context" + + "github.com/ethpandaops/forky/api/rest" + "github.com/ethpandaops/forky/internal/service" +) + +// cacheControlNoStore disables caching for listing endpoints whose results +// change as new frames arrive. +const cacheControlNoStore = "private, max-age=0, no-cache, no-store, must-revalidate" + +// ListMetadata implements listMetadata: a page of frame metadata. +func (h *HTTP) ListMetadata(ctx context.Context, req *rest.MetadataQuery) (rest.ListMetadataRes, error) { + filter, page := metadataQueryFromRest(req) + + frames, pg, err := h.svc.ListMetadata(ctx, filter, page) + if err != nil { + return nil, err + } + + restFrames := make([]rest.FrameMetadata, 0, len(frames)) + for _, frame := range frames { + restFrames = append(restFrames, frameMetadataToRest(frame)) + } + + return &rest.ListMetadataOK{ + Data: rest.ListMetadataOKData{ + Frames: restFrames, + Pagination: paginationToRest(pg), + }, + }, nil +} + +// ListMetadataNodes implements listMetadataNodes: distinct node names. +func (h *HTTP) ListMetadataNodes(ctx context.Context, req *rest.MetadataQuery) (rest.ListMetadataNodesRes, error) { + filter, page := metadataQueryFromRest(req) + + nodes, pg, err := h.svc.ListNodes(ctx, filter, page) + if err != nil { + return nil, err + } + + if nodes == nil { + nodes = []string{} + } + + return &rest.ListMetadataNodesOKHeaders{ + CacheControl: rest.NewOptString(cacheControlNoStore), + Response: rest.ListMetadataNodesOK{ + Data: rest.ListMetadataNodesOKData{ + Nodes: nodes, + Pagination: paginationToRest(pg), + }, + }, + }, nil +} + +// ListMetadataSlots implements listMetadataSlots: distinct slots. +func (h *HTTP) ListMetadataSlots(ctx context.Context, req *rest.MetadataQuery) (rest.ListMetadataSlotsRes, error) { + filter, page := metadataQueryFromRest(req) + + slots, pg, err := h.svc.ListSlots(ctx, filter, page) + if err != nil { + return nil, err + } + + restSlots := make([]rest.Slot, 0, len(slots)) + for _, slot := range slots { + restSlots = append(restSlots, rest.Slot(safeInt64(uint64(slot)))) + } + + return &rest.ListMetadataSlotsOKHeaders{ + CacheControl: rest.NewOptString(cacheControlNoStore), + Response: rest.ListMetadataSlotsOK{ + Data: rest.ListMetadataSlotsOKData{ + Slots: restSlots, + Pagination: paginationToRest(pg), + }, + }, + }, nil +} + +// ListMetadataEpochs implements listMetadataEpochs: distinct epochs. +func (h *HTTP) ListMetadataEpochs(ctx context.Context, req *rest.MetadataQuery) (rest.ListMetadataEpochsRes, error) { + filter, page := metadataQueryFromRest(req) + + epochs, pg, err := h.svc.ListEpochs(ctx, filter, page) + if err != nil { + return nil, err + } + + restEpochs := make([]rest.Epoch, 0, len(epochs)) + for _, epoch := range epochs { + restEpochs = append(restEpochs, rest.Epoch(safeInt64(uint64(epoch)))) + } + + return &rest.ListMetadataEpochsOKHeaders{ + CacheControl: rest.NewOptString(cacheControlNoStore), + Response: rest.ListMetadataEpochsOK{ + Data: rest.ListMetadataEpochsOKData{ + Epochs: restEpochs, + Pagination: paginationToRest(pg), + }, + }, + }, nil +} + +// ListMetadataLabels implements listMetadataLabels: distinct labels. +func (h *HTTP) ListMetadataLabels(ctx context.Context, req *rest.MetadataQuery) (rest.ListMetadataLabelsRes, error) { + filter, page := metadataQueryFromRest(req) + + labels, pg, err := h.svc.ListLabels(ctx, filter, page) + if err != nil { + return nil, err + } + + if labels == nil { + labels = []string{} + } + + return &rest.ListMetadataLabelsOKHeaders{ + CacheControl: rest.NewOptString(cacheControlNoStore), + Response: rest.ListMetadataLabelsOK{ + Data: rest.ListMetadataLabelsOKData{ + Labels: labels, + Pagination: paginationToRest(pg), + }, + }, + }, nil +} + +// metadataQueryFromRest maps the spec's MetadataQuery onto the service +// filter and pagination types. +func metadataQueryFromRest(req *rest.MetadataQuery) (*service.FrameFilter, service.PaginationCursor) { + filter := &service.FrameFilter{} + if f, ok := req.Filter.Get(); ok { + filter = frameFilterFromRest(f) + } + + page := *service.DefaultPagination() + + if p, ok := req.Pagination.Get(); ok { + page.Offset = p.Offset.Or(page.Offset) + page.Limit = p.Limit.Or(page.Limit) + } + + return filter, page +} + +// frameFilterFromRest maps the spec's FrameFilter onto the service filter. +func frameFilterFromRest(f rest.FrameFilter) *service.FrameFilter { + filter := &service.FrameFilter{ + Node: optStringPtr(f.Node), + ConsensusClient: optStringPtr(f.ConsensusClient), + EventSource: optStringPtr(f.EventSource), + } + + if v, ok := f.Before.Get(); ok { + filter.Before = &v + } + + if v, ok := f.After.Get(); ok { + filter.After = &v + } + + if v, ok := f.Slot.Get(); ok && v >= 0 { + slot := uint64(v) + filter.Slot = &slot + } + + if v, ok := f.Epoch.Get(); ok && v >= 0 { + epoch := uint64(v) + filter.Epoch = &epoch + } + + if f.Labels != nil { + labels := f.Labels + filter.Labels = &labels + } + + return filter +} + +// optStringPtr converts an optional string to the pointer form used by the +// service filter. +func optStringPtr(o rest.OptString) *string { + if v, ok := o.Get(); ok { + return &v + } + + return nil +} + +// paginationToRest maps the service pagination response onto the spec's +// PaginationResponse schema. +func paginationToRest(pg *service.PaginationResponse) rest.PaginationResponse { + if pg == nil { + return rest.PaginationResponse{} + } + + return rest.PaginationResponse{Total: pg.Total} +} diff --git a/pkg/forky/api/http/metrics.go b/internal/api/metrics.go similarity index 54% rename from pkg/forky/api/http/metrics.go rename to internal/api/metrics.go index 410b4bc..f131066 100644 --- a/pkg/forky/api/http/metrics.go +++ b/internal/api/metrics.go @@ -1,17 +1,26 @@ -package http +package api import ( + "net/http" + "strconv" "time" "github.com/prometheus/client_golang/prometheus" + + "github.com/ethpandaops/forky/api/rest" ) +const encodingJSON = "application/json" + +// Metrics records request/response counts and durations per route. type Metrics struct { requests *prometheus.CounterVec responses *prometheus.CounterVec requestDuration *prometheus.HistogramVec } +// NewMetrics creates the API metrics collectors, registering them when +// enabled. func NewMetrics(enabled bool, namespace string) Metrics { m := Metrics{ requests: prometheus.NewCounterVec(prometheus.CounterOpts{ @@ -41,11 +50,44 @@ func NewMetrics(enabled bool, namespace string) Metrics { return m } +// ObserveRequest records an incoming request. func (m Metrics) ObserveRequest(method, path string) { m.requests.WithLabelValues(method, path).Inc() } +// ObserveResponse records a completed response. func (m Metrics) ObserveResponse(method, path, code, encoding string, duration time.Duration) { m.responses.WithLabelValues(method, path, code, encoding).Inc() m.requestDuration.WithLabelValues(method, path, encoding).Observe(duration.Seconds()) } + +// statusRecorder captures the response status code for metrics. +type statusRecorder struct { + http.ResponseWriter + status int +} + +func (w *statusRecorder) WriteHeader(status int) { + w.status = status + w.ResponseWriter.WriteHeader(status) +} + +// instrument wraps the generated server with per-route metrics, using the +// spec's path pattern as the label to keep cardinality bounded. +func (h *HTTP) instrument(srv *rest.Server) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + path := r.URL.Path + if route, ok := srv.FindRoute(r.Method, r.URL.Path); ok { + path = route.PathPattern() + } + + h.metrics.ObserveRequest(r.Method, path) + + start := time.Now() + rec := &statusRecorder{ResponseWriter: w, status: http.StatusOK} + + srv.ServeHTTP(rec, r) + + h.metrics.ObserveResponse(r.Method, path, strconv.Itoa(rec.status), encodingJSON, time.Since(start)) + }) +} diff --git a/pkg/forky/api/option.go b/internal/api/option.go similarity index 100% rename from pkg/forky/api/option.go rename to internal/api/option.go diff --git a/pkg/forky/db/config.go b/internal/db/config.go similarity index 100% rename from pkg/forky/db/config.go rename to internal/db/config.go diff --git a/pkg/forky/db/event_source.go b/internal/db/event_source.go similarity index 95% rename from pkg/forky/db/event_source.go rename to internal/db/event_source.go index 1a5a675..6056a32 100644 --- a/pkg/forky/db/event_source.go +++ b/internal/db/event_source.go @@ -1,6 +1,6 @@ package db -import "github.com/ethpandaops/forky/pkg/forky/types" +import "github.com/ethpandaops/forky/internal/types" type EventSource int diff --git a/pkg/forky/db/filters.go b/internal/db/filters.go similarity index 100% rename from pkg/forky/db/filters.go rename to internal/db/filters.go diff --git a/pkg/forky/db/frame_metadata.go b/internal/db/frame_metadata.go similarity index 97% rename from pkg/forky/db/frame_metadata.go rename to internal/db/frame_metadata.go index 17425c3..1a89189 100644 --- a/pkg/forky/db/frame_metadata.go +++ b/internal/db/frame_metadata.go @@ -4,8 +4,9 @@ import ( "time" "github.com/attestantio/go-eth2-client/spec/phase0" - "github.com/ethpandaops/forky/pkg/forky/types" "gorm.io/gorm" + + "github.com/ethpandaops/forky/internal/types" ) type FrameMetadata struct { diff --git a/pkg/forky/db/frame_metadata_label.go b/internal/db/frame_metadata_label.go similarity index 100% rename from pkg/forky/db/frame_metadata_label.go rename to internal/db/frame_metadata_label.go diff --git a/pkg/forky/db/indexer.go b/internal/db/indexer.go similarity index 97% rename from pkg/forky/db/indexer.go rename to internal/db/indexer.go index b4d186f..b451bb1 100644 --- a/pkg/forky/db/indexer.go +++ b/internal/db/indexer.go @@ -7,13 +7,13 @@ import ( "time" "github.com/attestantio/go-eth2-client/spec/phase0" - "github.com/ethpandaops/forky/pkg/forky/types" "github.com/glebarez/sqlite" - perrors "github.com/pkg/errors" "github.com/sirupsen/logrus" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/plugin/prometheus" + + "github.com/ethpandaops/forky/internal/types" ) type Indexer struct { @@ -59,17 +59,17 @@ func NewIndexer(namespace string, log logrus.FieldLogger, config IndexerConfig, StartServer: false, }), ); err != nil { - return nil, perrors.Wrap(err, "failed to register prometheus plugin") + return nil, fmt.Errorf("failed to register prometheus plugin: %w", err) } err = db.AutoMigrate(&FrameMetadata{}) if err != nil { - return nil, perrors.Wrap(err, "failed to auto migrate frame_metadata") + return nil, fmt.Errorf("failed to auto migrate frame_metadata: %w", err) } err = db.AutoMigrate(&FrameMetadataLabels{}) if err != nil { - return nil, perrors.Wrap(err, "failed to auto migrate frame_metadata_label") + return nil, fmt.Errorf("failed to auto migrate frame_metadata_label: %w", err) } return &Indexer{ @@ -556,7 +556,7 @@ func (i *Indexer) DeleteFrameMetadataLabelsByName(ctx context.Context, name stri query := i.db.WithContext(ctx) - result := query.Unscoped().Where("name LIKE ?", fmt.Sprintf("%s=%%", name)).Delete(&FrameMetadataLabels{}) + result := query.Unscoped().Where("name LIKE ?", name+"=%").Delete(&FrameMetadataLabels{}) if result.Error != nil { i.metrics.ObserveOperationError(operation) @@ -607,6 +607,7 @@ func (i *Indexer) getFrameIDsWithLabels(ctx context.Context, labels []string, pa } query := i.db. + WithContext(ctx). Model(&FrameMetadataLabel{}). Where("name IN (?)", labels). Limit(page.Limit). diff --git a/pkg/forky/db/indexer_test.go b/internal/db/indexer_test.go similarity index 97% rename from pkg/forky/db/indexer_test.go rename to internal/db/indexer_test.go index e464e86..c542a81 100644 --- a/pkg/forky/db/indexer_test.go +++ b/internal/db/indexer_test.go @@ -9,11 +9,12 @@ import ( "time" "github.com/attestantio/go-eth2-client/spec/phase0" - "github.com/ethpandaops/forky/pkg/forky/types" "github.com/google/uuid" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "gopkg.in/DATA-DOG/go-sqlmock.v1" + + "github.com/ethpandaops/forky/internal/types" ) //nolint:gosec // not a security issue @@ -21,14 +22,12 @@ func testRandIntn(n int) int { return rand.Intn(n) } -var ( - testDBCounter = 0 -) +var testDBCounter = 0 func newMockIndexer() (*Indexer, sqlmock.Sqlmock, error) { db, mock, err := sqlmock.New() if err != nil { - return nil, nil, fmt.Errorf("Failed to open mock sql db, got error: %v", err) + return nil, nil, fmt.Errorf("Failed to open mock sql db, got error: %w", err) } if db == nil { @@ -46,7 +45,7 @@ func newMockIndexer() (*Indexer, sqlmock.Sqlmock, error) { DriverName: "sqlite", }, DefaultOptions().SetMetricsEnabled(false)) if err != nil { - return nil, nil, fmt.Errorf("Failed to create indexer, got error: %v", err) + return nil, nil, fmt.Errorf("Failed to create indexer, got error: %w", err) } return indexer, mock, nil @@ -409,7 +408,7 @@ func TestIndexer_ListFrames(t *testing.T) { t.Fatal(err) } - assert.Len(t, frames, 0) + assert.Empty(t, frames) frames, err = indexer.ListFrameMetadata(context.Background(), &FrameFilter{ Labels: &[]string{"z", "d", "e", "f"}, @@ -437,7 +436,7 @@ func TestIndexer_ListFrames(t *testing.T) { } // Add 1000 random frames - for i := 0; i < 1000; i++ { + for i := range 1000 { id := uuid.New().String() node := fmt.Sprintf("node-%d", i) //nolint:gosec // ignore integer overflow conversion uint64 -> int64 @@ -469,7 +468,7 @@ func TestIndexer_ListFrames(t *testing.T) { } // List frames with random filters - for i := 0; i < 500; i++ { + for range 500 { var filter FrameFilter if testRandIntn(2) == 1 { @@ -585,7 +584,7 @@ func TestIndexer_ListFrames(t *testing.T) { } // Add a few random frames - for i := 0; i < 10; i++ { + for i := range 10 { frame := &types.FrameMetadata{ ID: uuid.New().String(), Node: fmt.Sprintf("node%d", i), @@ -632,7 +631,7 @@ func TestIndexer_ListNodesWithFrames(t *testing.T) { } // Add a few random frames - for i := 0; i < 5; i++ { + for i := range 5 { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ @@ -676,7 +675,7 @@ func TestIndexer_ListNodesWithFrames(t *testing.T) { } // Add a few random frames - for i := 0; i < 5; i++ { + for i := range 5 { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ @@ -715,7 +714,7 @@ func TestIndexer_ListNodesWithFrames(t *testing.T) { } for _, frame := range frames { - assert.Equal(t, frame.Labels[0].Name, "label5") + assert.Equal(t, "label5", frame.Labels[0].Name) } } }) @@ -731,7 +730,7 @@ func TestIndexer_DeleteFrameMetadata(t *testing.T) { ids := []string{} // Add a few random frames - for i := 0; i < 5; i++ { + for i := range 5 { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ @@ -767,7 +766,7 @@ func TestIndexer_DeleteFrameMetadata(t *testing.T) { } // Check that no frame metadata is returned - assert.Len(t, nodes, 0) + assert.Empty(t, nodes) }) t.Run("with no labels", func(t *testing.T) { @@ -779,7 +778,7 @@ func TestIndexer_DeleteFrameMetadata(t *testing.T) { ids := []string{} // Add a few random frames - for i := 0; i < 5; i++ { + for i := range 5 { node := fmt.Sprintf("node%d", i) frame := &types.FrameMetadata{ @@ -815,6 +814,6 @@ func TestIndexer_DeleteFrameMetadata(t *testing.T) { } // Check that no frame metadata is returned - assert.Len(t, nodes, 0) + assert.Empty(t, nodes) }) } diff --git a/pkg/forky/db/metrics.go b/internal/db/metrics.go similarity index 100% rename from pkg/forky/db/metrics.go rename to internal/db/metrics.go diff --git a/pkg/forky/db/operation.go b/internal/db/operation.go similarity index 100% rename from pkg/forky/db/operation.go rename to internal/db/operation.go diff --git a/pkg/forky/db/option.go b/internal/db/option.go similarity index 100% rename from pkg/forky/db/option.go rename to internal/db/option.go diff --git a/pkg/forky/db/pagination.go b/internal/db/pagination.go similarity index 100% rename from pkg/forky/db/pagination.go rename to internal/db/pagination.go diff --git a/pkg/forky/ethereum/client.go b/internal/ethereum/client.go similarity index 100% rename from pkg/forky/ethereum/client.go rename to internal/ethereum/client.go diff --git a/pkg/forky/ethereum/config.go b/internal/ethereum/config.go similarity index 87% rename from pkg/forky/ethereum/config.go rename to internal/ethereum/config.go index 2b0979e..955446b 100644 --- a/pkg/forky/ethereum/config.go +++ b/internal/ethereum/config.go @@ -1,7 +1,8 @@ package ethereum import ( - "github.com/pkg/errors" + "errors" + "fmt" ) type Config struct { @@ -21,7 +22,7 @@ type SpecConfig struct { func (c *Config) Validate() error { if err := c.Network.Validate(); err != nil { - return errors.Wrap(err, "invalid network config") + return fmt.Errorf("invalid network config: %w", err) } return nil @@ -33,7 +34,7 @@ func (c *NetworkConfig) Validate() error { } if err := c.Spec.Validate(); err != nil { - return errors.Wrap(err, "invalid spec config") + return fmt.Errorf("invalid spec config: %w", err) } return nil diff --git a/pkg/forky/ethereum/ethereum.go b/internal/ethereum/ethereum.go similarity index 95% rename from pkg/forky/ethereum/ethereum.go rename to internal/ethereum/ethereum.go index 693f976..0a1268e 100644 --- a/pkg/forky/ethereum/ethereum.go +++ b/internal/ethereum/ethereum.go @@ -5,7 +5,7 @@ import ( "time" "github.com/ethpandaops/ethwallclock" - "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) @@ -24,7 +24,7 @@ func NewBeaconChain(log logrus.FieldLogger, config *Config) (*BeaconChain, error secondsPerSlot, err := time.ParseDuration(fmt.Sprintf("%vs", config.Network.Spec.SecondsPerSlot)) if err != nil { - return nil, errors.Wrap(err, "failed to parse seconds per slot") + return nil, fmt.Errorf("failed to parse seconds per slot: %w", err) } //nolint:gosec // ignore integer overflow conversion uint64 -> int64 diff --git a/pkg/forky/ethereum/ethereum_test.go b/internal/ethereum/ethereum_test.go similarity index 95% rename from pkg/forky/ethereum/ethereum_test.go rename to internal/ethereum/ethereum_test.go index 7cb6b52..135c1cf 100644 --- a/pkg/forky/ethereum/ethereum_test.go +++ b/internal/ethereum/ethereum_test.go @@ -6,6 +6,7 @@ import ( "github.com/ethpandaops/ethwallclock" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewBeaconChain_ValidConfig_ReturnsBeaconChain(t *testing.T) { @@ -21,7 +22,7 @@ func TestNewBeaconChain_ValidConfig_ReturnsBeaconChain(t *testing.T) { } log := logrus.New() beaconchain, err := NewBeaconChain(log, config) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, beaconchain) } @@ -29,7 +30,7 @@ func TestNewBeaconChain_InvalidConfig_ReturnsError(t *testing.T) { config := &Config{} log := logrus.New() beaconchain, err := NewBeaconChain(log, config) - assert.Error(t, err) + require.Error(t, err) assert.Nil(t, beaconchain) } diff --git a/pkg/forky/human/duration.go b/internal/human/duration.go similarity index 87% rename from pkg/forky/human/duration.go rename to internal/human/duration.go index d1748c1..50d7cda 100644 --- a/pkg/forky/human/duration.go +++ b/internal/human/duration.go @@ -29,9 +29,9 @@ func (d *Duration) Unmarshal(s string) (err error) { } func (d Duration) MarshalText() ([]byte, error) { - return []byte(d.Duration.String()), nil + return []byte(d.String()), nil } func (d Duration) MarshalJSON() ([]byte, error) { - return json.Marshal(d.Duration.String()) + return json.Marshal(d.String()) } diff --git a/pkg/forky/service/backfill.go b/internal/service/backfill.go similarity index 93% rename from pkg/forky/service/backfill.go rename to internal/service/backfill.go index cec2a18..c0cda0e 100644 --- a/pkg/forky/service/backfill.go +++ b/internal/service/backfill.go @@ -6,8 +6,7 @@ import ( "strings" "time" - "github.com/ethpandaops/forky/pkg/forky/db" - "github.com/pkg/errors" + "github.com/ethpandaops/forky/internal/db" ) func (f *ForkChoice) BackfillConsensusClient(ctx context.Context) error { @@ -31,7 +30,6 @@ func (f *ForkChoice) BackfillConsensusClient(ctx context.Context) error { // Attempt to extract frame from labels. found := false - //nolint:gocritic // Outside of our control. for _, label := range frame.Labels { if strings.Contains(label.Name, "consensus_client_implementation") { frame.ConsensusClient = strings.Split(label.Name, "=")[1] @@ -82,7 +80,7 @@ func (f *ForkChoice) BackfillEventSource(ctx context.Context) error { for _, frame := range frames { // Attempt to extract frame from labels. - //nolint:gocritic // Outside of our control. + for _, label := range frame.Labels { // Default to beacon_node. frame.EventSource = db.BeaconNodeEventSource @@ -157,7 +155,7 @@ func (f *ForkChoice) DeleteUselessLabels(ctx context.Context) error { } { rowsAffected, err := f.indexer.DeleteFrameMetadataLabelsByName(ctx, unwanted) if err != nil { - return errors.Wrap(err, fmt.Sprintf("failed to delete labels by name %v", unwanted)) + return fmt.Errorf("failed to delete labels by name %v: %w", unwanted, err) } if rowsAffected > 0 { diff --git a/pkg/forky/service/config.go b/internal/service/config.go similarity index 54% rename from pkg/forky/service/config.go rename to internal/service/config.go index 53908d1..c8f103e 100644 --- a/pkg/forky/service/config.go +++ b/internal/service/config.go @@ -1,11 +1,11 @@ package service import ( - "github.com/ethpandaops/forky/pkg/forky/db" - "github.com/ethpandaops/forky/pkg/forky/ethereum" - "github.com/ethpandaops/forky/pkg/forky/human" - "github.com/ethpandaops/forky/pkg/forky/source" - "github.com/ethpandaops/forky/pkg/forky/store" + "github.com/ethpandaops/forky/internal/db" + "github.com/ethpandaops/forky/internal/ethereum" + "github.com/ethpandaops/forky/internal/human" + "github.com/ethpandaops/forky/internal/source" + "github.com/ethpandaops/forky/internal/store" ) type Config struct { diff --git a/pkg/forky/service/errors.go b/internal/service/errors.go similarity index 100% rename from pkg/forky/service/errors.go rename to internal/service/errors.go diff --git a/pkg/forky/service/forkchoice.go b/internal/service/forkchoice.go similarity index 96% rename from pkg/forky/service/forkchoice.go rename to internal/service/forkchoice.go index 8fc4c01..09237dd 100644 --- a/pkg/forky/service/forkchoice.go +++ b/internal/service/forkchoice.go @@ -4,7 +4,7 @@ import ( "errors" "time" - "github.com/ethpandaops/forky/pkg/forky/db" + "github.com/ethpandaops/forky/internal/db" ) type SourceMetadata struct { diff --git a/pkg/forky/service/metrics.go b/internal/service/metrics.go similarity index 95% rename from pkg/forky/service/metrics.go rename to internal/service/metrics.go index bb2c749..0ec86e9 100644 --- a/pkg/forky/service/metrics.go +++ b/internal/service/metrics.go @@ -3,8 +3,9 @@ package service import ( "runtime" - "github.com/ethpandaops/forky/pkg/version" "github.com/prometheus/client_golang/prometheus" + + "github.com/ethpandaops/forky/internal/version" ) type Metrics struct { @@ -59,7 +60,7 @@ func NewMetrics(namespace string, config *Config, enabled bool) *Metrics { prometheus.MustRegister(m.versionInfo) } - m.retentionPeriod.Set(config.RetentionPeriod.Duration.Seconds()) + m.retentionPeriod.Set(config.RetentionPeriod.Seconds()) m.info.WithLabelValues(version.FullVWithGOOS()).Set(1) m.versionInfo.WithLabelValues( diff --git a/pkg/forky/service/operations.go b/internal/service/operations.go similarity index 100% rename from pkg/forky/service/operations.go rename to internal/service/operations.go diff --git a/pkg/forky/service/option.go b/internal/service/option.go similarity index 100% rename from pkg/forky/service/option.go rename to internal/service/option.go diff --git a/pkg/forky/service/pagination.go b/internal/service/pagination.go similarity index 90% rename from pkg/forky/service/pagination.go rename to internal/service/pagination.go index 7ab2819..8336b2a 100644 --- a/pkg/forky/service/pagination.go +++ b/internal/service/pagination.go @@ -1,6 +1,6 @@ package service -import "github.com/ethpandaops/forky/pkg/forky/db" +import "github.com/ethpandaops/forky/internal/db" type PaginationCursor struct { // The cursor to start from. diff --git a/pkg/forky/service/purger.go b/internal/service/purger.go similarity index 95% rename from pkg/forky/service/purger.go rename to internal/service/purger.go index b3f2a89..d19cdb0 100644 --- a/pkg/forky/service/purger.go +++ b/internal/service/purger.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/ethpandaops/forky/pkg/forky/db" + "github.com/ethpandaops/forky/internal/db" ) func (f *ForkChoice) DeleteOldFrames(ctx context.Context) error { diff --git a/pkg/forky/service/service.go b/internal/service/service.go similarity index 95% rename from pkg/forky/service/service.go rename to internal/service/service.go index 8c8fc36..3d9b3b4 100644 --- a/pkg/forky/service/service.go +++ b/internal/service/service.go @@ -4,16 +4,18 @@ import ( "context" "errors" "fmt" + "strconv" "time" "github.com/attestantio/go-eth2-client/spec/phase0" - "github.com/ethpandaops/forky/pkg/forky/db" - "github.com/ethpandaops/forky/pkg/forky/ethereum" - "github.com/ethpandaops/forky/pkg/forky/source" - "github.com/ethpandaops/forky/pkg/forky/store" - "github.com/ethpandaops/forky/pkg/forky/types" - "github.com/ethpandaops/forky/pkg/version" "github.com/sirupsen/logrus" + + "github.com/ethpandaops/forky/internal/db" + "github.com/ethpandaops/forky/internal/ethereum" + "github.com/ethpandaops/forky/internal/source" + "github.com/ethpandaops/forky/internal/store" + "github.com/ethpandaops/forky/internal/types" + "github.com/ethpandaops/forky/internal/version" ) type ForkChoice struct { @@ -39,7 +41,6 @@ func NewForkChoice(namespace string, log logrus.FieldLogger, config *Config, opt for _, s := range config.Sources { conf := s.Config sou, err := source.NewSource(namespace, log, s.Name, s.Type, conf, sourceOpts) - if err != nil { log.Fatalf("failed to create source %s: %s", s.Name, err) } @@ -52,7 +53,7 @@ func NewForkChoice(namespace string, log logrus.FieldLogger, config *Config, opt st, err := store.NewStore(namespace, log, config.Store.Type, config.Store.Config, storeOpts) if err != nil { - return nil, fmt.Errorf("failed to create store: %s", err) + return nil, fmt.Errorf("failed to create store: %w", err) } // Create our indexer. @@ -199,7 +200,7 @@ func (f *ForkChoice) AddNewFrame(ctx context.Context, sourceName string, frame * "source": sourceName, "id": frame.Metadata.ID, "slot": fmt.Sprintf("%v", frame.Metadata.WallClockSlot), - "fetchedAt": fmt.Sprintf("%v", frame.Metadata.FetchedAt.Unix()), + "fetchedAt": strconv.FormatInt(frame.Metadata.FetchedAt.Unix(), 10), "node": frame.Metadata.Node, }) @@ -413,7 +414,7 @@ func (f *ForkChoice) GetFrame(ctx context.Context, id string) (*types.Frame, err f.log.WithError(err).WithField("id", id).Error("failed to get frame") - if err == store.ErrFrameNotFound { + if errors.Is(err, store.ErrFrameNotFound) { return nil, ErrFrameNotFound } @@ -434,7 +435,7 @@ func (f *ForkChoice) DeleteFrame(ctx context.Context, id string) error { return ErrInvalidID } - if err := f.store.DeleteFrame(ctx, id); err != nil && err != store.ErrFrameNotFound { + if err := f.store.DeleteFrame(ctx, id); err != nil && !errors.Is(err, store.ErrFrameNotFound) { f.metrics.ObserveOperationError(operation) f.log.WithError(err).WithField("id", id).Error("failed to delete frame") diff --git a/pkg/forky/source/beacon_node.go b/internal/source/beacon_node.go similarity index 91% rename from pkg/forky/source/beacon_node.go rename to internal/source/beacon_node.go index eabbc6b..91b34f4 100644 --- a/pkg/forky/source/beacon_node.go +++ b/internal/source/beacon_node.go @@ -3,6 +3,7 @@ package source import ( "context" "errors" + "fmt" "time" eth2client "github.com/attestantio/go-eth2-client" @@ -12,14 +13,14 @@ import ( "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/cenkalti/backoff/v4" "github.com/ethpandaops/ethwallclock" - "github.com/ethpandaops/forky/pkg/forky/ethereum" - "github.com/ethpandaops/forky/pkg/forky/store" - "github.com/ethpandaops/forky/pkg/forky/types" "github.com/go-co-op/gocron" "github.com/google/uuid" - perrors "github.com/pkg/errors" "github.com/rs/zerolog" "github.com/sirupsen/logrus" + + "github.com/ethpandaops/forky/internal/ethereum" + "github.com/ethpandaops/forky/internal/store" + "github.com/ethpandaops/forky/internal/types" ) var BeaconNodeType = "beacon_node" @@ -67,7 +68,7 @@ func (b *BeaconNodeConfig) Validate() error { func NewBeaconNode(namespace string, log logrus.FieldLogger, config *BeaconNodeConfig, name string, metrics *BasicMetrics) (*BeaconNode, error) { if err := config.Validate(); err != nil { - return nil, perrors.Wrap(err, "invalid config") + return nil, fmt.Errorf("invalid config: %w", err) } scheduler := gocron.NewScheduler(time.Local) @@ -99,7 +100,7 @@ func (b *BeaconNode) Start(ctx context.Context) error { } }) if err != nil { - return perrors.Wrap(err, "failed to schedule polling") + return fmt.Errorf("failed to schedule polling: %w", err) } go func() { @@ -173,7 +174,7 @@ func (b *BeaconNode) bootstrap(ctx context.Context) error { http.WithTimeout(15*time.Second), ) if err != nil { - return perrors.Wrap(err, "failed to create client") + return fmt.Errorf("failed to create client: %w", err) } b.client = client @@ -186,7 +187,7 @@ func (b *BeaconNode) bootstrap(ctx context.Context) error { // Fetch the genesis time and network parameters. rsp, err := genesisProvider.Genesis(ctx, &api.GenesisOpts{}) if err != nil { - return perrors.Wrap(err, "failed to fetch genesis time") + return fmt.Errorf("failed to fetch genesis time: %w", err) } if rsp == nil || rsp.Data == nil { @@ -203,7 +204,7 @@ func (b *BeaconNode) bootstrap(ctx context.Context) error { specRsp, err := specProvider.Spec(ctx, &api.SpecOpts{}) if err != nil { - return perrors.Wrap(err, "failed to fetch spec") + return fmt.Errorf("failed to fetch spec: %w", err) } if specRsp == nil || specRsp.Data == nil { @@ -254,7 +255,7 @@ func (b *BeaconNode) fetchFrame(ctx context.Context) error { slot, epoch, err := b.wallclock.Now() if err != nil { - return perrors.Wrap(err, "failed to get current wallclock") + return fmt.Errorf("failed to get current wallclock: %w", err) } nodeVersionProvider, ok := b.client.(eth2client.NodeVersionProvider) @@ -264,7 +265,7 @@ func (b *BeaconNode) fetchFrame(ctx context.Context) error { rsp, err := nodeVersionProvider.NodeVersion(ctx, &api.NodeVersionOpts{}) if err != nil { - return perrors.Wrap(err, "failed to get node version") + return fmt.Errorf("failed to get node version: %w", err) } nodeVersion := rsp.Data @@ -274,7 +275,7 @@ func (b *BeaconNode) fetchFrame(ctx context.Context) error { if provider, isProvider := b.client.(eth2client.ForkChoiceProvider); isProvider { rsp, err := provider.ForkChoice(ctx, &api.ForkChoiceOpts{}) if err != nil { - return perrors.Wrap(err, "failed to get fork choice dump") + return fmt.Errorf("failed to get fork choice dump: %w", err) } dump := rsp.Data diff --git a/pkg/forky/source/config.go b/internal/source/config.go similarity index 78% rename from pkg/forky/source/config.go rename to internal/source/config.go index 6c8c30c..aa93bc1 100644 --- a/pkg/forky/source/config.go +++ b/internal/source/config.go @@ -1,7 +1,7 @@ package source import ( - "github.com/ethpandaops/forky/pkg/yaml" + "github.com/ethpandaops/forky/internal/yaml" ) type Config struct { diff --git a/pkg/forky/source/error.go b/internal/source/error.go similarity index 100% rename from pkg/forky/source/error.go rename to internal/source/error.go diff --git a/pkg/forky/source/metrics.go b/internal/source/metrics.go similarity index 100% rename from pkg/forky/source/metrics.go rename to internal/source/metrics.go diff --git a/pkg/forky/source/option.go b/internal/source/option.go similarity index 100% rename from pkg/forky/source/option.go rename to internal/source/option.go diff --git a/pkg/forky/source/source.go b/internal/source/source.go similarity index 89% rename from pkg/forky/source/source.go rename to internal/source/source.go index bdf07eb..b8a44af 100644 --- a/pkg/forky/source/source.go +++ b/internal/source/source.go @@ -4,9 +4,10 @@ import ( "context" "fmt" - "github.com/ethpandaops/forky/pkg/forky/types" - "github.com/ethpandaops/forky/pkg/yaml" "github.com/sirupsen/logrus" + + "github.com/ethpandaops/forky/internal/types" + "github.com/ethpandaops/forky/internal/yaml" ) type Source interface { @@ -23,8 +24,10 @@ type Source interface { OnFrame(func(ctx context.Context, frame *types.Frame)) } -var _ = Source(&BeaconNode{}) -var _ = Source(&XatuHTTP{}) +var ( + _ = Source(&BeaconNode{}) + _ = Source(&XatuHTTP{}) +) func NewSource(namespace string, log logrus.FieldLogger, name, sourceType string, config yaml.RawMessage, opts *Options) (Source, error) { namespace += "_source" diff --git a/pkg/forky/source/type.go b/internal/source/type.go similarity index 100% rename from pkg/forky/source/type.go rename to internal/source/type.go diff --git a/pkg/forky/source/xatu_http.go b/internal/source/xatu_http.go similarity index 93% rename from pkg/forky/source/xatu_http.go rename to internal/source/xatu_http.go index 4ee0393..e6a1bc2 100644 --- a/pkg/forky/source/xatu_http.go +++ b/internal/source/xatu_http.go @@ -6,16 +6,18 @@ import ( "fmt" "io" "net/http" + "slices" "strings" "time" eth2v1 "github.com/attestantio/go-eth2-client/api/v1" "github.com/attestantio/go-eth2-client/spec/phase0" - "github.com/ethpandaops/forky/pkg/forky/types" "github.com/ethpandaops/xatu/pkg/proto/xatu" "github.com/google/uuid" "github.com/sirupsen/logrus" "google.golang.org/protobuf/encoding/protojson" + + "github.com/ethpandaops/forky/internal/types" ) var XatuHTTPType = "xatu_http" @@ -175,9 +177,9 @@ func (x *XatuHTTP) handleNDJSONRequest(ctx context.Context, body []byte) error { events := []*xatu.DecoratedEvent{} - split := strings.Split(s, "\n") + split := strings.SplitSeq(s, "\n") - for _, line := range split { + for line := range split { if line == "" { continue } @@ -256,15 +258,7 @@ func (x *XatuHTTP) handleXatuEvent(ctx context.Context, event *xatu.DecoratedEve // Drop it if its from a network that we don't care about name := event.GetMeta().GetClient().GetEthereum().GetNetwork().GetName() - found := false - - for _, network := range x.opts.AllowedEthereumNetworks { - if network == name { - found = true - - break - } - } + found := slices.Contains(x.opts.AllowedEthereumNetworks, name) if !found { logCtx. @@ -284,16 +278,16 @@ func (x *XatuHTTP) handleXatuEvent(ctx context.Context, event *xatu.DecoratedEve return x.handleForkChoiceReorgEvent(ctx, event) case xatu.Event_BEACON_API_ETH_V1_DEBUG_FORK_CHOICE_REORG_V2: return x.handleForkChoiceReorgV2Event(ctx, event) + default: + return errors.New("unknown event type") // Should never happen (touch wood (tm (c))) } - - return errors.New("unknown event type") // Should never happen (touch wood (tm (c))) } func (x *XatuHTTP) handleForkChoiceEvent(ctx context.Context, event *xatu.DecoratedEvent) error { // Create a new frame based on the event fc := event.GetEthV1ForkChoiceV2() if fc == nil { - return fmt.Errorf("event is not a fork choice event") + return errors.New("event is not a fork choice event") } data, err := fc.AsGoEth2ClientV1ForkChoice() @@ -303,7 +297,7 @@ func (x *XatuHTTP) handleForkChoiceEvent(ctx context.Context, event *xatu.Decora additionalData := event.GetMeta().GetClient().GetEthV1DebugForkChoice() if additionalData == nil { - return fmt.Errorf("event is missing additional data") + return errors.New("event is missing additional data") } return x.createFrameFromSnapshotAndData(ctx, event, data, additionalData.GetSnapshot(), "") @@ -313,7 +307,7 @@ func (x *XatuHTTP) handleForkChoiceV2Event(ctx context.Context, event *xatu.Deco // Create a new frame based on the event fc := event.GetEthV1ForkChoiceV2() if fc == nil { - return fmt.Errorf("event is not a fork choice event") + return errors.New("event is not a fork choice event") } data, err := fc.AsGoEth2ClientV1ForkChoice() @@ -323,7 +317,7 @@ func (x *XatuHTTP) handleForkChoiceV2Event(ctx context.Context, event *xatu.Deco additionalData := event.GetMeta().GetClient().GetEthV1DebugForkChoiceV2() if additionalData == nil { - return fmt.Errorf("event is missing additional data") + return errors.New("event is missing additional data") } return x.createFrameFromSnapshotV2AndData(ctx, event, data, additionalData.GetSnapshot(), "") @@ -339,16 +333,16 @@ func (x *XatuHTTP) handleForkChoiceReorgEvent(ctx context.Context, event *xatu.D // Note: `before` can be nil if the reorg happened before the xatu sentry started fcr := event.GetEthV1ForkChoiceReorgV2() if fcr == nil { - return fmt.Errorf("event is not a fork choice reorg event") + return errors.New("event is not a fork choice reorg event") } additionalData := event.GetMeta().GetClient().GetEthV1DebugForkChoiceReorg() if additionalData == nil { - return fmt.Errorf("event is missing additional data") + return errors.New("event is missing additional data") } if fcr.After == nil && fcr.Before == nil { - return fmt.Errorf("event is missing both before and after data") + return errors.New("event is missing both before and after data") } if fcr.After != nil && additionalData.After != nil { @@ -388,16 +382,16 @@ func (x *XatuHTTP) handleForkChoiceReorgV2Event(ctx context.Context, event *xatu // Note: `before` can be nil if the reorg happened before the xatu sentry started fcr := event.GetEthV1ForkChoiceReorgV2() if fcr == nil { - return fmt.Errorf("event is not a fork choice reorg event") + return errors.New("event is not a fork choice reorg event") } additionalData := event.GetMeta().GetClient().GetEthV1DebugForkChoiceReorgV2() if additionalData == nil { - return fmt.Errorf("event is missing additional data") + return errors.New("event is missing additional data") } if fcr.After == nil && fcr.Before == nil { - return fmt.Errorf("event is missing both before and after data") + return errors.New("event is missing both before and after data") } if fcr.After != nil && additionalData.After != nil { diff --git a/pkg/forky/store/config.go b/internal/store/config.go similarity index 85% rename from pkg/forky/store/config.go rename to internal/store/config.go index 595fc50..a9ada42 100644 --- a/pkg/forky/store/config.go +++ b/internal/store/config.go @@ -3,7 +3,7 @@ package store import ( "fmt" - "github.com/ethpandaops/forky/pkg/yaml" + "github.com/ethpandaops/forky/internal/yaml" ) type Config struct { diff --git a/pkg/forky/store/errors.go b/internal/store/errors.go similarity index 100% rename from pkg/forky/store/errors.go rename to internal/store/errors.go diff --git a/pkg/forky/store/filesystem.go b/internal/store/filesystem.go similarity index 91% rename from pkg/forky/store/filesystem.go rename to internal/store/filesystem.go index 71831ce..ff463c5 100644 --- a/pkg/forky/store/filesystem.go +++ b/internal/store/filesystem.go @@ -7,7 +7,7 @@ import ( "os" "path/filepath" - "github.com/ethpandaops/forky/pkg/forky/types" + "github.com/ethpandaops/forky/internal/types" ) type FileSystem struct { @@ -23,7 +23,7 @@ type FileSystemConfig struct { // NewFileSystem creates a new FileSystem instance with the specified base directory. func NewFileSystem(namespace string, config FileSystemConfig, opts *Options) (*FileSystem, error) { if config.BaseDir == "" { - return nil, fmt.Errorf("base directory is required") + return nil, errors.New("base directory is required") } err := os.MkdirAll(config.BaseDir, 0o755) @@ -41,7 +41,7 @@ func NewFileSystem(namespace string, config FileSystemConfig, opts *Options) (*F } func (fs *FileSystem) framePath(id string) string { - return filepath.Join(fs.config.BaseDir, fmt.Sprintf("%s.json.gz", id)) + return filepath.Join(fs.config.BaseDir, id+".json.gz") } func (fs *FileSystem) SaveFrame(ctx context.Context, frame *types.Frame) error { diff --git a/pkg/forky/store/memory.go b/internal/store/memory.go similarity index 96% rename from pkg/forky/store/memory.go rename to internal/store/memory.go index 7115c82..22da0b0 100644 --- a/pkg/forky/store/memory.go +++ b/internal/store/memory.go @@ -4,8 +4,9 @@ import ( "context" "sync" - "github.com/ethpandaops/forky/pkg/forky/types" "github.com/sirupsen/logrus" + + "github.com/ethpandaops/forky/internal/types" ) type MemoryStore struct { diff --git a/pkg/forky/store/metrics.go b/internal/store/metrics.go similarity index 100% rename from pkg/forky/store/metrics.go rename to internal/store/metrics.go diff --git a/pkg/forky/store/option.go b/internal/store/option.go similarity index 100% rename from pkg/forky/store/option.go rename to internal/store/option.go diff --git a/pkg/forky/store/s3.go b/internal/store/s3.go similarity index 88% rename from pkg/forky/store/s3.go rename to internal/store/s3.go index bf53e1f..afb5bb5 100644 --- a/pkg/forky/store/s3.go +++ b/internal/store/s3.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "errors" - "fmt" "path/filepath" "time" @@ -13,9 +12,10 @@ import ( "github.com/aws/aws-sdk-go-v2/service/s3" s3types "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/smithy-go" - "github.com/ethpandaops/forky/pkg/forky/types" "github.com/jellydator/ttlcache/v3" "github.com/sirupsen/logrus" + + "github.com/ethpandaops/forky/internal/types" ) type S3Store struct { @@ -43,23 +43,16 @@ type S3StoreConfig struct { // NewS3Store creates a new S3Store instance with the specified AWS configuration, bucket name, and key prefix. func NewS3Store(namespace string, log logrus.FieldLogger, config *S3StoreConfig, opts *Options) (*S3Store, error) { - resolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...any) (aws.Endpoint, error) { - return aws.Endpoint{ - PartitionID: "aws", - SigningRegion: config.Region, - URL: config.Endpoint, - HostnameImmutable: true, - }, nil - }) - cfg := aws.Config{ - Region: config.Region, - EndpointResolverWithOptions: resolver, - Credentials: credentials.NewStaticCredentialsProvider(config.AccessKey, config.AccessSecret, ""), + Region: config.Region, + Credentials: credentials.NewStaticCredentialsProvider(config.AccessKey, config.AccessSecret, ""), } s3Client := s3.NewFromConfig(cfg, func(o *s3.Options) { o.UsePathStyle = config.UsePathStyle + if config.Endpoint != "" { + o.BaseEndpoint = aws.String(config.Endpoint) + } }) metrics := NewBasicMetrics(namespace, string(S3StoreType), opts.MetricsEnabled) @@ -199,5 +192,5 @@ func (s *S3Store) getFramesPath() string { } func (s *S3Store) getFilename(id string) string { - return fmt.Sprintf("%s.json.gz", id) + return id + ".json.gz" } diff --git a/pkg/forky/store/store.go b/internal/store/store.go similarity index 92% rename from pkg/forky/store/store.go rename to internal/store/store.go index 3bc28e1..bb468e0 100644 --- a/pkg/forky/store/store.go +++ b/internal/store/store.go @@ -4,9 +4,10 @@ import ( "context" "fmt" - "github.com/ethpandaops/forky/pkg/forky/types" - "github.com/ethpandaops/forky/pkg/yaml" "github.com/sirupsen/logrus" + + "github.com/ethpandaops/forky/internal/types" + "github.com/ethpandaops/forky/internal/yaml" ) // Store is an interface for different persistence implementations. diff --git a/pkg/forky/store/type.go b/internal/store/type.go similarity index 100% rename from pkg/forky/store/type.go rename to internal/store/type.go diff --git a/pkg/forky/types/event_source.go b/internal/types/event_source.go similarity index 100% rename from pkg/forky/types/event_source.go rename to internal/types/event_source.go diff --git a/pkg/forky/types/frame.go b/internal/types/frame.go similarity index 99% rename from pkg/forky/types/frame.go rename to internal/types/frame.go index ef4ee60..4bf4fdf 100644 --- a/pkg/forky/types/frame.go +++ b/internal/types/frame.go @@ -159,7 +159,7 @@ func GenerateFakeForkChoice() *v1.ForkChoice { numNodes := rand.Intn(10) + 1 // generate 1 to 10 fork choice nodes nodes := make([]*v1.ForkChoiceNode, numNodes) - for i := 0; i < numNodes; i++ { + for i := range numNodes { nodes[i] = &v1.ForkChoiceNode{ //nolint:gosec // This is a test function. Slot: phase0.Slot(rand.Uint64()), diff --git a/pkg/version/version.go b/internal/version/version.go similarity index 87% rename from pkg/version/version.go rename to internal/version/version.go index f6a3865..78bcb49 100644 --- a/pkg/version/version.go +++ b/internal/version/version.go @@ -11,7 +11,7 @@ var ( ) func Full() string { - return fmt.Sprintf("Forky/%s", Short()) + return "Forky/" + Short() } func Short() string { diff --git a/internal/yaml/raw_config.go b/internal/yaml/raw_config.go new file mode 100644 index 0000000..beb9af4 --- /dev/null +++ b/internal/yaml/raw_config.go @@ -0,0 +1,15 @@ +package yaml + +type RawMessage struct { + unmarshal func(any) error +} + +func (r *RawMessage) UnmarshalYAML(unmarshal func(any) error) error { + r.unmarshal = unmarshal + + return nil +} + +func (r *RawMessage) Unmarshal(v any) error { + return r.unmarshal(v) +} diff --git a/main.go b/main.go deleted file mode 100644 index c7d2d21..0000000 --- a/main.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -import ( - "log" - "os" - "os/signal" - "syscall" - - //nolint:gosec // running pprof on a separate port - _ "net/http/pprof" - - "github.com/ethpandaops/forky/cmd" - _ "github.com/lib/pq" -) - -func main() { - cancel := make(chan os.Signal, 1) - signal.Notify(cancel, syscall.SIGTERM, syscall.SIGINT) - - go cmd.Execute() - - sig := <-cancel - log.Printf("Caught signal: %v", sig) - - os.Exit(0) -} diff --git a/makefile b/makefile deleted file mode 100644 index 853cfd6..0000000 --- a/makefile +++ /dev/null @@ -1,3 +0,0 @@ -build-web: - @echo "Building web frontend..." - @npm --prefix ./web install && npm --prefix ./web run build diff --git a/pkg/forky/api/ethereum.go b/pkg/forky/api/ethereum.go deleted file mode 100644 index e4eda72..0000000 --- a/pkg/forky/api/ethereum.go +++ /dev/null @@ -1,62 +0,0 @@ -package api - -import ( - "context" - "encoding/json" - "net/http" - - fhttp "github.com/ethpandaops/forky/pkg/forky/api/http" - - "github.com/julienschmidt/httprouter" -) - -func (h *HTTP) handleV1GetEthereumSpec(ctx context.Context, _ *http.Request, _ httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - rsp := fhttp.V1GetEthereumSpecResponse{ - NetworkName: h.svc.GetEthereumNetworkName(ctx), - Spec: fhttp.EthereumSpec{ - SecondsPerSlot: h.svc.GetEthereumSpecSecondsPerSlot(ctx), - SlotsPerEpoch: h.svc.GetEthereumSpecSlotsPerEpoch(ctx), - GenesisTime: h.svc.GetEthereumSpecGenesisTime(ctx), - }, - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - response.SetCacheControl("public, max-age=60, s-maxage=60") - - return response, nil -} - -func (h *HTTP) handleV1GetEthereumNow(ctx context.Context, _ *http.Request, _ httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - slot, epoch, err := h.svc.GetEthereumNow(ctx) - if err != nil { - return fhttp.NewInternalServerErrorResponse(nil), err - } - - rsp := fhttp.V1GetEthereumNowResponse{ - Slot: uint64(slot), - Epoch: uint64(epoch), - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - response.SetCacheControl("public, max-age=1, s-maxage=1") - - return response, nil -} diff --git a/pkg/forky/api/frames.go b/pkg/forky/api/frames.go deleted file mode 100644 index e8c4cf0..0000000 --- a/pkg/forky/api/frames.go +++ /dev/null @@ -1,55 +0,0 @@ -package api - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - - "github.com/pkg/errors" - - fhttp "github.com/ethpandaops/forky/pkg/forky/api/http" - "github.com/ethpandaops/forky/pkg/forky/service" - - "github.com/julienschmidt/httprouter" -) - -type GetFramesBatchRequest struct { - IDs []string `json:"ids"` -} - -func (h *HTTP) handleV1GetFrame(ctx context.Context, _ *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - id := p.ByName("id") - if id == "" { - return fhttp.NewBadRequestResponse(nil), errors.New("id is required") - } - - frame, err := h.svc.GetFrame(ctx, id) - if err != nil { - if errors.Is(err, service.ErrFrameNotFound) { - return fhttp.NewNotFoundResponse(nil), err - } - - return fhttp.NewInternalServerErrorResponse(nil), err - } - - rsp := fhttp.V1GetFrameResponse{ - Frame: frame, - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - if h.config.EdgeCacheConfig.Enabled { - response.SetCacheControl(fmt.Sprintf("public, max-age=%[1]v, s-maxage=%[1]v", h.config.EdgeCacheConfig.FrameTTL.Seconds())) - } - - return response, nil -} diff --git a/pkg/forky/api/http.go b/pkg/forky/api/http.go deleted file mode 100644 index dc52559..0000000 --- a/pkg/forky/api/http.go +++ /dev/null @@ -1,61 +0,0 @@ -package api - -import ( - // Added - "context" // Added - // Added - "net/http" - // Added - // Added - fhttp "github.com/ethpandaops/forky/pkg/forky/api/http" - "github.com/pkg/errors" - - "github.com/ethpandaops/forky/pkg/forky/service" - "github.com/julienschmidt/httprouter" - "github.com/sirupsen/logrus" -) - -type HTTP struct { - log logrus.FieldLogger - svc *service.ForkChoice - metrics *fhttp.Metrics - config *Config - opts *Options -} - -func NewHTTP(log logrus.FieldLogger, svc *service.ForkChoice, config *Config, opts *Options) (*HTTP, error) { - if err := config.Validate(); err != nil { - return nil, errors.Wrap(err, "invalid http config") - } - - metrics := fhttp.NewMetrics(opts.MetricsEnabled, "http") - - return &HTTP{ - opts: opts, - config: config, - svc: svc, - log: log.WithField("component", "http"), - metrics: &metrics, - }, nil -} - -func (h *HTTP) BindToRouter(_ context.Context, router *httprouter.Router) error { - router.GET("/api/v1/ethereum/now", h.wrappedHandler(h.handleV1GetEthereumNow)) - router.GET("/api/v1/ethereum/spec", h.wrappedHandler(h.handleV1GetEthereumSpec)) - - router.GET("/api/v1/frames/:id", h.wrappedHandler(h.handleV1GetFrame)) - - router.POST("/api/v1/metadata", h.wrappedHandler(h.handleV1MetadataList)) - router.POST("/api/v1/metadata/nodes", h.wrappedHandler(h.handleV1MetadataListNodes)) - router.POST("/api/v1/metadata/slots", h.wrappedHandler(h.handleV1MetadataListSlots)) - router.POST("/api/v1/metadata/epochs", h.wrappedHandler(h.handleV1MetadataListEpochs)) - router.POST("/api/v1/metadata/labels", h.wrappedHandler(h.handleV1MetadataListLabels)) - - return nil -} - -func (h *HTTP) wrappedHandler(handler func(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error)) httprouter.Handle { - return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { - fhttp.WrappedHandler(h.log, h.metrics, handler)(w, r, p) - } -} diff --git a/pkg/forky/api/http/content_type.go b/pkg/forky/api/http/content_type.go deleted file mode 100644 index cb9f485..0000000 --- a/pkg/forky/api/http/content_type.go +++ /dev/null @@ -1,81 +0,0 @@ -package http - -import ( - "fmt" - "net/http" -) - -type ContentType int - -const ( - ContentTypeUnknown ContentType = iota - ContentTypeJSON - ContentTypeYAML - ContentTypeSSZ -) - -func (c ContentType) String() string { - switch c { - case ContentTypeJSON: - return "application/json" - case ContentTypeYAML: - return "application/yaml" - case ContentTypeSSZ: - return "application/octet-stream" - case ContentTypeUnknown: - return "unknown" - } - - return "" -} - -func DeriveContentType(accept string) ContentType { - switch accept { - case "application/json": - return ContentTypeJSON - case "*/*": - return ContentTypeJSON - case "application/yaml": - return ContentTypeYAML - case "application/octet-stream": - return ContentTypeSSZ - // Default to JSON if they don't care what they get. - case "": - return ContentTypeJSON - } - - return ContentTypeUnknown -} - -func ValidateContentType(contentType ContentType, accepting []ContentType) error { - if !DoesAccept(accepting, contentType) { - return fmt.Errorf("unsupported content-type: %s", contentType.String()) - } - - return nil -} - -func DoesAccept(accepts []ContentType, input ContentType) bool { - for _, a := range accepts { - if a == input { - return true - } - } - - return false -} - -func NewContentTypeFromRequest(r *http.Request) ContentType { - accept := r.Header.Get("Accept") - if accept == "" { - return ContentTypeJSON - } - - content := DeriveContentType(accept) - - if content == ContentTypeUnknown { - return ContentTypeJSON - } - - return content -} diff --git a/pkg/forky/api/http/error.go b/pkg/forky/api/http/error.go deleted file mode 100644 index b1d79f8..0000000 --- a/pkg/forky/api/http/error.go +++ /dev/null @@ -1,6 +0,0 @@ -package http - -type ErrorContainer struct { - Code int `json:"code"` - Message string `json:"message"` -} diff --git a/pkg/forky/api/http/http.go b/pkg/forky/api/http/http.go deleted file mode 100644 index 5fc3984..0000000 --- a/pkg/forky/api/http/http.go +++ /dev/null @@ -1,91 +0,0 @@ -package http - -import ( - "time" - - "github.com/attestantio/go-eth2-client/spec/phase0" - "github.com/ethpandaops/forky/pkg/forky/service" - "github.com/ethpandaops/forky/pkg/forky/types" -) - -// V1 -// // Ethereum -type V1GetEthereumSpecRequest struct { -} - -type EthereumSpec struct { - SecondsPerSlot uint64 `json:"seconds_per_slot"` - SlotsPerEpoch uint64 `json:"slots_per_epoch"` - GenesisTime time.Time `json:"genesis_time"` -} -type V1GetEthereumSpecResponse struct { - NetworkName string `json:"network_name"` - Spec EthereumSpec `json:"spec"` -} - -type V1GetEthereumNowRequest struct { -} - -type V1GetEthereumNowResponse struct { - Slot uint64 `json:"slot"` - Epoch uint64 `json:"epoch"` -} - -// // Metadata -type V1MetadataListRequest struct { - Filter *service.FrameFilter `json:"filter"` - Pagination *service.PaginationCursor `json:"pagination"` -} - -type V1MetadataListResponse struct { - Frames []*types.FrameMetadata `json:"frames"` - Pagination *service.PaginationResponse `json:"pagination"` -} - -type V1MetadataListNodesRequest struct { - Filter *service.FrameFilter `json:"filter"` - Pagination *service.PaginationCursor `json:"pagination"` -} - -type V1MetadataListNodesResponse struct { - Nodes []string `json:"nodes"` - Pagination *service.PaginationResponse `json:"pagination"` -} - -type V1MetadataListSlotsRequest struct { - Filter *service.FrameFilter `json:"filter"` - Pagination *service.PaginationCursor `json:"pagination"` -} - -type V1MetadataListSlotsResponse struct { - Slots []phase0.Slot `json:"slots"` - Pagination *service.PaginationResponse `json:"pagination"` -} - -type V1MetadataListEpochsRequest struct { - Filter *service.FrameFilter `json:"filter"` - Pagination *service.PaginationCursor `json:"pagination"` -} - -type V1MetadataListEpochsResponse struct { - Epochs []phase0.Epoch `json:"epochs"` - Pagination *service.PaginationResponse `json:"pagination"` -} - -type V1MetadataListLabelsRequest struct { - Filter *service.FrameFilter `json:"filter"` - Pagination *service.PaginationCursor `json:"pagination"` -} - -type V1MetadataListLabelsResponse struct { - Labels []string `json:"labels"` - Pagination *service.PaginationResponse `json:"pagination"` -} - -// // Frames -type V1GetFrameRequest struct { -} - -type V1GetFrameResponse struct { - Frame *types.Frame `json:"frame"` -} diff --git a/pkg/forky/api/http/response.go b/pkg/forky/api/http/response.go deleted file mode 100644 index 60d6566..0000000 --- a/pkg/forky/api/http/response.go +++ /dev/null @@ -1,155 +0,0 @@ -package http - -import ( - "encoding/json" - "fmt" - "net/http" -) - -type ContentTypeResolver func() ([]byte, error) -type ContentTypeResolvers map[ContentType]ContentTypeResolver - -type Response struct { - resolvers ContentTypeResolvers - StatusCode int `json:"status_code"` - Headers map[string]string `json:"headers"` - ExtraData map[string]interface{} -} -type jsonResponse struct { - Data json.RawMessage `json:"data"` -} - -func (r Response) MarshalAs(contentType ContentType) ([]byte, error) { - if _, exists := r.resolvers[contentType]; !exists { - return nil, fmt.Errorf("unsupported content-type: %s", contentType.String()) - } - - if contentType != ContentTypeJSON { - return r.resolvers[contentType]() - } - - return r.buildWrappedJSONResponse() -} - -func (r Response) SetEtag(etag string) { - r.Headers["ETag"] = etag -} - -func (r Response) SetCacheControl(v string) { - r.Headers["Cache-Control"] = v -} - -func NewSuccessResponse(resolvers ContentTypeResolvers) *Response { - return &Response{ - resolvers: resolvers, - StatusCode: http.StatusOK, - Headers: make(map[string]string), - ExtraData: make(map[string]interface{}), - } -} - -func NewInternalServerErrorResponse(resolvers ContentTypeResolvers) *Response { - return &Response{ - resolvers: resolvers, - StatusCode: http.StatusInternalServerError, - Headers: make(map[string]string), - ExtraData: make(map[string]interface{}), - } -} - -func NewBadRequestResponse(resolvers ContentTypeResolvers) *Response { - return &Response{ - resolvers: resolvers, - StatusCode: http.StatusBadRequest, - Headers: make(map[string]string), - ExtraData: make(map[string]interface{}), - } -} - -func NewNotFoundResponse(resolvers ContentTypeResolvers) *Response { - return &Response{ - resolvers: resolvers, - StatusCode: http.StatusNotFound, - Headers: make(map[string]string), - ExtraData: make(map[string]interface{}), - } -} - -func NewUnsupportedMediaTypeResponse(resolvers ContentTypeResolvers) *Response { - return &Response{ - resolvers: resolvers, - StatusCode: http.StatusUnsupportedMediaType, - Headers: make(map[string]string), - ExtraData: make(map[string]interface{}), - } -} - -func (r *Response) AddExtraData(key string, value interface{}) { - r.ExtraData[key] = value -} - -func (r *Response) buildWrappedJSONResponse() ([]byte, error) { - data, err := r.resolvers[ContentTypeJSON]() - if err != nil { - return nil, err - } - - rsp := jsonResponse{ - Data: data, - } - - return json.Marshal(rsp) -} - -// WriteJSONResponse writes a JSON response to the given writer. -func WriteJSONResponse(w http.ResponseWriter, data []byte) error { - w.Header().Set("Content-Type", ContentTypeJSON.String()) - - if _, err := w.Write(data); err != nil { - return err - } - - return nil -} - -func WriteSSZResponse(w http.ResponseWriter, data []byte) error { - w.Header().Set("Content-Type", ContentTypeSSZ.String()) - - if _, err := w.Write(data); err != nil { - return err - } - - return nil -} - -func WriteContentAwareResponse(w http.ResponseWriter, data []byte, contentType ContentType) error { - switch contentType { - case ContentTypeJSON: - return WriteJSONResponse(w, data) - case ContentTypeSSZ: - return WriteSSZResponse(w, data) - default: - return WriteJSONResponse(w, data) - } -} - -func WriteErrorResponse(w http.ResponseWriter, msg string, statusCode int) error { - w.Header().Set("Content-Type", ContentTypeJSON.String()) - - w.WriteHeader(statusCode) - - bytes, err := json.Marshal( - ErrorContainer{ - Message: msg, - Code: statusCode, - }) - if err != nil { - return err - } - - if _, err := w.Write(bytes); err != nil { - return err - } - - return nil -} diff --git a/pkg/forky/api/http/routing.go b/pkg/forky/api/http/routing.go deleted file mode 100644 index e829c30..0000000 --- a/pkg/forky/api/http/routing.go +++ /dev/null @@ -1,90 +0,0 @@ -package http - -import ( - "context" - "fmt" - "net/http" - "strings" - "time" - - "github.com/julienschmidt/httprouter" - "github.com/sirupsen/logrus" -) - -func DeriveRegisteredPath(request *http.Request, ps httprouter.Params) string { - registeredPath := request.URL.Path - for _, param := range ps { - registeredPath = strings.Replace(registeredPath, param.Value, fmt.Sprintf(":%s", param.Key), 1) - } - - return registeredPath -} - -func WrappedHandler(log logrus.FieldLogger, metrics *Metrics, handler func(ctx context.Context, r *http.Request, p httprouter.Params, contentType ContentType) (*Response, error)) httprouter.Handle { - return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { - start := time.Now() - - contentType := NewContentTypeFromRequest(r) - ctx := r.Context() - registeredPath := DeriveRegisteredPath(r, p) - - log.WithFields(logrus.Fields{ - "method": r.Method, - "path": r.URL.Path, - "content_type": contentType, - "accept": r.Header.Get("Accept"), - }).Debug("Handling request") - - metrics.ObserveRequest(r.Method, registeredPath) - - response := &Response{} - - var err error - - defer func() { - metrics.ObserveResponse(r.Method, registeredPath, fmt.Sprintf("%v", response.StatusCode), contentType.String(), time.Since(start)) - }() - - response, err = handler(ctx, r, p, contentType) - if err != nil { - if writeErr := WriteErrorResponse(w, err.Error(), response.StatusCode); writeErr != nil { - log.WithError(writeErr).Error("Failed to write error response") - } - - return - } - - // Set headers before any potential content processing - for header, value := range response.Headers { - w.Header().Set(header, value) - } - - // Special case: Check for raw multipart content (stored as _raw_content in ExtraData) - if rawContent, ok := response.ExtraData["_raw_content"]; ok { - if rawBytes, ok := rawContent.([]byte); ok { - // Raw content handling - write directly to response - w.WriteHeader(response.StatusCode) - - if _, err := w.Write(rawBytes); err != nil { - log.WithError(err).Error("Failed to write raw content") - } - - return - } - } - - // Standard flow - marshal response based on content type - data, err := response.MarshalAs(contentType) - if err != nil { - if writeErr := WriteErrorResponse(w, err.Error(), http.StatusInternalServerError); writeErr != nil { - log.WithError(writeErr).Error("Failed to write error response") - } - - return - } - - if err := WriteContentAwareResponse(w, data, contentType); err != nil { - log.WithError(err).Error("Failed to write response") - } - } -} diff --git a/pkg/forky/api/metadata.go b/pkg/forky/api/metadata.go deleted file mode 100644 index 3ee713a..0000000 --- a/pkg/forky/api/metadata.go +++ /dev/null @@ -1,225 +0,0 @@ -package api - -import ( - "context" - "encoding/json" - "net/http" - - fhttp "github.com/ethpandaops/forky/pkg/forky/api/http" - "github.com/ethpandaops/forky/pkg/forky/service" - - "github.com/julienschmidt/httprouter" -) - -func (h *HTTP) handleV1MetadataList(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - // Grab our request body - var req fhttp.V1MetadataListRequest - - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return fhttp.NewBadRequestResponse(nil), err - } - - filter := req.Filter - if filter == nil { - filter = &service.FrameFilter{} - } - - page := req.Pagination - if page == nil { - page = service.DefaultPagination() - } - - frames, pg, err := h.svc.ListMetadata(ctx, filter, *page) - if err != nil { - return fhttp.NewInternalServerErrorResponse(nil), err - } - - rsp := fhttp.V1MetadataListResponse{ - Frames: frames, - Pagination: pg, - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - return response, nil -} - -func (h *HTTP) handleV1MetadataListNodes(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - // Grab our request body - var req fhttp.V1MetadataListNodesRequest - - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return fhttp.NewBadRequestResponse(nil), err - } - - page := req.Pagination - if page == nil { - page = service.DefaultPagination() - } - - filter := req.Filter - if filter == nil { - filter = &service.FrameFilter{} - } - - nodes, pg, err := h.svc.ListNodes(ctx, filter, *page) - if err != nil { - return fhttp.NewInternalServerErrorResponse(nil), err - } - - rsp := fhttp.V1MetadataListNodesResponse{ - Nodes: nodes, - Pagination: pg, - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - response.SetCacheControl("private, max-age=0, no-cache, no-store, must-revalidate") - - return response, nil -} - -func (h *HTTP) handleV1MetadataListSlots(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - // Grab our request body - var req fhttp.V1MetadataListSlotsRequest - - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return fhttp.NewBadRequestResponse(nil), err - } - - page := req.Pagination - if page == nil { - page = service.DefaultPagination() - } - - filter := req.Filter - if filter == nil { - filter = &service.FrameFilter{} - } - - slots, pg, err := h.svc.ListSlots(ctx, filter, *page) - if err != nil { - return fhttp.NewInternalServerErrorResponse(nil), err - } - - rsp := fhttp.V1MetadataListSlotsResponse{ - Slots: slots, - Pagination: pg, - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - response.SetCacheControl("private, max-age=0, no-cache, no-store, must-revalidate") - - return response, nil -} - -func (h *HTTP) handleV1MetadataListEpochs(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - // Grab our request body - var req fhttp.V1MetadataListEpochsRequest - - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return fhttp.NewBadRequestResponse(nil), err - } - - page := req.Pagination - if page == nil { - page = service.DefaultPagination() - } - - filter := req.Filter - if filter == nil { - filter = &service.FrameFilter{} - } - - epochs, pg, err := h.svc.ListEpochs(ctx, filter, *page) - if err != nil { - return fhttp.NewInternalServerErrorResponse(nil), err - } - - rsp := fhttp.V1MetadataListEpochsResponse{ - Epochs: epochs, - Pagination: pg, - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - response.SetCacheControl("private, max-age=0, no-cache, no-store, must-revalidate") - - return response, nil -} - -func (h *HTTP) handleV1MetadataListLabels(ctx context.Context, r *http.Request, p httprouter.Params, contentType fhttp.ContentType) (*fhttp.Response, error) { - if err := fhttp.ValidateContentType(contentType, []fhttp.ContentType{fhttp.ContentTypeJSON}); err != nil { - return fhttp.NewUnsupportedMediaTypeResponse(nil), err - } - - // Grab our request body - var req fhttp.V1MetadataListLabelsRequest - - if err := json.NewDecoder(r.Body).Decode(&req); err != nil { - return fhttp.NewBadRequestResponse(nil), err - } - - page := req.Pagination - if page == nil { - page = service.DefaultPagination() - } - - filter := req.Filter - if filter == nil { - filter = &service.FrameFilter{} - } - - labels, pg, err := h.svc.ListLabels(ctx, filter, *page) - if err != nil { - return fhttp.NewInternalServerErrorResponse(nil), err - } - - rsp := fhttp.V1MetadataListLabelsResponse{ - Labels: labels, - Pagination: pg, - } - - response := fhttp.NewSuccessResponse(fhttp.ContentTypeResolvers{ - fhttp.ContentTypeJSON: func() ([]byte, error) { - return json.Marshal(rsp) - }, - }) - - response.SetCacheControl("private, max-age=0, no-cache, no-store, must-revalidate") - - return response, nil -} diff --git a/pkg/yaml/raw_config.go b/pkg/yaml/raw_config.go deleted file mode 100644 index 4c38572..0000000 --- a/pkg/yaml/raw_config.go +++ /dev/null @@ -1,15 +0,0 @@ -package yaml - -type RawMessage struct { - unmarshal func(interface{}) error -} - -func (r *RawMessage) UnmarshalYAML(unmarshal func(interface{}) error) error { - r.unmarshal = unmarshal - - return nil -} - -func (r *RawMessage) Unmarshal(v interface{}) error { - return r.unmarshal(v) -} diff --git a/web/CLAUDE.md b/web/CLAUDE.md new file mode 100644 index 0000000..ab28d49 --- /dev/null +++ b/web/CLAUDE.md @@ -0,0 +1,89 @@ +# forky web + +The operator web UI for forky — a React single-page app that visualizes +Ethereum Beacon Chain fork-choice data. Built with Vite and embedded into the +forky binary (see the repo-root `CLAUDE.md`). + +## Commands + +pnpm is the package manager. + +```bash +pnpm install +pnpm dev # Vite dev server (proxies /api to a backend; see vite.config.ts) +pnpm dev:mock # dev server with MSW mocks (VITE_MOCK=true) +pnpm build # type-check + build production assets into dist/ (embedded by the Go binary) +pnpm preview # preview the production build +pnpm lint # eslint +pnpm typecheck # tsc --noEmit +pnpm format # prettier --write src +pnpm test # vitest +pnpm generate:api # regenerate the typed API client from ../api/openapi.yaml +``` + +## Stack + +- pnpm, Vite 8, React 19, TypeScript 6 +- @tanstack/react-router (file-based routing), @tanstack/react-query +- Tailwind CSS v4 (via @tailwindcss/vite) +- graphology (graph data structures + layout) for the fork-choice visualization +- MSW for API mocking in dev/tests; Vitest for tests +- @hey-api/openapi-ts + zod for the generated, typed API client + +## API client + +The OpenAPI spec at `../api/openapi.yaml` is the source of truth — the Go +server is generated from the same spec (ogen), so the wire format matches by +construction and SDK responses are validated against the zod schemas at +runtime. Run `pnpm generate:api` (or `make generate` at the repo root) to +regenerate the typed client, TanStack Query helpers and zod schemas into +`src/api/` (do not edit by hand — the whole directory is generated). Runtime +client config (base URL, fetch) lives in `src/utils/api-config.ts`. MSW mocks +in `src/mocks/` are typed against the generated response types, so tests fail +if the mocks drift from the spec. + +Domain hooks in `src/hooks/useQuery.ts` wrap the generated SDK and adapt +responses to the app's view types — components consume those hooks, not the +generated client directly. + +## Routing + +TanStack Router with a catch-all splat route. `src/routes/` holds the route +definitions (`__root.tsx`, `index.tsx`, `$.tsx`); `routeTree.gen.ts` is +generated by the Vite plugin. Forky's URL scheme composes paths (`/byo`, +`/node/`, `/snapshot/`) with an optional `/events` suffix, so +`routes/-RouteView.tsx` reads the pathname and renders the App accordingly. +`src/hooks/useAppNavigation.ts` (`usePathname`, `useAppNavigate`) and +`src/components/Link.tsx` are the app's routing primitives over the splat +route, taking plain path strings. + +## Structure + +``` +src/ + api/ # generated, typed API client (do not edit) + routes/ # TanStack Router route definitions + routeTree.gen.ts + components/ # React components (graph nodes, summaries, controls, ...) + contexts/ # React contexts (ethereum, focus, selection) + providers/ # Context providers + hooks/ # Custom hooks (useQuery, useGraph, useActive, useLocation, ...) + parts/ # Page sections (Graph, Header, Timeline, Stage, ...) + utils/ # Helpers (graph, maths, strings, api-config, ...) + types/ # Shared TypeScript view types + index.css # CSS entry: Tailwind + two-tier color tokens (see Theming) + mocks/ # MSW handlers + index.tsx # Entry point (QueryClientProvider + RouterProvider) +``` + +## Conventions + +- Path aliases (`@app/*`, `@api`, `@components/*`, `@hooks/*`, ...) — see + `tsconfig.app.json`. Prefer aliases over deep relative imports. +- Theming: colors follow a two-tier token architecture in `src/index.css` — + Tier 1 primitive values feed Tier 2 semantic tokens (`bg-surface`, + `text-foreground`, `text-canonical`, ...). Application code may only use + the semantic tokens and never writes `dark:` variants for colors (light and + dark values flip via CSS variables on `html.dark`). Enforced by the custom + ESLint rules in `eslint-rules/`. +- Run `pnpm lint` and `pnpm build` before committing. +``` diff --git a/web/build/.gitkeep b/web/build/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/web/embed.go b/web/embed.go new file mode 100644 index 0000000..f8462a9 --- /dev/null +++ b/web/embed.go @@ -0,0 +1,17 @@ +//go:build webui + +// Package web embeds the frontend build output from web/dist/. +package web + +import ( + "embed" + "io/fs" +) + +//go:embed all:dist/* +var embeddedFiles embed.FS + +// GetFS returns the embedded dist filesystem rooted at dist/. +func GetFS() (fs.FS, error) { + return fs.Sub(embeddedFiles, "dist") +} diff --git a/web/embed_stub.go b/web/embed_stub.go new file mode 100644 index 0000000..e2f7589 --- /dev/null +++ b/web/embed_stub.go @@ -0,0 +1,18 @@ +//go:build !webui + +// Package web provides the frontend filesystem. When built without the +// webui tag, GetFS returns an empty filesystem. +package web + +import "io/fs" + +type emptyFS struct{} + +func (emptyFS) Open(string) (fs.File, error) { + return nil, &fs.PathError{Op: "open", Path: "/", Err: fs.ErrNotExist} +} + +// GetFS returns an empty filesystem when the webui build tag is not set. +func GetFS() (fs.FS, error) { + return emptyFS{}, nil +} diff --git a/web/eslint-rules/index.cjs b/web/eslint-rules/index.cjs new file mode 100644 index 0000000..3ad1619 --- /dev/null +++ b/web/eslint-rules/index.cjs @@ -0,0 +1,14 @@ +/** + * @fileoverview Custom ESLint rules for the forky frontend + * + * These rules enforce the two-tier color architecture: all colors should be + * defined in src/index.css as primitive scales + semantic tokens, and + * application code should only reference the semantic tokens. + */ + +module.exports = { + rules: { + 'no-hardcoded-colors': require('./no-hardcoded-colors.cjs'), + 'no-primitive-color-scales': require('./no-primitive-color-scales.cjs'), + }, +}; diff --git a/web/eslint-rules/no-hardcoded-colors.cjs b/web/eslint-rules/no-hardcoded-colors.cjs new file mode 100644 index 0000000..1831f6a --- /dev/null +++ b/web/eslint-rules/no-hardcoded-colors.cjs @@ -0,0 +1,263 @@ +/** + * @fileoverview Ban hardcoded colors (hex, rgb, hsl) in Tailwind classes and inline styles + * + * This rule prevents developers from using hardcoded color values in Tailwind + * className strings and React inline styles. All colors should come from the + * semantic color tokens defined in src/index.css. + * + * Examples of incorrect code: + * className="bg-[#ff0000]" + * className="text-[rgb(255,0,0)]" + * className="border-[hsl(0,100%,50%)]" + * style={{ color: '#ff0000' }} + * style={{ backgroundColor: 'rgb(255,0,0)' }} + * + * Examples of correct code: + * className="bg-primary" + * className="text-danger" + * className="border-accent" + * style={{ color: 'var(--color-primary)' }} + */ + +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + meta: { + type: 'problem', + docs: { + description: 'Disallow hardcoded colors in Tailwind classes', + category: 'Best Practices', + recommended: true, + }, + messages: { + hardcodedHexColor: + 'Hardcoded hex color "{{value}}" detected. Use semantic color tokens from src/index.css instead (e.g., bg-primary, var(--color-primary)).', + hardcodedRgbColor: + 'Hardcoded RGB color "{{value}}" detected. Use semantic color tokens from src/index.css instead (e.g., bg-primary, var(--color-primary)).', + hardcodedHslColor: + 'Hardcoded HSL color "{{value}}" detected. Use semantic color tokens from src/index.css instead (e.g., bg-primary, var(--color-primary)).', + hardcodedNamedColor: + 'Hardcoded named color "{{value}}" detected in {{property}}. Use semantic color tokens from src/index.css instead (e.g., var(--color-primary)).', + }, + schema: [], + }, + + create(context) { + // Patterns to detect hardcoded colors in Tailwind arbitrary values + const hexPattern = /\[#[0-9a-fA-F]{3,8}\]/g; + const rgbPattern = /\[rgba?\([^)]+\)\]/g; + const hslPattern = /\[hsla?\([^)]+\)\]/g; + + // Patterns for inline style values (without Tailwind brackets) + const hexValuePattern = /^#[0-9a-fA-F]{3,8}$/; + const rgbValuePattern = /^rgba?\([^)]+\)$/; + const hslValuePattern = /^hsla?\([^)]+\)$/; + + // Common named colors to ban + const namedColors = new Set([ + 'black', + 'white', + 'red', + 'green', + 'blue', + 'yellow', + 'orange', + 'purple', + 'pink', + 'gray', + 'grey', + 'brown', + 'cyan', + 'magenta', + 'lime', + 'indigo', + 'violet', + 'gold', + 'silver', + 'navy', + 'teal', + 'olive', + 'maroon', + 'aqua', + 'fuchsia', + ]); + + // Style properties that accept color values + const colorProperties = new Set([ + 'color', + 'backgroundColor', + 'borderColor', + 'borderTopColor', + 'borderRightColor', + 'borderBottomColor', + 'borderLeftColor', + 'outlineColor', + 'textDecorationColor', + 'fill', + 'stroke', + 'caretColor', + 'accentColor', + ]); + + /** + * Check if a string value contains hardcoded color values + * @param {import('estree').Node} node - The AST node + * @param {string} value - The string value to check + */ + function checkForHardcodedColors(node, value) { + // Check for hex colors + const hexMatches = value.match(hexPattern); + if (hexMatches) { + hexMatches.forEach(match => { + context.report({ + node, + messageId: 'hardcodedHexColor', + data: { value: match }, + }); + }); + } + + // Check for RGB colors + const rgbMatches = value.match(rgbPattern); + if (rgbMatches) { + rgbMatches.forEach(match => { + context.report({ + node, + messageId: 'hardcodedRgbColor', + data: { value: match }, + }); + }); + } + + // Check for HSL colors + const hslMatches = value.match(hslPattern); + if (hslMatches) { + hslMatches.forEach(match => { + context.report({ + node, + messageId: 'hardcodedHslColor', + data: { value: match }, + }); + }); + } + } + + /** + * Check if a style object property has a hardcoded color value + * @param {import('estree').Node} node - The property node + * @param {string} propertyName - The property name + * @param {*} valueNode - The value node + */ + function checkStyleProperty(node, propertyName, valueNode) { + if (!colorProperties.has(propertyName)) { + return; + } + + // Handle string literal values + if (valueNode.type === 'Literal' && typeof valueNode.value === 'string') { + const value = valueNode.value; + + // Check for hex colors + if (hexValuePattern.test(value)) { + context.report({ + node: valueNode, + messageId: 'hardcodedHexColor', + data: { value }, + }); + return; + } + + // Check for RGB colors + if (rgbValuePattern.test(value)) { + context.report({ + node: valueNode, + messageId: 'hardcodedRgbColor', + data: { value }, + }); + return; + } + + // Check for HSL colors + if (hslValuePattern.test(value)) { + context.report({ + node: valueNode, + messageId: 'hardcodedHslColor', + data: { value }, + }); + return; + } + + // Check for named colors + if ( + namedColors.has(value.toLowerCase()) && + !value.startsWith('var(') && + value !== 'currentColor' && + value !== 'transparent' && + value !== 'inherit' + ) { + context.report({ + node: valueNode, + messageId: 'hardcodedNamedColor', + data: { value, property: propertyName }, + }); + } + } + } + + return { + // Handle JSX className attributes + JSXAttribute(node) { + if ( + node.name.name === 'className' && + node.value && + node.value.type === 'Literal' && + typeof node.value.value === 'string' + ) { + checkForHardcodedColors(node, node.value.value); + } + + // Handle template literals in className + if ( + node.name.name === 'className' && + node.value && + node.value.type === 'JSXExpressionContainer' && + node.value.expression.type === 'TemplateLiteral' + ) { + node.value.expression.quasis.forEach(quasi => { + checkForHardcodedColors(node, quasi.value.raw); + }); + } + + // Handle style attribute with object expression + if ( + node.name.name === 'style' && + node.value && + node.value.type === 'JSXExpressionContainer' && + node.value.expression.type === 'ObjectExpression' + ) { + node.value.expression.properties.forEach(prop => { + if (prop.type === 'Property' && prop.key.type === 'Identifier') { + checkStyleProperty(node, prop.key.name, prop.value); + } + }); + } + }, + + // Handle clsx/classnames/cn function calls + CallExpression(node) { + const functionName = node.callee.name; + if (['clsx', 'classnames', 'cn', 'cva'].includes(functionName)) { + node.arguments.forEach(arg => { + if (arg.type === 'Literal' && typeof arg.value === 'string') { + checkForHardcodedColors(arg, arg.value); + } + if (arg.type === 'TemplateLiteral') { + arg.quasis.forEach(quasi => { + checkForHardcodedColors(arg, quasi.value.raw); + }); + } + }); + } + }, + }; + }, +}; diff --git a/web/eslint-rules/no-primitive-color-scales.cjs b/web/eslint-rules/no-primitive-color-scales.cjs new file mode 100644 index 0000000..c6e8fa2 --- /dev/null +++ b/web/eslint-rules/no-primitive-color-scales.cjs @@ -0,0 +1,119 @@ +/** + * @fileoverview Ban primitive color scales in Tailwind classes + * + * This rule prevents developers from using primitive color scales directly + * (Tailwind palette scales like blue-*, red-*, neutral-*) in Tailwind className strings. + * All UI colors should use semantic tokens defined in src/index.css. + * + * Primitive scales are Tier 1 foundation colors and should only be referenced + * in the theme definition (src/index.css). Application code should use Tier 2 + * semantic tokens. + * + * Examples of incorrect code: + * className="bg-neutral-700" + * className="text-neutral-500" + * className="border-neutral-300" + * + * Examples of correct code: + * className="bg-primary" + * className="text-foreground" + * className="border-border" + * className="bg-accent" + */ + +/** @type {import('eslint').Rule.RuleModule} */ +module.exports = { + meta: { + type: 'problem', + docs: { + description: 'Disallow primitive color scales in Tailwind classes', + category: 'Best Practices', + recommended: true, + }, + messages: { + primitiveColorScale: + 'Primitive color scale "{{scale}}" detected in "{{match}}". Use semantic tokens instead:\n' + + ' • Brand: primary, secondary, accent\n' + + ' • Surface: background, surface, foreground, muted, border\n' + + ' • State: success, warning, danger', + }, + schema: [], + }, + + create(context) { + // Tailwind palette scales that should NOT be used directly in app code + const primitiveScales = [ + 'slate', + 'gray', + 'zinc', + 'neutral', + 'stone', + 'red', + 'orange', + 'amber', + 'yellow', + 'lime', + 'green', + 'emerald', + 'teal', + 'cyan', + 'sky', + 'blue', + 'indigo', + 'violet', + 'purple', + 'fuchsia', + 'pink', + 'rose', + 'white', + 'black', + + ]; + + // Build regex pattern to match any Tailwind class using primitive scales + // Matches patterns like: bg-neutral-700, text-neutral-500, border-neutral-300 + const primitivePattern = new RegExp( + `\\b(?:bg|text|border(?:-[xytrbls]|-[se])?|from|via|to|ring|outline|decoration|divide(?:-[xy])?|accent|caret|fill|stroke|shadow)-(?:${primitiveScales.join('|')})(?:-(?:50|100|200|300|400|500|600|700|800|900|950))?(?:\\/\\d+)?\\b`, + 'g' + ); + + /** + * Check if a string value contains primitive color scale usage + * @param {import('estree').Node} node - The AST node + * @param {string} value - The string value to check + */ + function checkForPrimitiveColors(node, value) { + const matches = value.match(primitivePattern); + if (matches) { + matches.forEach(match => { + // Extract the scale name from the match + const scaleMatch = primitiveScales.find(scale => match.includes(scale)); + context.report({ + node, + messageId: 'primitiveColorScale', + data: { + scale: scaleMatch, + match: match, + }, + }); + }); + } + } + + return { + // Scan every string literal: catches className attributes, ternaries, + // arrays, props and helper-function arguments alike. + Literal(node) { + if (typeof node.value === 'string') { + checkForPrimitiveColors(node, node.value); + } + }, + + TemplateLiteral(node) { + node.quasis.forEach(quasi => { + checkForPrimitiveColors(node, quasi.value.raw); + }); + }, + }; + }, +}; diff --git a/web/eslint.config.js b/web/eslint.config.js index 243d292..6831a24 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -5,19 +5,34 @@ import reactRefresh from 'eslint-plugin-react-refresh'; import tseslint from 'typescript-eslint'; import prettier from 'eslint-plugin-prettier/recommended'; import vitest from '@vitest/eslint-plugin'; +import customRules from './eslint-rules/index.cjs'; export default tseslint.config( { ignores: [ 'build', + 'dist', 'public', - 'tailwind.config.js', - 'craco.config.js', + 'src/api', + 'src/routeTree.gen.ts', 'node_modules', 'coverage', - 'eslint_report.json' + 'eslint_report.json', + 'eslint-rules' ], }, + // Custom color theming rules: app code may only use the semantic tokens + // defined in src/index.css. + { + files: ['**/*.{ts,tsx}'], + plugins: { + forky: customRules, + }, + rules: { + 'forky/no-hardcoded-colors': 'error', + 'forky/no-primitive-color-scales': 'error', + }, + }, { extends: [js.configs.recommended, ...tseslint.configs.recommended, vitest.configs.recommended, prettier], files: ['**/*.{ts,tsx}'], @@ -35,6 +50,11 @@ export default tseslint.config( }, rules: { ...reactHooks.configs.recommended.rules, + // React Compiler readiness rules (react-hooks v7). The codebase is + // clean; keep them as errors so regressions fail lint. + 'react-hooks/purity': 'error', + 'react-hooks/set-state-in-effect': 'error', + 'react-hooks/immutability': 'error', 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], 'react/prop-types': 'off', 'prettier/prettier': [ @@ -46,7 +66,9 @@ export default tseslint.config( proseWrap: 'never', }, ], - radix: ['error', 'as-needed'], + // The codebase intentionally parses base-10 decimal strings (slots, + // epochs) without an explicit radix. + radix: 'off', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'off', 'react/react-in-jsx-scope': 'off', diff --git a/web/openapi-ts.config.ts b/web/openapi-ts.config.ts new file mode 100644 index 0000000..4f718b2 --- /dev/null +++ b/web/openapi-ts.config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from '@hey-api/openapi-ts'; + +const OPENAPI_INPUT = process.env.OPENAPI_INPUT || '../api/openapi.yaml'; + +export default defineConfig({ + input: OPENAPI_INPUT, + output: { + path: 'src/api', + postProcess: ['prettier'], + }, + plugins: [ + { + name: '@hey-api/client-fetch', + runtimeConfigPath: './src/utils/api-config.ts', + }, + { + name: 'zod', + compatibilityVersion: 'mini', + metadata: false, + }, + '@tanstack/react-query', + // The backend is generated from the same spec (ogen), so responses are + // validated against the zod schemas at runtime. + { + name: '@hey-api/sdk', + validator: { + request: false, + response: true, + }, + }, + ], +}); diff --git a/web/package-lock.json b/web/package-lock.json deleted file mode 100644 index 5bde9da..0000000 --- a/web/package-lock.json +++ /dev/null @@ -1,7025 +0,0 @@ -{ - "name": "forkchoice", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "forkchoice", - "version": "0.0.0", - "dependencies": { - "@headlessui/react": "2.2.2", - "@heroicons/react": "2.2.0", - "@tailwindcss/vite": "4.1.5", - "@tanstack/react-query": "5.75.0", - "@tanstack/react-query-devtools": "5.75.0", - "@types/pako": "2.0.3", - "clsx": "2.1.1", - "graphology": "0.26.0", - "graphology-layout": "0.6.1", - "graphology-traversal": "0.3.1", - "graphology-types": "0.24.8", - "graphology-utils": "2.5.2", - "javascript-time-ago": "2.5.11", - "pako": "2.1.0", - "react": "19.1.0", - "react-dom": "19.1.0", - "react-router-dom": "7.5.3", - "react-time-ago": "7.3.3", - "react-zoom-pan-pinch": "3.7.0", - "wouter": "3.7.0" - }, - "devDependencies": { - "@eslint/js": "9.25.1", - "@testing-library/dom": "10.4.0", - "@testing-library/react": "16.3.0", - "@types/js-yaml": "4.0.9", - "@types/react": "19.1.2", - "@types/react-dom": "19.1.3", - "@vitejs/plugin-react": "4.4.1", - "@vitest/coverage-v8": "3.1.2", - "@vitest/eslint-plugin": "1.1.44", - "autoprefixer": "10.4.21", - "eslint": "9.25.1", - "eslint-config-prettier": "10.1.2", - "eslint-plugin-prettier": "5.2.6", - "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-react-refresh": "0.4.20", - "globals": "16.0.0", - "jsdom": "26.1.0", - "msw": "2.7.5", - "prettier": "3.5.3", - "prop-types": "15.8.1", - "typescript": "5.8.3", - "typescript-eslint": "8.31.1", - "vite": "6.3.4", - "vite-tsconfig-paths": "5.1.4", - "vitest": "3.1.2", - "vitest-github-actions-reporter": "0.11.1" - } - }, - "node_modules/@actions/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", - "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@actions/exec": "^1.1.1", - "@actions/http-client": "^2.0.1" - } - }, - "node_modules/@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@actions/io": "^1.0.1" - } - }, - "node_modules/@actions/http-client": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", - "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@actions/io": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", - "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", - "dev": true, - "license": "MIT" - }, - "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/@asamuzakjp/css-color": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.5.tgz", - "integrity": "sha512-w7AmVyTTiU41fNLsFDf+gA2Dwtbx2EJtn2pbJNAGSRAg50loXy1uLXA3hEpD8+eydcomTurw09tq5/AyceCaGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@asamuzakjp/css-color/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/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", - "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", - "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helpers": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1", - "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/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", - "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/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-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", - "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", - "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "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.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", - "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cookie": "^0.7.2" - } - }, - "node_modules/@bundled-es-modules/statuses": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", - "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", - "dev": true, - "license": "ISC", - "dependencies": { - "statuses": "^2.0.1" - } - }, - "node_modules/@bundled-es-modules/tough-cookie": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", - "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/tough-cookie": "^4.0.5", - "tough-cookie": "^4.1.4" - } - }, - "node_modules/@bundled-es-modules/tough-cookie/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.3.tgz", - "integrity": "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.9.tgz", - "integrity": "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.3" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", - "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", - "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/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/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", - "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "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.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.13.0", - "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/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.26.28", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", - "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.8", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, - "node_modules/@headlessui/react": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.2.tgz", - "integrity": "sha512-zbniWOYBQ8GHSUIOPY7BbdIn6PzUOq0z41RFrF30HbjsxG6Rrfk+6QulR8Kgf2Vwj2a/rE6i62q5vo+2gI5dJA==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.26.16", - "@react-aria/focus": "^3.17.1", - "@react-aria/interactions": "^3.21.3", - "@tanstack/react-virtual": "^3.13.6", - "use-sync-external-store": "^1.5.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^18 || ^19 || ^19.0.0-rc", - "react-dom": "^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/@heroicons/react": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", - "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", - "license": "MIT", - "peerDependencies": { - "react": ">= 16 || ^19.0.0-rc" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", - "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.10", - "@inquirer/type": "^3.0.6" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/core": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", - "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.6", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", - "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", - "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "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-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/@isaacs/cliui/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/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "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/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/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.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/@mswjs/interceptors": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", - "integrity": "sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "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/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, - "license": "MIT" - }, - "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.2.4", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", - "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@react-aria/focus": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.2.tgz", - "integrity": "sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.25.0", - "@react-aria/utils": "^3.28.2", - "@react-types/shared": "^3.29.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/interactions": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.0.tgz", - "integrity": "sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.8", - "@react-aria/utils": "^3.28.2", - "@react-stately/flags": "^3.1.1", - "@react-types/shared": "^3.29.0", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz", - "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/utils": { - "version": "3.28.2", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.28.2.tgz", - "integrity": "sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.8", - "@react-stately/flags": "^3.1.1", - "@react-stately/utils": "^3.10.6", - "@react-types/shared": "^3.29.0", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-stately/flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.1.tgz", - "integrity": "sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-stately/utils": { - "version": "3.10.6", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.6.tgz", - "integrity": "sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-types/shared": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.29.0.tgz", - "integrity": "sha512-IDQYu/AHgZimObzCFdNl1LpZvQW/xcfLt3v20sorl5qRucDVj4S9os98sVTZ4IRIBjmS+MkjqpR5E70xan7ooA==", - "license": "Apache-2.0", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", - "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", - "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", - "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", - "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", - "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", - "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", - "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", - "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", - "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", - "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", - "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", - "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", - "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", - "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", - "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", - "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", - "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", - "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", - "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", - "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", - "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", - "license": "MIT", - "dependencies": { - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.29.2", - "tailwindcss": "4.1.5" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", - "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-x64": "4.1.5", - "@tailwindcss/oxide-freebsd-x64": "4.1.5", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-x64-musl": "4.1.5", - "@tailwindcss/oxide-wasm32-wasi": "4.1.5", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", - "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", - "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", - "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", - "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", - "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", - "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", - "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", - "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", - "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", - "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.9", - "@tybys/wasm-util": "^0.9.0", - "tslib": "^2.8.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", - "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", - "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.5.tgz", - "integrity": "sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==", - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.1.5", - "@tailwindcss/oxide": "4.1.5", - "tailwindcss": "4.1.5" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6" - } - }, - "node_modules/@tanstack/query-core": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.75.0.tgz", - "integrity": "sha512-rk8KQuCdhoRkzjRVF3QxLgAfFUyS0k7+GCQjlGEpEGco+qazJ0eMH6aO1DjDjibH7/ik383nnztua3BG+lOnwg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/query-devtools": { - "version": "5.74.7", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.74.7.tgz", - "integrity": "sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@tanstack/react-query": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.75.0.tgz", - "integrity": "sha512-H+TNgxmTbzH8qQ5MT5xsZEhQ8BG1tUYduDSfeAOzroVZgd/AEjg1rRYSP/9Tl9/hPobZ7iZzV401n77kStrbKw==", - "license": "MIT", - "dependencies": { - "@tanstack/query-core": "5.75.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^18 || ^19" - } - }, - "node_modules/@tanstack/react-query-devtools": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.75.0.tgz", - "integrity": "sha512-ogTsCCONHPq8opyeU/NJZlus8+g36KnK+cybC1cs0Knr8iO/wAYgnciz+3DVNq38kRflBb0iJhHkUexp/7WfcQ==", - "license": "MIT", - "dependencies": { - "@tanstack/query-devtools": "5.74.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/react-query": "^5.75.0", - "react": "^18 || ^19" - } - }, - "node_modules/@tanstack/react-virtual": { - "version": "3.13.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.6.tgz", - "integrity": "sha512-WT7nWs8ximoQ0CDx/ngoFP7HbQF9Q2wQe4nh2NB+u2486eX3nZRE40P9g6ccCVq7ZfTSH5gFOuCoVH5DLNS/aA==", - "license": "MIT", - "dependencies": { - "@tanstack/virtual-core": "3.13.6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@tanstack/virtual-core": { - "version": "3.13.6", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.6.tgz", - "integrity": "sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/react": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "license": "MIT" - }, - "node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true, - "license": "MIT" - }, - "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/pako": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.3.tgz", - "integrity": "sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", - "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz", - "integrity": "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", - "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/type-utils": "8.31.1", - "@typescript-eslint/utils": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" - }, - "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", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", - "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/typescript-estree": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", - "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", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", - "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1" - }, - "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": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", - "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.1", - "@typescript-eslint/utils": "8.31.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" - }, - "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", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", - "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", - "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/typescript-estree": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", - "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", - "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": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", - "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/typescript-estree": "8.31.1" - }, - "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", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", - "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.31.1", - "eslint-visitor-keys": "^4.2.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/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "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/@vitejs/plugin-react": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", - "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.2.tgz", - "integrity": "sha512-XDdaDOeaTMAMYW7N63AqoK32sYUWbXnTkC6tEbVcu3RlU1bB9of32T+PGf8KZvxqLNqeXhafDFqCkwpf2+dyaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^1.0.2", - "debug": "^4.4.0", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.9.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "3.1.2", - "vitest": "3.1.2" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } - }, - "node_modules/@vitest/eslint-plugin": { - "version": "1.1.44", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.44.tgz", - "integrity": "sha512-m4XeohMT+Dj2RZfxnbiFR+Cv5dEC0H7C6TlxRQT7GK2556solm99kxgzJp/trKrZvanZcOFyw7aABykUTfWyrg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@typescript-eslint/utils": ">= 8.24.0", - "eslint": ">= 8.57.0", - "typescript": ">= 5.0.0", - "vitest": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vitest": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz", - "integrity": "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.1.2", - "@vitest/utils": "3.1.2", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz", - "integrity": "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.1.2", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz", - "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz", - "integrity": "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.1.2", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz", - "integrity": "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.2", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz", - "integrity": "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz", - "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.2", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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-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/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.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "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.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/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/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/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.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "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.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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/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/caniuse-lite": { - "version": "1.0.30001716", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", - "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", - "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/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "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/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/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/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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/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/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.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssstyle": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", - "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.1.2", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "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/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "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/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "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/electron-to-chromium": { - "version": "1.5.149", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", - "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", - "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/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.3", - "@esbuild/android-arm": "0.25.3", - "@esbuild/android-arm64": "0.25.3", - "@esbuild/android-x64": "0.25.3", - "@esbuild/darwin-arm64": "0.25.3", - "@esbuild/darwin-x64": "0.25.3", - "@esbuild/freebsd-arm64": "0.25.3", - "@esbuild/freebsd-x64": "0.25.3", - "@esbuild/linux-arm": "0.25.3", - "@esbuild/linux-arm64": "0.25.3", - "@esbuild/linux-ia32": "0.25.3", - "@esbuild/linux-loong64": "0.25.3", - "@esbuild/linux-mips64el": "0.25.3", - "@esbuild/linux-ppc64": "0.25.3", - "@esbuild/linux-riscv64": "0.25.3", - "@esbuild/linux-s390x": "0.25.3", - "@esbuild/linux-x64": "0.25.3", - "@esbuild/netbsd-arm64": "0.25.3", - "@esbuild/netbsd-x64": "0.25.3", - "@esbuild/openbsd-arm64": "0.25.3", - "@esbuild/openbsd-x64": "0.25.3", - "@esbuild/sunos-x64": "0.25.3", - "@esbuild/win32-arm64": "0.25.3", - "@esbuild/win32-ia32": "0.25.3", - "@esbuild/win32-x64": "0.25.3" - } - }, - "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-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.25.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", - "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.13.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.25.1", - "@eslint/plugin-kit": "^0.2.8", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", - "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.0" - }, - "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": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "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 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", - "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=8.40" - } - }, - "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "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/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/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "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/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/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.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-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/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "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-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "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.8" - }, - "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/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "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/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/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/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "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/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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/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/globals": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", - "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", - "dev": true, - "license": "MIT", - "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/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==", - "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/graphology": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.26.0.tgz", - "integrity": "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==", - "license": "MIT", - "dependencies": { - "events": "^3.3.0" - }, - "peerDependencies": { - "graphology-types": ">=0.24.0" - } - }, - "node_modules/graphology-indices": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", - "integrity": "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.4.2", - "mnemonist": "^0.39.0" - }, - "peerDependencies": { - "graphology-types": ">=0.20.0" - } - }, - "node_modules/graphology-layout": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/graphology-layout/-/graphology-layout-0.6.1.tgz", - "integrity": "sha512-m9aMvbd0uDPffUCFPng5ibRkb2pmfNvdKjQWeZrf71RS1aOoat5874+DcyNfMeCT4aQguKC7Lj9eCbqZj/h8Ag==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.3.0", - "pandemonium": "^2.4.0" - }, - "peerDependencies": { - "graphology-types": ">=0.19.0" - } - }, - "node_modules/graphology-traversal": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/graphology-traversal/-/graphology-traversal-0.3.1.tgz", - "integrity": "sha512-lGLrLKEDKtNgAKgHVhVftKf3cb/nuWwuVPQZHXRnN90JWn0RSjco/s+NB2ARSlMapEMlbnPgv6j++427yTnU3Q==", - "license": "MIT", - "dependencies": { - "graphology-indices": "^0.17.0", - "graphology-utils": "^2.0.0" - }, - "peerDependencies": { - "graphology-types": ">=0.20.0" - } - }, - "node_modules/graphology-types": { - "version": "0.24.8", - "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz", - "integrity": "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==", - "license": "MIT" - }, - "node_modules/graphology-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz", - "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==", - "license": "MIT", - "peerDependencies": { - "graphology-types": ">=0.23.0" - } - }, - "node_modules/graphql": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", - "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "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/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "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/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/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-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-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-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, - "license": "MIT" - }, - "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-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "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/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/javascript-time-ago": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/javascript-time-ago/-/javascript-time-ago-2.5.11.tgz", - "integrity": "sha512-Zeyf5R7oM1fSMW9zsU3YgAYwE0bimEeF54Udn2ixGd8PUwu+z1Yc5t4Y8YScJDMHD6uCx6giLt3VJR5K4CMwbg==", - "license": "MIT", - "dependencies": { - "relative-time-format": "^1.1.6" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "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==", - "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/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "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-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/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/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/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/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "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.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/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==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true, - "license": "MIT" - }, - "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/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.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": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "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/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/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/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/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/mnemonist": { - "version": "0.39.8", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", - "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", - "license": "MIT", - "dependencies": { - "obliterator": "^2.0.1" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/msw": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.5.tgz", - "integrity": "sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@bundled-es-modules/cookie": "^2.0.1", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^5.0.0", - "@mswjs/interceptors": "^0.37.0", - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "path-to-regexp": "^6.3.0", - "picocolors": "^1.1.1", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.26.1", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.8.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "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/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/obliterator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", - "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", - "license": "MIT" - }, - "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/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, - "license": "MIT" - }, - "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/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/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "license": "(MIT AND Zlib)" - }, - "node_modules/pandemonium": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", - "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==", - "license": "MIT", - "dependencies": { - "mnemonist": "^0.39.2" - } - }, - "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/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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-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-scurry/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/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/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "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/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "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.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "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.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", - "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/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "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/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "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/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", - "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz", - "integrity": "sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A==", - "license": "MIT", - "dependencies": { - "react-router": "7.5.3" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/react-router/node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/react-time-ago": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/react-time-ago/-/react-time-ago-7.3.3.tgz", - "integrity": "sha512-5kh2Kuu/UhHzcZrGvf3GUrF2d+IXjkIXif5MR2iDWIfSqQuBW27/ejN/tmzJBRyPiryYTgbDIG6AZFJ4RW3yfw==", - "license": "MIT", - "dependencies": { - "memoize-one": "^6.0.0", - "prop-types": "^15.8.1", - "raf": "^3.4.1" - }, - "peerDependencies": { - "javascript-time-ago": "^2.3.7", - "react": ">=0.16.8", - "react-dom": ">=0.16.8" - } - }, - "node_modules/react-zoom-pan-pinch": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.7.0.tgz", - "integrity": "sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==", - "license": "MIT", - "engines": { - "node": ">=8", - "npm": ">=5" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/regexparam": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", - "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/relative-time-format": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/relative-time-format/-/relative-time-format-1.1.6.tgz", - "integrity": "sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==", - "license": "MIT" - }, - "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/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "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/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", - "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.1", - "@rollup/rollup-android-arm64": "4.40.1", - "@rollup/rollup-darwin-arm64": "4.40.1", - "@rollup/rollup-darwin-x64": "4.40.1", - "@rollup/rollup-freebsd-arm64": "4.40.1", - "@rollup/rollup-freebsd-x64": "4.40.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", - "@rollup/rollup-linux-arm-musleabihf": "4.40.1", - "@rollup/rollup-linux-arm64-gnu": "4.40.1", - "@rollup/rollup-linux-arm64-musl": "4.40.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-musl": "4.40.1", - "@rollup/rollup-linux-s390x-gnu": "4.40.1", - "@rollup/rollup-linux-x64-gnu": "4.40.1", - "@rollup/rollup-linux-x64-musl": "4.40.1", - "@rollup/rollup-win32-arm64-msvc": "4.40.1", - "@rollup/rollup-win32-ia32-msvc": "4.40.1", - "@rollup/rollup-win32-x64-msvc": "4.40.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, - "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/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" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" - }, - "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/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "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/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==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "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.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT" - }, - "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-cjs/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": { - "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/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-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/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/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/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/synckit": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", - "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", - "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, - "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/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tsconfck": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.5.tgz", - "integrity": "sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" - }, - "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": "4.40.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", - "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", - "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.31.1", - "@typescript-eslint/parser": "8.31.1", - "@typescript-eslint/utils": "8.31.1" - }, - "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", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "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.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/vite": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", - "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz", - "integrity": "sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", - "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", - "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/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz", - "integrity": "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.1.2", - "@vitest/mocker": "3.1.2", - "@vitest/pretty-format": "^3.1.2", - "@vitest/runner": "3.1.2", - "@vitest/snapshot": "3.1.2", - "@vitest/spy": "3.1.2", - "@vitest/utils": "3.1.2", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.13", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.2", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.1.2", - "@vitest/ui": "3.1.2", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest-github-actions-reporter": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/vitest-github-actions-reporter/-/vitest-github-actions-reporter-0.11.1.tgz", - "integrity": "sha512-ZHHB0wBgOPhMYCB17WKVlJZa+5SdudBZFoVoebwfq3ioIUTeLQGYHwh85vpdJAxRghLP8d0qI/6eCTueGyDVXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@actions/core": "^1.10.0" - }, - "engines": { - "node": ">=14.16.0" - }, - "peerDependencies": { - "vitest": ">=0.28.5" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "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/wouter": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/wouter/-/wouter-3.7.0.tgz", - "integrity": "sha512-ElkqESy10WgRRbdd22uQkSSO6LmG6vxI50pxPKry2TLebbdXvgtp7rJ48KafjUvsKcQQmIewxgRCGixPfk58tw==", - "license": "Unlicense", - "dependencies": { - "mitt": "^3.0.1", - "regexparam": "^3.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-cjs/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/wrap-ansi/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/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/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/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "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": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "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/yargs/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/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/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/web/package.json b/web/package.json index 95183e3..a9387a8 100644 --- a/web/package.json +++ b/web/package.json @@ -3,64 +3,65 @@ "private": true, "version": "0.0.0", "type": "module", + "packageManager": "pnpm@10.30.1", "scripts": { "build": "tsc -b tsconfig.app.json && vite build", "dev:mock": "VITE_MOCK=true vite", "dev": "vite", "generate": "NODE_OPTIONS=--experimental-strip-types NODE_NO_WARNINGS=1 node dataset-generate.ts", + "generate:api": "openapi-ts", "lint:report": "eslint --output-file eslint_report.json --format json src", "lint": "eslint .", "preview": "vite preview", + "typecheck": "tsc --noEmit", + "format": "prettier --write \"src/**/*.{ts,tsx}\"", "test:coverage": "vitest run --coverage", "test": "vitest" }, "dependencies": { - "@headlessui/react": "2.2.2", + "@headlessui/react": "2.2.10", "@heroicons/react": "2.2.0", - "@tailwindcss/vite": "4.1.5", + "@tailwindcss/vite": "4.3.0", "@tanstack/react-query": "5.75.0", - "@tanstack/react-query-devtools": "5.75.0", + "@tanstack/react-router": "1.170.15", "clsx": "2.1.1", "graphology": "0.26.0", - "graphology-layout": "0.6.1", - "graphology-traversal": "0.3.1", "graphology-types": "0.24.8", - "graphology-utils": "2.5.2", "javascript-time-ago": "2.5.11", - "react": "19.1.0", - "react-dom": "19.1.0", - "react-router-dom": "7.5.3", + "react": "19.2.7", + "react-dom": "19.2.7", "react-time-ago": "7.3.3", "react-zoom-pan-pinch": "3.7.0", - "wouter": "3.7.0" + "zod": "4.4.3" }, "devDependencies": { - "@eslint/js": "9.25.1", - "@testing-library/dom": "10.4.0", - "@testing-library/react": "16.3.0", + "@eslint/js": "10.0.1", + "@hey-api/openapi-ts": "0.98.1", + "@tanstack/router-plugin": "1.168.18", + "@testing-library/dom": "10.4.1", + "@testing-library/react": "16.3.2", "@types/js-yaml": "4.0.9", - "@types/react": "19.1.2", - "@types/react-dom": "19.1.3", - "@vitejs/plugin-react": "4.4.1", - "@vitest/coverage-v8": "3.1.2", - "@vitest/eslint-plugin": "1.1.44", + "@types/react": "19.2.17", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.2", + "@vitest/coverage-v8": "4.1.8", + "@vitest/eslint-plugin": "1.6.19", "autoprefixer": "10.4.21", - "eslint": "9.25.1", - "eslint-config-prettier": "10.1.2", - "eslint-plugin-prettier": "5.2.6", - "eslint-plugin-react-hooks": "5.2.0", - "eslint-plugin-react-refresh": "0.4.20", - "globals": "16.0.0", - "jsdom": "26.1.0", + "eslint": "10.4.1", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-prettier": "5.5.6", + "eslint-plugin-react-hooks": "7.1.1", + "eslint-plugin-react-refresh": "0.5.2", + "globals": "17.6.0", + "jsdom": "29.1.1", "msw": "2.7.5", - "prettier": "3.5.3", + "prettier": "3.8.3", "prop-types": "15.8.1", - "typescript": "5.8.3", - "typescript-eslint": "8.31.1", - "vite": "6.3.4", - "vite-tsconfig-paths": "5.1.4", - "vitest": "3.1.2", - "vitest-github-actions-reporter": "0.11.1" + "tailwindcss": "4.3.0", + "typescript": "6.0.3", + "typescript-eslint": "8.60.1", + "vite": "8.0.16", + "vitest": "4.1.8" }, "volta": { "node": "23.11.0", @@ -68,5 +69,12 @@ }, "msw": { "workerDirectory": "public" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild", + "@tailwindcss/oxide", + "msw" + ] } } diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 0000000..7209700 --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,4137 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@headlessui/react': + specifier: 2.2.10 + version: 2.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@heroicons/react': + specifier: 2.2.0 + version: 2.2.0(react@19.2.7) + '@tailwindcss/vite': + specifier: 4.3.0 + version: 4.3.0(vite@8.0.16(jiti@2.7.0)) + '@tanstack/react-query': + specifier: 5.75.0 + version: 5.75.0(react@19.2.7) + '@tanstack/react-router': + specifier: 1.170.15 + version: 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + clsx: + specifier: 2.1.1 + version: 2.1.1 + graphology: + specifier: 0.26.0 + version: 0.26.0(graphology-types@0.24.8) + graphology-types: + specifier: 0.24.8 + version: 0.24.8 + javascript-time-ago: + specifier: 2.5.11 + version: 2.5.11 + react: + specifier: 19.2.7 + version: 19.2.7 + react-dom: + specifier: 19.2.7 + version: 19.2.7(react@19.2.7) + react-time-ago: + specifier: 7.3.3 + version: 7.3.3(javascript-time-ago@2.5.11)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-zoom-pan-pinch: + specifier: 3.7.0 + version: 3.7.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + zod: + specifier: 4.4.3 + version: 4.4.3 + devDependencies: + '@eslint/js': + specifier: 10.0.1 + version: 10.0.1(eslint@10.4.1(jiti@2.7.0)) + '@hey-api/openapi-ts': + specifier: 0.98.1 + version: 0.98.1(magicast@0.5.3)(typescript@6.0.3) + '@tanstack/router-plugin': + specifier: 1.168.18 + version: 1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(jiti@2.7.0)) + '@testing-library/dom': + specifier: 10.4.1 + version: 10.4.1 + '@testing-library/react': + specifier: 16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/js-yaml': + specifier: 4.0.9 + version: 4.0.9 + '@types/react': + specifier: 19.2.17 + version: 19.2.17 + '@types/react-dom': + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.17) + '@vitejs/plugin-react': + specifier: 6.0.2 + version: 6.0.2(vite@8.0.16(jiti@2.7.0)) + '@vitest/coverage-v8': + specifier: 4.1.8 + version: 4.1.8(vitest@4.1.8) + '@vitest/eslint-plugin': + specifier: 1.6.19 + version: 1.6.19(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8) + autoprefixer: + specifier: 10.4.21 + version: 10.4.21(postcss@8.5.15) + eslint: + specifier: 10.4.1 + version: 10.4.1(jiti@2.7.0) + eslint-config-prettier: + specifier: 10.1.8 + version: 10.1.8(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-prettier: + specifier: 5.5.6 + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(prettier@3.8.3) + eslint-plugin-react-hooks: + specifier: 7.1.1 + version: 7.1.1(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-react-refresh: + specifier: 0.5.2 + version: 0.5.2(eslint@10.4.1(jiti@2.7.0)) + globals: + specifier: 17.6.0 + version: 17.6.0 + jsdom: + specifier: 29.1.1 + version: 29.1.1 + msw: + specifier: 2.7.5 + version: 2.7.5(typescript@6.0.3) + prettier: + specifier: 3.8.3 + version: 3.8.3 + prop-types: + specifier: 15.8.1 + version: 15.8.1 + tailwindcss: + specifier: 4.3.0 + version: 4.3.0 + typescript: + specifier: 6.0.3 + version: 6.0.3 + typescript-eslint: + specifier: 8.60.1 + version: 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + vite: + specifier: 8.0.16 + version: 8.0.16(jiti@2.7.0) + vitest: + specifier: 4.1.8 + version: 4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + +packages: + + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.1.1': + resolution: {integrity: sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.5': + resolution: {integrity: sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@headlessui/react@2.2.10': + resolution: {integrity: sha512-5pVLNK9wlpxTUTy9GpgbX/SdcRh+HBnPktjM2wbiLTH4p+2EPHBO1aoSryUCuKUIItdDWO9ITlhUL8UnUN/oIA==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + '@heroicons/react@2.2.0': + resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==} + peerDependencies: + react: '>= 16 || ^19.0.0-rc' + + '@hey-api/codegen-core@0.8.4': + resolution: {integrity: sha512-IF8/+midxK0Hu0wL/yMUfBL4+MSiRV5hziKMjKOXXqknUYE8gkf0BKW4XPsPo0DTzNDEV9qBAENaa3PRTduupQ==} + engines: {node: '>=22.18.0'} + + '@hey-api/json-schema-ref-parser@1.4.3': + resolution: {integrity: sha512-UzGSDzh3QUhrnwl4atnHc2YqDO6KemYVEOwl1Ynowm/tcr0XlpdHOpyWr5UaWIJfiXTXdYRIC9k2Yxm19pcPzQ==} + engines: {node: '>=22.18.0'} + + '@hey-api/openapi-ts@0.98.1': + resolution: {integrity: sha512-TTQQwiOTPK23kVykuMDMz2ko1dTcrJb9uA3BA7pY8vrPRGtKchLfegzl3IwqHAg4Ay0p8ByguVUdZrqe+OpLIQ==} + engines: {node: '>=22.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.5.3 || >=6.0.0 || 6.0.1-rc' + + '@hey-api/shared@0.4.7': + resolution: {integrity: sha512-ujMNKbSswtrj6mCWnoFzf8HjFJ8lt/yqQObHqMtwPXH7/KOjKe2SXtea9Si+FeYUIhJ3VpOkV5eeFCPk1LXn7g==} + engines: {node: '>=22.18.0'} + + '@hey-api/spec-types@0.2.0': + resolution: {integrity: sha512-ibQ8Is7evMavzr8GNyJCcTg975d8DpaMUyLmOrQ85UBdy1l6t1KuRAwgChAbesJsIlNV6gjmlXruWyegDX18Fg==} + + '@hey-api/types@0.1.4': + resolution: {integrity: sha512-thWfawrDIP7wSI9ioT13I5soaaqB5vAPIiZmgD8PbeEVKNrkonc0N/Sjj97ezl7oQgusZmaNphGdMKipPO6IBg==} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@internationalized/date@3.12.2': + resolution: {integrity: sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==} + + '@internationalized/number@3.6.7': + resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==} + + '@internationalized/string@3.2.9': + resolution: {integrity: sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@mswjs/interceptors@0.37.6': + resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} + engines: {node: '>=18'} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} + + '@react-aria/focus@3.22.1': + resolution: {integrity: sha512-CPxtkyrBi/HYY5P3lE/57sQ6qfa0lN8E55TOm89H0kNGv0lKt+/0zP7lWERzBjRr5IxBVrQX4gFEowBN52LPaA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.28.1': + resolution: {integrity: sha512-Bqb+HrD5I5MHS2SKBhISYqo2SW8Y2dfzgF/Y1lIJq7xqLxheo9vzxPGEHhz+XzkgGfoqEJx8A6a3C7uiqS3HWA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.35.0': + resolution: {integrity: sha512-iNWvuzEwANttpQpdlu8nPBtdHb0mcCMj1ZTH//iRB5E/14IAnyRlR25rxH7pNLyzHINsPGEKnWvpwDMCT6vziQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tanstack/history@1.162.0': + resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + engines: {node: '>=20.19'} + + '@tanstack/query-core@5.75.0': + resolution: {integrity: sha512-rk8KQuCdhoRkzjRVF3QxLgAfFUyS0k7+GCQjlGEpEGco+qazJ0eMH6aO1DjDjibH7/ik383nnztua3BG+lOnwg==} + + '@tanstack/react-query@5.75.0': + resolution: {integrity: sha512-H+TNgxmTbzH8qQ5MT5xsZEhQ8BG1tUYduDSfeAOzroVZgd/AEjg1rRYSP/9Tl9/hPobZ7iZzV401n77kStrbKw==} + peerDependencies: + react: ^18 || ^19 + + '@tanstack/react-router@1.170.15': + resolution: {integrity: sha512-GawYz7HEjj8rTUUDoT/SemDEVm63pZUO+2mOcXHY9Jl3EwMS5gFBnPu/2UvcrwRm1jN1k79fokc0d4aFmrLatg==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/react-virtual@3.14.2': + resolution: {integrity: sha512-IpWnmCLvuymRfeeLNVXIzNEYBFLpd3drVIS91sqV78VTZFyldlChkOocZRCPp1B+Wnk09bcLNme8WaMU/9/9bQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.171.13': + resolution: {integrity: sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA==} + engines: {node: '>=20.19'} + + '@tanstack/router-generator@1.167.17': + resolution: {integrity: sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA==} + engines: {node: '>=20.19'} + + '@tanstack/router-plugin@1.168.18': + resolution: {integrity: sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg==} + engines: {node: '>=20.19'} + peerDependencies: + '@rsbuild/core': '>=1.0.2 || ^2.0.0' + '@tanstack/react-router': ^1.170.15 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.162.2': + resolution: {integrity: sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==} + engines: {node: '>=20.19'} + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + + '@tanstack/virtual-core@3.17.0': + resolution: {integrity: sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==} + + '@tanstack/virtual-file-routes@1.162.0': + resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} + engines: {node: '>=20.19'} + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@typescript-eslint/eslint-plugin@8.60.1': + resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.60.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.60.1': + resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.60.1': + resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.60.1': + resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.60.1': + resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.60.1': + resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.60.1': + resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.60.1': + resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.60.1': + resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.60.1': + resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + '@vitest/coverage-v8@4.1.8': + resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} + peerDependencies: + '@vitest/browser': 4.1.8 + vitest: 4.1.8 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/eslint-plugin@1.6.19': + resolution: {integrity: sha512-zodmXRsVKFsuHxHJILuTFaaKsrsxm0YsiOX65clk+LpCW9JrVXaf6ERXr0caDs+NEk0S62Jyk0K7XYQ7gWXheA==} + engines: {node: '>=18'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '*' + eslint: '>=8.57.0' + typescript: '>=5.0.0' + vitest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + typescript: + optional: true + vitest: + optional: true + + '@vitest/expect@4.1.8': + resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} + + '@vitest/mocker@4.1.8': + resolution: {integrity: sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.8': + resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} + + '@vitest/runner@4.1.8': + resolution: {integrity: sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==} + + '@vitest/snapshot@4.1.8': + resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + + '@vitest/spy@4.1.8': + resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + + '@vitest/utils@4.1.8': + resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@1.0.3: + resolution: {integrity: sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.34: + resolution: {integrity: sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==} + engines: {node: '>=6.0.0'} + hasBin: true + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + caniuse-lite@1.0.30001797: + resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + electron-to-chromium@1.5.368: + resolution: {integrity: sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.23.0: + resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==} + engines: {node: '>=10.13.0'} + + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.5.6: + resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-react-refresh@0.5.2: + resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==} + peerDependencies: + eslint: ^9 || ^10 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.4.1: + resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + giget@3.2.0: + resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==} + hasBin: true + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphology-types@0.24.8: + resolution: {integrity: sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==} + + graphology@0.26.0: + resolution: {integrity: sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==} + peerDependencies: + graphology-types: '>=0.24.0' + + graphql@16.14.1: + resolution: {integrity: sha512-cQOsSMS/IrDz82PVyRDvf/Q1F/bRbBVjJlh+xYOkI1qw2bWRvWGiWc+m2O0d6l4Bt1fyY+8kzJ8JFWGJqNeDBg==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isbot@5.1.41: + resolution: {integrity: sha512-9WFV/Vhh0FEj6CQ7MoHweEL9/vLKPjeoD2I2htbAjX7kbW7VJs3OCpWOVyd+JraNTWVU6/DRx2MZy2KaUNXHcg==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + javascript-time-ago@2.5.11: + resolution: {integrity: sha512-Zeyf5R7oM1fSMW9zsU3YgAYwE0bimEeF54Udn2ixGd8PUwu+z1Yc5t4Y8YScJDMHD6uCx6giLt3VJR5K4CMwbg==} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msw@2.7.5: + resolution: {integrity: sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + obug@2.1.2: + resolution: {integrity: sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==} + engines: {node: '>=12.20.0'} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + + react-aria@3.49.0: + resolution: {integrity: sha512-4+oK9FwJQWYhyA5zLfj/feOGY0zZbkE1muoF4gyxMroHVypjcYaRSTlJwvxph2zIlxt757KX6xIK2wJ5Aw1Kog==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + peerDependencies: + react: ^19.2.7 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-stately@3.47.0: + resolution: {integrity: sha512-H3ar+SOWP920EbVg7qWfP3fZjZiwhlEJAEJQqjt+w8oKijCwFgr0+R4941PIHscOXRNRvEOjvWilitImC0DdBg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + react-time-ago@7.3.3: + resolution: {integrity: sha512-5kh2Kuu/UhHzcZrGvf3GUrF2d+IXjkIXif5MR2iDWIfSqQuBW27/ejN/tmzJBRyPiryYTgbDIG6AZFJ4RW3yfw==} + peerDependencies: + javascript-time-ago: ^2.3.7 + react: '>=0.16.8' + react-dom: '>=0.16.8' + + react-zoom-pan-pinch@3.7.0: + resolution: {integrity: sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + react: '*' + react-dom: '*' + + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} + engines: {node: '>=0.10.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + relative-time-format@1.1.12: + resolution: {integrity: sha512-qaZBjmRIuXLfuLnzgqpFdBPa5W0euSX1tMnoMUHGPphLwJmrt8xbNiOIHrlvYOD6oNJ0M5owPCZyPibI8de5pQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.2: + resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} + engines: {node: '>=10'} + hasBin: true + + seroval-plugins@1.5.4: + resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.4: + resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + + tldts-core@7.4.2: + resolution: {integrity: sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==} + + tldts@7.4.2: + resolution: {integrity: sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==} + hasBin: true + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + engines: {node: '>=16'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript-eslint@8.60.1: + resolution: {integrity: sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + undici@7.27.2: + resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==} + engines: {node: '>=20.18.1'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + unplugin@3.0.0: + resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} + engines: {node: ^20.19.0 || >=22.12.0} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.1.8: + resolution: {integrity: sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.8 + '@vitest/browser-preview': 4.1.8 + '@vitest/browser-webdriverio': 4.1.8 + '@vitest/coverage-istanbul': 4.1.8 + '@vitest/coverage-v8': 4.1.8 + '@vitest/ui': 4.1.8 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + +snapshots: + + '@asamuzakjp/css-color@5.1.11': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@asamuzakjp/dom-selector@7.1.1': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + + '@asamuzakjp/generational-cache@1.0.1': {} + + '@asamuzakjp/nwsapi@2.3.9': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bcoe/v8-coverage@1.0.2': {} + + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.2 + + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 + + '@csstools/color-helpers@6.0.2': {} + + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-color-parser@4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.5(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1(jiti@2.7.0))': + dependencies: + eslint: 10.4.1(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.4.1(jiti@2.7.0))': + optionalDependencies: + eslint: 10.4.1(jiti@2.7.0) + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@exodus/bytes@1.15.1': {} + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@floating-ui/react@0.26.28(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@floating-ui/utils': 0.2.11 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tabbable: 6.4.0 + + '@floating-ui/utils@0.2.11': {} + + '@headlessui/react@2.2.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@react-aria/focus': 3.22.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@react-aria/interactions': 3.28.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-virtual': 3.14.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) + + '@heroicons/react@2.2.0(react@19.2.7)': + dependencies: + react: 19.2.7 + + '@hey-api/codegen-core@0.8.4(magicast@0.5.3)': + dependencies: + '@hey-api/types': 0.1.4 + ansi-colors: 4.1.3 + c12: 3.3.4(magicast@0.5.3) + color-support: 1.1.3 + transitivePeerDependencies: + - magicast + + '@hey-api/json-schema-ref-parser@1.4.3': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.1 + + '@hey-api/openapi-ts@0.98.1(magicast@0.5.3)(typescript@6.0.3)': + dependencies: + '@hey-api/codegen-core': 0.8.4(magicast@0.5.3) + '@hey-api/json-schema-ref-parser': 1.4.3 + '@hey-api/shared': 0.4.7(magicast@0.5.3) + '@hey-api/spec-types': 0.2.0 + '@hey-api/types': 0.1.4 + '@lukeed/ms': 2.0.2 + ansi-colors: 4.1.3 + color-support: 1.1.3 + commander: 14.0.3 + get-tsconfig: 4.14.0 + typescript: 6.0.3 + transitivePeerDependencies: + - magicast + + '@hey-api/shared@0.4.7(magicast@0.5.3)': + dependencies: + '@hey-api/codegen-core': 0.8.4(magicast@0.5.3) + '@hey-api/json-schema-ref-parser': 1.4.3 + '@hey-api/spec-types': 0.2.0 + '@hey-api/types': 0.1.4 + ansi-colors: 4.1.3 + cross-spawn: 7.0.6 + open: 11.0.0 + semver: 7.7.4 + transitivePeerDependencies: + - magicast + + '@hey-api/spec-types@0.2.0': + dependencies: + '@hey-api/types': 0.1.4 + + '@hey-api/types@0.1.4': {} + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@inquirer/ansi@1.0.2': {} + + '@inquirer/confirm@5.1.21': + dependencies: + '@inquirer/core': 10.3.2 + '@inquirer/type': 3.0.10 + + '@inquirer/core@10.3.2': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/type@3.0.10': {} + + '@internationalized/date@3.12.2': + dependencies: + '@swc/helpers': 0.5.23 + + '@internationalized/number@3.6.7': + dependencies: + '@swc/helpers': 0.5.23 + + '@internationalized/string@3.2.9': + dependencies: + '@swc/helpers': 0.5.23 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsdevtools/ono@7.1.3': {} + + '@lukeed/ms@2.0.2': {} + + '@mswjs/interceptors@0.37.6': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + + '@oxc-project/types@0.133.0': {} + + '@pkgr/core@0.3.6': {} + + '@react-aria/focus@3.22.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@swc/helpers': 0.5.23 + react: 19.2.7 + react-aria: 3.49.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-dom: 19.2.7(react@19.2.7) + + '@react-aria/interactions@3.28.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@react-types/shared': 3.35.0(react@19.2.7) + '@swc/helpers': 0.5.23 + react: 19.2.7 + react-aria: 3.49.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-dom: 19.2.7(react@19.2.7) + + '@react-types/shared@3.35.0(react@19.2.7)': + dependencies: + react: 19.2.7 + + '@rolldown/binding-android-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-x64@1.0.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@standard-schema/spec@1.1.0': {} + + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.23.0 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@8.0.16(jiti@2.7.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.16(jiti@2.7.0) + + '@tanstack/history@1.162.0': {} + + '@tanstack/query-core@5.75.0': {} + + '@tanstack/react-query@5.75.0(react@19.2.7)': + dependencies: + '@tanstack/query-core': 5.75.0 + react: 19.2.7 + + '@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/react-store': 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.13 + isbot: 5.1.41 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/react-store@0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/store': 0.9.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) + + '@tanstack/react-virtual@3.14.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/virtual-core': 3.17.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/router-core@1.171.13': + dependencies: + '@tanstack/history': 1.162.0 + cookie-es: 3.1.1 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) + + '@tanstack/router-generator@1.167.17': + dependencies: + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.13 + '@tanstack/router-utils': 1.162.2 + '@tanstack/virtual-file-routes': 1.162.0 + jiti: 2.7.0 + magic-string: 0.30.21 + prettier: 3.8.3 + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(jiti@2.7.0))': + dependencies: + '@babel/core': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.13 + '@tanstack/router-generator': 1.167.17 + '@tanstack/router-utils': 1.162.2 + chokidar: 5.0.0 + unplugin: 3.0.0 + zod: 4.4.3 + optionalDependencies: + '@tanstack/react-router': 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + vite: 8.0.16(jiti@2.7.0) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.162.2': + dependencies: + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + ansis: 4.3.1 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.4 + pathe: 2.0.3 + tinyglobby: 0.2.17 + transitivePeerDependencies: + - supports-color + + '@tanstack/store@0.9.3': {} + + '@tanstack/virtual-core@3.17.0': {} + + '@tanstack/virtual-file-routes@1.162.0': {} + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@testing-library/dom': 10.4.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/aria-query@5.0.4': {} + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/cookie@0.6.0': {} + + '@types/deep-eql@4.0.2': {} + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/js-yaml@4.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/react-dom@19.2.3(@types/react@19.2.17)': + dependencies: + '@types/react': 19.2.17 + + '@types/react@19.2.17': + dependencies: + csstype: 3.2.3 + + '@types/statuses@2.0.6': {} + + '@types/tough-cookie@4.0.5': {} + + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/type-utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 + eslint: 10.4.1(jiti@2.7.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.60.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.60.1': {} + + '@typescript-eslint/typescript-estree@8.60.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.60.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.2 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@6.0.2(vite@8.0.16(jiti@2.7.0))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.0.16(jiti@2.7.0) + + '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.1.8 + ast-v8-to-istanbul: 1.0.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.3 + obug: 2.1.2 + std-env: 4.1.0 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + + '@vitest/eslint-plugin@1.6.19(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + typescript: 6.0.3 + vitest: 4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@4.1.8': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.1.8(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0))': + dependencies: + '@vitest/spy': 4.1.8 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.7.5(typescript@6.0.3) + vite: 8.0.16(jiti@2.7.0) + + '@vitest/pretty-format@4.1.8': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.8': + dependencies: + '@vitest/utils': 4.1.8 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.8': + dependencies: + '@vitest/pretty-format': 4.1.8 + '@vitest/utils': 4.1.8 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.8': {} + + '@vitest/utils@4.1.8': + dependencies: + '@vitest/pretty-format': 4.1.8 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansis@4.3.1: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + autoprefixer@10.4.21(postcss@8.5.15): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001797 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.15 + postcss-value-parser: 4.2.0 + + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.34: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.34 + caniuse-lite: 1.0.30001797 + electron-to-chromium: 1.5.368 + node-releases: 2.0.47 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + c12@3.3.4(magicast@0.5.3): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.0.8 + giget: 3.2.0 + jiti: 2.7.0 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + optionalDependencies: + magicast: 0.5.3 + + caniuse-lite@1.0.30001797: {} + + chai@6.2.2: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + commander@14.0.3: {} + + confbox@0.2.4: {} + + convert-source-map@2.0.0: {} + + cookie-es@3.1.1: {} + + cookie@0.7.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + csstype@3.2.3: {} + + data-urls@7.0.0: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + deep-is@0.1.4: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + defu@6.1.7: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: {} + + diff@8.0.4: {} + + dom-accessibility-api@0.5.16: {} + + dotenv@17.4.2: {} + + electron-to-chromium@1.5.368: {} + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.23.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@8.0.0: {} + + es-module-lexer@2.1.0: {} + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)): + dependencies: + eslint: 10.4.1(jiti@2.7.0) + + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(prettier@3.8.3): + dependencies: + eslint: 10.4.1(jiti@2.7.0) + prettier: 3.8.3 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.13 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@10.4.1(jiti@2.7.0)) + + eslint-plugin-react-hooks@7.1.1(eslint@10.4.1(jiti@2.7.0)): + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + eslint: 10.4.1(jiti@2.7.0) + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.5.2(eslint@10.4.1(jiti@2.7.0)): + dependencies: + eslint: 10.4.1(jiti@2.7.0) + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.4.1(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + esutils@2.0.3: {} + + events@3.3.0: {} + + expect-type@1.3.0: {} + + exsolve@1.0.8: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + fraction.js@4.3.7: {} + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + giget@3.2.0: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@17.6.0: {} + + graceful-fs@4.2.11: {} + + graphology-types@0.24.8: {} + + graphology@0.26.0(graphology-types@0.24.8): + dependencies: + events: 3.3.0 + graphology-types: 0.24.8 + + graphql@16.14.1: {} + + has-flag@4.0.0: {} + + headers-polyfill@4.0.3: {} + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.15.1 + transitivePeerDependencies: + - '@noble/hashes' + + html-escaper@2.0.2: {} + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-node-process@1.2.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isbot@5.1.41: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + javascript-time-ago@2.5.11: + dependencies: + relative-time-format: 1.1.12 + + jiti@2.7.0: {} + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsdom@29.1.1: + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.5(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 + css-tree: 3.2.1 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.1 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.1 + undici: 7.27.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@11.5.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lz-string@1.5.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.2 + + mdn-data@2.27.1: {} + + memoize-one@6.0.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + ms@2.1.3: {} + + msw@2.7.5(typescript@6.0.3): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.21 + '@mswjs/interceptors': 0.37.6 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 + graphql: 16.14.1 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.41.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - '@types/node' + + mute-stream@2.0.0: {} + + nanoid@3.3.12: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.47: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + obug@2.1.2: {} + + ohash@2.0.11: {} + + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + outvariant@1.4.3: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parse5@8.0.1: + dependencies: + entities: 8.0.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-to-regexp@6.3.0: {} + + pathe@2.0.3: {} + + perfect-debounce@2.1.0: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.0.8 + pathe: 2.0.3 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + powershell-utils@0.1.0: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@3.8.3: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + querystringify@2.2.0: {} + + raf@3.4.1: + dependencies: + performance-now: 2.1.0 + + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + + react-aria@3.49.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + '@internationalized/date': 3.12.2 + '@internationalized/number': 3.6.7 + '@internationalized/string': 3.2.9 + '@react-types/shared': 3.35.0(react@19.2.7) + '@swc/helpers': 0.5.23 + aria-hidden: 1.2.6 + clsx: 2.1.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-stately: 3.47.0(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) + + react-dom@19.2.7(react@19.2.7): + dependencies: + react: 19.2.7 + scheduler: 0.27.0 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-stately@3.47.0(react@19.2.7): + dependencies: + '@internationalized/date': 3.12.2 + '@internationalized/number': 3.6.7 + '@internationalized/string': 3.2.9 + '@react-types/shared': 3.35.0(react@19.2.7) + '@swc/helpers': 0.5.23 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) + + react-time-ago@7.3.3(javascript-time-ago@2.5.11)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + javascript-time-ago: 2.5.11 + memoize-one: 6.0.0 + prop-types: 15.8.1 + raf: 3.4.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + react-zoom-pan-pinch@3.7.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + react@19.2.7: {} + + readdirp@5.0.0: {} + + relative-time-format@1.1.12: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + rolldown@1.0.3: + dependencies: + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 + + run-applescript@7.1.0: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.7.4: {} + + semver@7.8.2: {} + + seroval-plugins@1.5.4(seroval@1.5.4): + dependencies: + seroval: 1.5.4 + + seroval@1.5.4: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + statuses@2.0.2: {} + + std-env@4.1.0: {} + + strict-event-emitter@0.5.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + symbol-tree@3.2.4: {} + + synckit@0.11.13: + dependencies: + '@pkgr/core': 0.3.6 + + tabbable@6.4.0: {} + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tinybench@2.9.0: {} + + tinyexec@1.2.4: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyrainbow@3.1.0: {} + + tldts-core@7.4.2: {} + + tldts@7.4.2: + dependencies: + tldts-core: 7.4.2 + + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tough-cookie@6.0.1: + dependencies: + tldts: 7.4.2 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@4.41.0: {} + + typescript-eslint@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + typescript@6.0.3: {} + + undici@7.27.2: {} + + universalify@0.2.0: {} + + unplugin@3.0.0: + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + + vite@8.0.16(jiti@2.7.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.7.0 + + vitest@4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)): + dependencies: + '@vitest/expect': 4.1.8 + '@vitest/mocker': 4.1.8(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + '@vitest/pretty-format': 4.1.8 + '@vitest/runner': 4.1.8 + '@vitest/snapshot': 4.1.8 + '@vitest/spy': 4.1.8 + '@vitest/utils': 4.1.8 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.2 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.0.16(jiti@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + jsdom: 29.1.1 + transitivePeerDependencies: + - msw + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@8.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-mimetype@5.0.0: {} + + whatwg-url@16.0.1: + dependencies: + '@exodus/bytes': 1.15.1 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.3: {} + + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} diff --git a/web/src/App.tsx b/web/src/App.tsx index cafde38..864a519 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,5 +1,6 @@ import { useMemo } from 'react'; +import ClearTimeParam from '@components/ClearTimeParam'; import Loading from '@components/Loading'; import { ValueProps } from '@contexts/ethereum'; import { useSpecQuery, useNowQuery } from '@hooks/useQuery'; @@ -22,7 +23,12 @@ export default function App({ byo?: boolean; }) { const { data, isLoading, error } = useSpecQuery(); - const { data: dataNow, isLoading: isLoadingNow, error: errorNow } = useNowQuery(); + const { + data: dataNow, + isLoading: isLoadingNow, + error: errorNow, + errorUpdatedAt: errorNowAt, + } = useNowQuery(); const formattedData = useMemo(() => { if (!data?.spec) return undefined; @@ -57,15 +63,16 @@ export default function App({ ]; } - // worst case when failing to get server now, just use the current local time - return [errorNow ? Date.now() : undefined, true]; - }, [formattedData, dataNow, errorNow]); + // worst case when failing to get server now, just use the local time at + // which the fetch failed (kept pure: no clock reads during render) + return [errorNow ? errorNowAt : undefined, true]; + }, [formattedData, dataNow, errorNow, errorNowAt]); if (isLoading || error || !formattedData || !initialTime || isLoadingNow) return ( -
+
+
diff --git a/web/src/ErrorBoundary.tsx b/web/src/ErrorBoundary.tsx index eb8447f..479ec71 100644 --- a/web/src/ErrorBoundary.tsx +++ b/web/src/ErrorBoundary.tsx @@ -27,9 +27,9 @@ class ErrorBoundary extends Component { public render() { if (this.state.hasError) { return ( -
+
-

Uhh... Something went wrong

+

Uhh... Something went wrong

); } diff --git a/web/src/NotFound.tsx b/web/src/NotFound.tsx index d6ad468..e9c9e46 100644 --- a/web/src/NotFound.tsx +++ b/web/src/NotFound.tsx @@ -2,9 +2,9 @@ import Logo from '@assets/forky_logo.png'; export default function NotFound() { return ( -
+
-

Page not found

+

Page not found

); } diff --git a/web/src/api/@tanstack/react-query.gen.ts b/web/src/api/@tanstack/react-query.gen.ts new file mode 100644 index 0000000..273c2ec --- /dev/null +++ b/web/src/api/@tanstack/react-query.gen.ts @@ -0,0 +1,261 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { queryOptions, type UseMutationOptions } from '@tanstack/react-query'; + +import { client } from '../client.gen'; +import { + getEthereumNow, + getEthereumSpec, + getFrame, + listMetadata, + listMetadataEpochs, + listMetadataLabels, + listMetadataNodes, + listMetadataSlots, + type Options, +} from '../sdk.gen'; +import type { + GetEthereumNowData, + GetEthereumNowError, + GetEthereumNowResponse, + GetEthereumSpecData, + GetEthereumSpecError, + GetEthereumSpecResponse, + GetFrameData, + GetFrameError, + GetFrameResponse, + ListMetadataData, + ListMetadataEpochsData, + ListMetadataEpochsError, + ListMetadataEpochsResponse, + ListMetadataError, + ListMetadataLabelsData, + ListMetadataLabelsError, + ListMetadataLabelsResponse, + ListMetadataNodesData, + ListMetadataNodesError, + ListMetadataNodesResponse, + ListMetadataResponse, + ListMetadataSlotsData, + ListMetadataSlotsError, + ListMetadataSlotsResponse, +} from '../types.gen'; + +export type QueryKey = [ + Pick & { + _id: string; + _infinite?: boolean; + tags?: ReadonlyArray; + }, +]; + +const createQueryKey = ( + id: string, + options?: TOptions, + infinite?: boolean, + tags?: ReadonlyArray +): [QueryKey[0]] => { + const params: QueryKey[0] = { + _id: id, + baseUrl: options?.baseUrl || (options?.client ?? client).getConfig().baseUrl, + } as QueryKey[0]; + if (infinite) { + params._infinite = infinite; + } + if (tags) { + params.tags = tags; + } + if (options?.body) { + params.body = options.body; + } + if (options?.headers) { + params.headers = options.headers; + } + if (options?.path) { + params.path = options.path; + } + if (options?.query) { + params.query = options.query; + } + return [params]; +}; + +export const getEthereumNowQueryKey = (options?: Options) => + createQueryKey('getEthereumNow', options); + +/** + * Get the current wall-clock slot and epoch + */ +export const getEthereumNowOptions = (options?: Options) => + queryOptions< + GetEthereumNowResponse, + GetEthereumNowError, + GetEthereumNowResponse, + ReturnType + >({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getEthereumNow({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getEthereumNowQueryKey(options), + }); + +export const getEthereumSpecQueryKey = (options?: Options) => + createQueryKey('getEthereumSpec', options); + +/** + * Get the Ethereum network name and spec + */ +export const getEthereumSpecOptions = (options?: Options) => + queryOptions< + GetEthereumSpecResponse, + GetEthereumSpecError, + GetEthereumSpecResponse, + ReturnType + >({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getEthereumSpec({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getEthereumSpecQueryKey(options), + }); + +export const getFrameQueryKey = (options: Options) => createQueryKey('getFrame', options); + +/** + * Get a single fork-choice frame by ID + */ +export const getFrameOptions = (options: Options) => + queryOptions>({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getFrame({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getFrameQueryKey(options), + }); + +/** + * List fork-choice frame metadata + */ +export const listMetadataMutation = ( + options?: Partial> +): UseMutationOptions> => { + const mutationOptions: UseMutationOptions> = { + mutationFn: async fnOptions => { + const { data } = await listMetadata({ + ...options, + ...fnOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; + +/** + * List distinct nodes across stored frames + */ +export const listMetadataNodesMutation = ( + options?: Partial> +): UseMutationOptions> => { + const mutationOptions: UseMutationOptions< + ListMetadataNodesResponse, + ListMetadataNodesError, + Options + > = { + mutationFn: async fnOptions => { + const { data } = await listMetadataNodes({ + ...options, + ...fnOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; + +/** + * List distinct slots across stored frames + */ +export const listMetadataSlotsMutation = ( + options?: Partial> +): UseMutationOptions> => { + const mutationOptions: UseMutationOptions< + ListMetadataSlotsResponse, + ListMetadataSlotsError, + Options + > = { + mutationFn: async fnOptions => { + const { data } = await listMetadataSlots({ + ...options, + ...fnOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; + +/** + * List distinct epochs across stored frames + */ +export const listMetadataEpochsMutation = ( + options?: Partial> +): UseMutationOptions> => { + const mutationOptions: UseMutationOptions< + ListMetadataEpochsResponse, + ListMetadataEpochsError, + Options + > = { + mutationFn: async fnOptions => { + const { data } = await listMetadataEpochs({ + ...options, + ...fnOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; + +/** + * List distinct labels across stored frames + */ +export const listMetadataLabelsMutation = ( + options?: Partial> +): UseMutationOptions> => { + const mutationOptions: UseMutationOptions< + ListMetadataLabelsResponse, + ListMetadataLabelsError, + Options + > = { + mutationFn: async fnOptions => { + const { data } = await listMetadataLabels({ + ...options, + ...fnOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; diff --git a/web/src/api/client.gen.ts b/web/src/api/client.gen.ts new file mode 100644 index 0000000..7e3dfef --- /dev/null +++ b/web/src/api/client.gen.ts @@ -0,0 +1,22 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { createClientConfig } from '../utils/api-config.ts'; + +import { type Client, type ClientOptions, type Config, createClient, createConfig } from './client'; +import type { ClientOptions as ClientOptions2 } from './types.gen'; + +/** + * The `createClientConfig()` function will be called on client initialization + * and the returned object will become the client's initial configuration. + * + * You may want to initialize your client this way instead of calling + * `setConfig()`. This is useful for example if you're using Next.js + * to ensure your client always has the correct values. + */ +export type CreateClientConfig = ( + override?: Config +) => Config & T>; + +export const client: Client = createClient( + createClientConfig(createConfig({ baseUrl: 'https://forky.mainnet.ethpandaops.io' })) +); diff --git a/web/src/api/client/client.gen.ts b/web/src/api/client/client.gen.ts new file mode 100644 index 0000000..86e62d0 --- /dev/null +++ b/web/src/api/client/client.gen.ts @@ -0,0 +1,273 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { createSseClient } from '../core/serverSentEvents.gen'; +import type { HttpMethod } from '../core/types.gen'; +import { getValidRequestBody } from '../core/utils.gen'; +import type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen'; +import { + buildUrl, + createConfig, + createInterceptors, + getParseAs, + mergeConfigs, + mergeHeaders, + setAuthParams, +} from './utils.gen'; + +type ReqInit = Omit & { + body?: any; + headers: ReturnType; +}; + +export const createClient = (config: Config = {}): Client => { + let _config = mergeConfigs(createConfig(), config); + + const getConfig = (): Config => ({ ..._config }); + + const setConfig = (config: Config): Config => { + _config = mergeConfigs(_config, config); + return getConfig(); + }; + + const interceptors = createInterceptors(); + + const beforeRequest = async < + TData = unknown, + TResponseStyle extends 'data' | 'fields' = 'fields', + ThrowOnError extends boolean = boolean, + Url extends string = string, + >( + options: RequestOptions + ) => { + const opts = { + ..._config, + ...options, + fetch: options.fetch ?? _config.fetch ?? globalThis.fetch, + headers: mergeHeaders(_config.headers, options.headers), + serializedBody: undefined as string | undefined, + }; + + if (opts.security) { + await setAuthParams(opts); + } + + if (opts.requestValidator) { + await opts.requestValidator(opts); + } + + if (opts.body !== undefined && opts.bodySerializer) { + opts.serializedBody = opts.bodySerializer(opts.body) as string | undefined; + } + + // remove Content-Type header if body is empty to avoid sending invalid requests + if (opts.body === undefined || opts.serializedBody === '') { + opts.headers.delete('Content-Type'); + } + + const resolvedOpts = opts as typeof opts & ResolvedRequestOptions; + const url = buildUrl(resolvedOpts); + + return { opts: resolvedOpts, url }; + }; + + const request: Client['request'] = async options => { + const throwOnError = options.throwOnError ?? _config.throwOnError; + const responseStyle = options.responseStyle ?? _config.responseStyle; + + let request: Request | undefined; + let response: Response | undefined; + + try { + const { opts, url } = await beforeRequest(options); + const requestInit: ReqInit = { + redirect: 'follow', + ...opts, + body: getValidRequestBody(opts), + }; + + request = new Request(url, requestInit); + + for (const fn of interceptors.request.fns) { + if (fn) { + request = await fn(request, opts); + } + } + + // fetch must be assigned here, otherwise it would throw the error: + // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation + const _fetch = opts.fetch!; + + response = await _fetch(request); + + for (const fn of interceptors.response.fns) { + if (fn) { + response = await fn(response, request, opts); + } + } + + const result = { + request, + response, + }; + + if (response.ok) { + const parseAs = + (opts.parseAs === 'auto' ? getParseAs(response.headers.get('Content-Type')) : opts.parseAs) ?? 'json'; + + if (response.status === 204 || response.headers.get('Content-Length') === '0') { + let emptyData: any; + switch (parseAs) { + case 'arrayBuffer': + case 'blob': + case 'text': + emptyData = await response[parseAs](); + break; + case 'formData': + emptyData = new FormData(); + break; + case 'stream': + emptyData = response.body; + break; + case 'json': + default: + emptyData = {}; + break; + } + return opts.responseStyle === 'data' + ? emptyData + : { + data: emptyData, + ...result, + }; + } + + let data: any; + switch (parseAs) { + case 'arrayBuffer': + case 'blob': + case 'formData': + case 'text': + data = await response[parseAs](); + break; + case 'json': { + // Some servers return 200 with no Content-Length and empty body. + // response.json() would throw; read as text and parse if non-empty. + const text = await response.text(); + data = text ? JSON.parse(text) : {}; + break; + } + case 'stream': + return opts.responseStyle === 'data' + ? response.body + : { + data: response.body, + ...result, + }; + } + + if (parseAs === 'json') { + if (opts.responseValidator) { + await opts.responseValidator(data); + } + + if (opts.responseTransformer) { + data = await opts.responseTransformer(data); + } + } + + return opts.responseStyle === 'data' + ? data + : { + data, + ...result, + }; + } + + const textError = await response.text(); + let jsonError: unknown; + + try { + jsonError = JSON.parse(textError); + } catch { + // noop + } + + throw jsonError ?? textError; + } catch (error) { + let finalError = error; + + for (const fn of interceptors.error.fns) { + if (fn) { + finalError = await fn(finalError, response, request, options as ResolvedRequestOptions); + } + } + + finalError = finalError || {}; + + if (throwOnError) { + throw finalError; + } + + // TODO: we probably want to return error and improve types + return responseStyle === 'data' + ? undefined + : { + error: finalError, + request, + response, + }; + } + }; + + const makeMethodFn = (method: Uppercase) => (options: RequestOptions) => request({ ...options, method }); + + const makeSseFn = (method: Uppercase) => async (options: RequestOptions) => { + const { opts, url } = await beforeRequest(options); + return createSseClient({ + ...opts, + body: opts.body as BodyInit | null | undefined, + method, + onRequest: async (url, init) => { + let request = new Request(url, init); + for (const fn of interceptors.request.fns) { + if (fn) { + request = await fn(request, opts); + } + } + return request; + }, + serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined, + url, + }); + }; + + const _buildUrl: Client['buildUrl'] = options => buildUrl({ ..._config, ...options }); + + return { + buildUrl: _buildUrl, + connect: makeMethodFn('CONNECT'), + delete: makeMethodFn('DELETE'), + get: makeMethodFn('GET'), + getConfig, + head: makeMethodFn('HEAD'), + interceptors, + options: makeMethodFn('OPTIONS'), + patch: makeMethodFn('PATCH'), + post: makeMethodFn('POST'), + put: makeMethodFn('PUT'), + request, + setConfig, + sse: { + connect: makeSseFn('CONNECT'), + delete: makeSseFn('DELETE'), + get: makeSseFn('GET'), + head: makeSseFn('HEAD'), + options: makeSseFn('OPTIONS'), + patch: makeSseFn('PATCH'), + post: makeSseFn('POST'), + put: makeSseFn('PUT'), + trace: makeSseFn('TRACE'), + }, + trace: makeMethodFn('TRACE'), + } as Client; +}; diff --git a/web/src/api/client/index.ts b/web/src/api/client/index.ts new file mode 100644 index 0000000..3c62a27 --- /dev/null +++ b/web/src/api/client/index.ts @@ -0,0 +1,22 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { Auth } from '../core/auth.gen'; +export type { QuerySerializerOptions } from '../core/bodySerializer.gen'; +export { formDataBodySerializer, jsonBodySerializer, urlSearchParamsBodySerializer } from '../core/bodySerializer.gen'; +export { buildClientParams } from '../core/params.gen'; +export { serializeQueryKeyValue } from '../core/queryKeySerializer.gen'; +export type { ServerSentEventsResult } from '../core/serverSentEvents.gen'; +export { createClient } from './client.gen'; +export type { + Client, + ClientOptions, + Config, + CreateClientConfig, + Options, + RequestOptions, + RequestResult, + ResolvedRequestOptions, + ResponseStyle, + TDataShape, +} from './types.gen'; +export { createConfig, mergeHeaders } from './utils.gen'; diff --git a/web/src/api/client/types.gen.ts b/web/src/api/client/types.gen.ts new file mode 100644 index 0000000..7973dd7 --- /dev/null +++ b/web/src/api/client/types.gen.ts @@ -0,0 +1,207 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Auth } from '../core/auth.gen'; +import type { ServerSentEventsOptions, ServerSentEventsResult } from '../core/serverSentEvents.gen'; +import type { Client as CoreClient, Config as CoreConfig } from '../core/types.gen'; +import type { Middleware } from './utils.gen'; + +export type ResponseStyle = 'data' | 'fields'; + +export interface Config + extends Omit, CoreConfig { + /** + * Base URL for all requests made by this client. + */ + baseUrl?: T['baseUrl']; + /** + * Fetch API implementation. You can use this option to provide a custom + * fetch instance. + * + * @default globalThis.fetch + */ + fetch?: typeof fetch; + /** + * Please don't use the Fetch client for Next.js applications. The `next` + * options won't have any effect. + * + * Install {@link https://www.npmjs.com/package/@hey-api/client-next `@hey-api/client-next`} instead. + */ + next?: never; + /** + * Return the response data parsed in a specified format. By default, `auto` + * will infer the appropriate method from the `Content-Type` response header. + * You can override this behavior with any of the {@link Body} methods. + * Select `stream` if you don't want to parse response data at all. + * + * @default 'auto' + */ + parseAs?: 'arrayBuffer' | 'auto' | 'blob' | 'formData' | 'json' | 'stream' | 'text'; + /** + * Should we return only data or multiple fields (data, error, response, etc.)? + * + * @default 'fields' + */ + responseStyle?: ResponseStyle; + /** + * Throw an error instead of returning it in the response? + * + * @default false + */ + throwOnError?: T['throwOnError']; +} + +export interface RequestOptions< + TData = unknown, + TResponseStyle extends ResponseStyle = 'fields', + ThrowOnError extends boolean = boolean, + Url extends string = string, +> + extends + Config<{ + responseStyle: TResponseStyle; + throwOnError: ThrowOnError; + }>, + Pick< + ServerSentEventsOptions, + 'onRequest' | 'onSseError' | 'onSseEvent' | 'sseDefaultRetryDelay' | 'sseMaxRetryAttempts' | 'sseMaxRetryDelay' + > { + /** + * Any body that you want to add to your request. + * + * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} + */ + body?: unknown; + path?: Record; + query?: Record; + /** + * Security mechanism(s) to use for the request. + */ + security?: ReadonlyArray; + url: Url; +} + +export interface ResolvedRequestOptions< + TResponseStyle extends ResponseStyle = 'fields', + ThrowOnError extends boolean = boolean, + Url extends string = string, +> extends RequestOptions { + headers: Headers; + serializedBody?: string; +} + +export type RequestResult< + TData = unknown, + TError = unknown, + ThrowOnError extends boolean = boolean, + TResponseStyle extends ResponseStyle = 'fields', +> = ThrowOnError extends true + ? Promise< + TResponseStyle extends 'data' + ? TData extends Record + ? TData[keyof TData] + : TData + : { + data: TData extends Record ? TData[keyof TData] : TData; + request: Request; + response: Response; + } + > + : Promise< + TResponseStyle extends 'data' + ? (TData extends Record ? TData[keyof TData] : TData) | undefined + : ( + | { + data: TData extends Record ? TData[keyof TData] : TData; + error: undefined; + } + | { + data: undefined; + error: TError extends Record ? TError[keyof TError] : TError; + } + ) & { + /** request may be undefined, because error may be from building the request object itself */ + request?: Request; + /** response may be undefined, because error may be from building the request object itself or from a network error */ + response?: Response; + } + >; + +export interface ClientOptions { + baseUrl?: string; + responseStyle?: ResponseStyle; + throwOnError?: boolean; +} + +type MethodFn = < + TData = unknown, + TError = unknown, + ThrowOnError extends boolean = false, + TResponseStyle extends ResponseStyle = 'fields', +>( + options: Omit, 'method'> +) => RequestResult; + +type SseFn = < + TData = unknown, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _TError = unknown, + ThrowOnError extends boolean = false, + TResponseStyle extends ResponseStyle = 'fields', +>( + options: Omit, 'method'> +) => Promise>; + +type RequestFn = < + TData = unknown, + TError = unknown, + ThrowOnError extends boolean = false, + TResponseStyle extends ResponseStyle = 'fields', +>( + options: Omit, 'method'> & + Pick>, 'method'> +) => RequestResult; + +type BuildUrlFn = < + TData extends { + body?: unknown; + path?: Record; + query?: Record; + url: string; + }, +>( + options: TData & Options +) => string; + +export type Client = CoreClient & { + interceptors: Middleware; +}; + +/** + * The `createClientConfig()` function will be called on client initialization + * and the returned object will become the client's initial configuration. + * + * You may want to initialize your client this way instead of calling + * `setConfig()`. This is useful for example if you're using Next.js + * to ensure your client always has the correct values. + */ +export type CreateClientConfig = ( + override?: Config +) => Config & T>; + +export interface TDataShape { + body?: unknown; + headers?: unknown; + path?: unknown; + query?: unknown; + url: string; +} + +type OmitKeys = Pick>; + +export type Options< + TData extends TDataShape = TDataShape, + ThrowOnError extends boolean = boolean, + TResponse = unknown, + TResponseStyle extends ResponseStyle = 'fields', +> = OmitKeys, 'body' | 'path' | 'query' | 'url'> & + ([TData] extends [never] ? unknown : Omit); diff --git a/web/src/api/client/utils.gen.ts b/web/src/api/client/utils.gen.ts new file mode 100644 index 0000000..c84bd56 --- /dev/null +++ b/web/src/api/client/utils.gen.ts @@ -0,0 +1,291 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { getAuthToken } from '../core/auth.gen'; +import type { QuerySerializerOptions } from '../core/bodySerializer.gen'; +import { jsonBodySerializer } from '../core/bodySerializer.gen'; +import { serializeArrayParam, serializeObjectParam, serializePrimitiveParam } from '../core/pathSerializer.gen'; +import { getUrl } from '../core/utils.gen'; +import type { Client, ClientOptions, Config, RequestOptions } from './types.gen'; + +export const createQuerySerializer = ({ parameters = {}, ...args }: QuerySerializerOptions = {}): (( + queryParams: T +) => string) => { + const querySerializer = (queryParams: T): string => { + const search: string[] = []; + if (queryParams && typeof queryParams === 'object') { + for (const name in queryParams) { + const value = queryParams[name]; + + if (value === undefined || value === null) { + continue; + } + + const options = parameters[name] || args; + + if (Array.isArray(value)) { + const serializedArray = serializeArrayParam({ + allowReserved: options.allowReserved, + explode: true, + name, + style: 'form', + value, + ...options.array, + }); + if (serializedArray) search.push(serializedArray); + } else if (typeof value === 'object') { + const serializedObject = serializeObjectParam({ + allowReserved: options.allowReserved, + explode: true, + name, + style: 'deepObject', + value: value as Record, + ...options.object, + }); + if (serializedObject) search.push(serializedObject); + } else { + const serializedPrimitive = serializePrimitiveParam({ + allowReserved: options.allowReserved, + name, + value: value as string, + }); + if (serializedPrimitive) search.push(serializedPrimitive); + } + } + } + return search.join('&'); + }; + return querySerializer; +}; + +/** + * Infers parseAs value from provided Content-Type header. + */ +export const getParseAs = (contentType: string | null): Exclude => { + if (!contentType) { + // If no Content-Type header is provided, the best we can do is return the raw response body, + // which is effectively the same as the 'stream' option. + return 'stream'; + } + + const cleanContent = contentType.split(';')[0]?.trim(); + + if (!cleanContent) { + return; + } + + if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) { + return 'json'; + } + + if (cleanContent === 'multipart/form-data') { + return 'formData'; + } + + if (['application/', 'audio/', 'image/', 'video/'].some(type => cleanContent.startsWith(type))) { + return 'blob'; + } + + if (cleanContent.startsWith('text/')) { + return 'text'; + } + + return; +}; + +const checkForExistence = ( + options: Pick & { + headers: Headers; + }, + name?: string +): boolean => { + if (!name) { + return false; + } + if (options.headers.has(name) || options.query?.[name] || options.headers.get('Cookie')?.includes(`${name}=`)) { + return true; + } + return false; +}; + +export async function setAuthParams( + options: Pick & { + headers: Headers; + } +): Promise { + for (const auth of options.security ?? []) { + if (checkForExistence(options, auth.name)) { + continue; + } + + const token = await getAuthToken(auth, options.auth); + + if (!token) { + continue; + } + + const name = auth.name ?? 'Authorization'; + + switch (auth.in) { + case 'query': + if (!options.query) { + options.query = {}; + } + options.query[name] = token; + break; + case 'cookie': + options.headers.append('Cookie', `${name}=${token}`); + break; + case 'header': + default: + options.headers.set(name, token); + break; + } + } +} + +export const buildUrl: Client['buildUrl'] = options => + getUrl({ + baseUrl: options.baseUrl as string, + path: options.path, + query: options.query, + querySerializer: + typeof options.querySerializer === 'function' + ? options.querySerializer + : createQuerySerializer(options.querySerializer), + url: options.url, + }); + +export const mergeConfigs = (a: Config, b: Config): Config => { + const config = { ...a, ...b }; + if (config.baseUrl?.endsWith('/')) { + config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1); + } + config.headers = mergeHeaders(a.headers, b.headers); + return config; +}; + +const headersEntries = (headers: Headers): Array<[string, string]> => { + const entries: Array<[string, string]> = []; + headers.forEach((value, key) => { + entries.push([key, value]); + }); + return entries; +}; + +export const mergeHeaders = (...headers: Array['headers'] | undefined>): Headers => { + const mergedHeaders = new Headers(); + for (const header of headers) { + if (!header) { + continue; + } + + const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header); + + for (const [key, value] of iterator) { + if (value === null) { + mergedHeaders.delete(key); + } else if (Array.isArray(value)) { + for (const v of value) { + mergedHeaders.append(key, v as string); + } + } else if (value !== undefined) { + // assume object headers are meant to be JSON stringified, i.e., their + // content value in OpenAPI specification is 'application/json' + mergedHeaders.set(key, typeof value === 'object' ? JSON.stringify(value) : (value as string)); + } + } + } + return mergedHeaders; +}; + +type ErrInterceptor = ( + error: Err, + /** response may be undefined due to a network error where no response object is produced */ + response: Res | undefined, + /** request may be undefined, because error may be from building the request object itself */ + request: Req | undefined, + options: Options +) => Err | Promise; + +type ReqInterceptor = (request: Req, options: Options) => Req | Promise; + +type ResInterceptor = (response: Res, request: Req, options: Options) => Res | Promise; + +class Interceptors { + fns: Array = []; + + clear(): void { + this.fns = []; + } + + eject(id: number | Interceptor): void { + const index = this.getInterceptorIndex(id); + if (this.fns[index]) { + this.fns[index] = null; + } + } + + exists(id: number | Interceptor): boolean { + const index = this.getInterceptorIndex(id); + return Boolean(this.fns[index]); + } + + getInterceptorIndex(id: number | Interceptor): number { + if (typeof id === 'number') { + return this.fns[id] ? id : -1; + } + return this.fns.indexOf(id); + } + + update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false { + const index = this.getInterceptorIndex(id); + if (this.fns[index]) { + this.fns[index] = fn; + return id; + } + return false; + } + + use(fn: Interceptor): number { + this.fns.push(fn); + return this.fns.length - 1; + } +} + +export interface Middleware { + error: Interceptors>; + request: Interceptors>; + response: Interceptors>; +} + +export const createInterceptors = (): Middleware => ({ + error: new Interceptors>(), + request: new Interceptors>(), + response: new Interceptors>(), +}); + +const defaultQuerySerializer = createQuerySerializer({ + allowReserved: false, + array: { + explode: true, + style: 'form', + }, + object: { + explode: true, + style: 'deepObject', + }, +}); + +const defaultHeaders = { + 'Content-Type': 'application/json', +}; + +export const createConfig = ( + override: Config & T> = {} +): Config & T> => ({ + ...jsonBodySerializer, + headers: defaultHeaders, + parseAs: 'auto', + querySerializer: defaultQuerySerializer, + ...override, +}); diff --git a/web/src/api/core/auth.gen.ts b/web/src/api/core/auth.gen.ts new file mode 100644 index 0000000..60ab7bf --- /dev/null +++ b/web/src/api/core/auth.gen.ts @@ -0,0 +1,48 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type AuthToken = string | undefined; + +export interface Auth { + /** + * Which part of the request do we use to send the auth? + * + * @default 'header' + */ + in?: 'header' | 'query' | 'cookie'; + /** + * A unique identifier for the security scheme. + * + * Defined only when there are multiple security schemes whose `Auth` + * shape would otherwise be identical. + */ + key?: string; + /** + * Header or query parameter name. + * + * @default 'Authorization' + */ + name?: string; + scheme?: 'basic' | 'bearer'; + type: 'apiKey' | 'http'; +} + +export const getAuthToken = async ( + auth: Auth, + callback: ((auth: Auth) => Promise | AuthToken) | AuthToken +): Promise => { + const token = typeof callback === 'function' ? await callback(auth) : callback; + + if (!token) { + return; + } + + if (auth.scheme === 'bearer') { + return `Bearer ${token}`; + } + + if (auth.scheme === 'basic') { + return `Basic ${btoa(token)}`; + } + + return token; +}; diff --git a/web/src/api/core/bodySerializer.gen.ts b/web/src/api/core/bodySerializer.gen.ts new file mode 100644 index 0000000..e19927f --- /dev/null +++ b/web/src/api/core/bodySerializer.gen.ts @@ -0,0 +1,82 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen'; + +export type QuerySerializer = (query: Record) => string; + +export type BodySerializer = (body: unknown) => unknown; + +type QuerySerializerOptionsObject = { + allowReserved?: boolean; + array?: Partial>; + object?: Partial>; +}; + +export type QuerySerializerOptions = QuerySerializerOptionsObject & { + /** + * Per-parameter serialization overrides. When provided, these settings + * override the global array/object settings for specific parameter names. + */ + parameters?: Record; +}; + +const serializeFormDataPair = (data: FormData, key: string, value: unknown): void => { + if (typeof value === 'string' || value instanceof Blob) { + data.append(key, value); + } else if (value instanceof Date) { + data.append(key, value.toISOString()); + } else { + data.append(key, JSON.stringify(value)); + } +}; + +const serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => { + if (typeof value === 'string') { + data.append(key, value); + } else { + data.append(key, JSON.stringify(value)); + } +}; + +export const formDataBodySerializer = { + bodySerializer: (body: unknown): FormData => { + const data = new FormData(); + + Object.entries(body as Record).forEach(([key, value]) => { + if (value === undefined || value === null) { + return; + } + if (Array.isArray(value)) { + value.forEach(v => serializeFormDataPair(data, key, v)); + } else { + serializeFormDataPair(data, key, value); + } + }); + + return data; + }, +}; + +export const jsonBodySerializer = { + bodySerializer: (body: unknown): string => + JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)), +}; + +export const urlSearchParamsBodySerializer = { + bodySerializer: (body: unknown): string => { + const data = new URLSearchParams(); + + Object.entries(body as Record).forEach(([key, value]) => { + if (value === undefined || value === null) { + return; + } + if (Array.isArray(value)) { + value.forEach(v => serializeUrlSearchParamsPair(data, key, v)); + } else { + serializeUrlSearchParamsPair(data, key, value); + } + }); + + return data.toString(); + }, +}; diff --git a/web/src/api/core/params.gen.ts b/web/src/api/core/params.gen.ts new file mode 100644 index 0000000..0f50047 --- /dev/null +++ b/web/src/api/core/params.gen.ts @@ -0,0 +1,171 @@ +// This file is auto-generated by @hey-api/openapi-ts + +type Slot = 'body' | 'headers' | 'path' | 'query'; + +export type Field = + | { + in: Exclude; + /** + * Field name. This is the name we want the user to see and use. + */ + key: string; + /** + * Field mapped name. This is the name we want to use in the request. + * If omitted, we use the same value as `key`. + */ + map?: string; + } + | { + in: Extract; + /** + * Key isn't required for bodies. + */ + key?: string; + map?: string; + } + | { + /** + * Field name. This is the name we want the user to see and use. + */ + key: string; + /** + * Field mapped name. This is the name we want to use in the request. + * If `in` is omitted, `map` aliases `key` to the transport layer. + */ + map: Slot; + }; + +export interface Fields { + allowExtra?: Partial>; + args?: ReadonlyArray; +} + +export type FieldsConfig = ReadonlyArray; + +const extraPrefixesMap: Record = { + $body_: 'body', + $headers_: 'headers', + $path_: 'path', + $query_: 'query', +}; +const extraPrefixes = Object.entries(extraPrefixesMap); + +type KeyMap = Map< + string, + | { + in: Slot; + map?: string; + } + | { + in?: never; + map: Slot; + } +>; + +function buildKeyMap(fields: FieldsConfig, map?: KeyMap): KeyMap { + if (!map) { + map = new Map(); + } + + for (const config of fields) { + if ('in' in config) { + if (config.key) { + map.set(config.key, { + in: config.in, + map: config.map, + }); + } + } else if ('key' in config) { + map.set(config.key, { + map: config.map, + }); + } else if (config.args) { + buildKeyMap(config.args, map); + } + } + + return map; +} + +interface Params { + body: unknown; + headers: Record; + path: Record; + query: Record; +} + +type ParamsSlotMap = Record; + +function stripEmptySlots(params: ParamsSlotMap): void { + for (const [slot, value] of Object.entries(params)) { + if (value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length) { + delete params[slot as Slot]; + } + } +} + +export function buildClientParams(args: ReadonlyArray, fields: FieldsConfig): Params { + const params: ParamsSlotMap = { + body: Object.create(null), + headers: Object.create(null), + path: Object.create(null), + query: Object.create(null), + }; + + const map = buildKeyMap(fields); + + let config: FieldsConfig[number] | undefined; + + for (const [index, arg] of args.entries()) { + if (fields[index]) { + config = fields[index]; + } + + if (!config) { + continue; + } + + if ('in' in config) { + if (config.key) { + const field = map.get(config.key)!; + const name = field.map || config.key; + if (field.in) { + (params[field.in] as Record)[name] = arg; + } + } else { + params.body = arg; + } + } else { + for (const [key, value] of Object.entries(arg ?? {})) { + const field = map.get(key); + + if (field) { + if (field.in) { + const name = field.map || key; + (params[field.in] as Record)[name] = value; + } else { + params[field.map] = value; + } + } else { + const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix)); + + if (extra) { + const [prefix, slot] = extra; + (params[slot] as Record)[key.slice(prefix.length)] = value; + } else if ('allowExtra' in config && config.allowExtra) { + for (const [slot, allowed] of Object.entries(config.allowExtra)) { + if (allowed) { + (params[slot as Slot] as Record)[key] = value; + break; + } + } + } + } + } + } + } + + stripEmptySlots(params); + + return params as Params; +} diff --git a/web/src/api/core/pathSerializer.gen.ts b/web/src/api/core/pathSerializer.gen.ts new file mode 100644 index 0000000..1294aff --- /dev/null +++ b/web/src/api/core/pathSerializer.gen.ts @@ -0,0 +1,167 @@ +// This file is auto-generated by @hey-api/openapi-ts + +interface SerializeOptions extends SerializePrimitiveOptions, SerializerOptions {} + +interface SerializePrimitiveOptions { + allowReserved?: boolean; + name: string; +} + +export interface SerializerOptions { + /** + * @default true + */ + explode: boolean; + style: T; +} + +export type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; +export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; +type MatrixStyle = 'label' | 'matrix' | 'simple'; +export type ObjectStyle = 'form' | 'deepObject'; +type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; + +interface SerializePrimitiveParam extends SerializePrimitiveOptions { + value: string; +} + +export const separatorArrayExplode = (style: ArraySeparatorStyle): '.' | ';' | ',' | '&' => { + switch (style) { + case 'label': + return '.'; + case 'matrix': + return ';'; + case 'simple': + return ','; + default: + return '&'; + } +}; + +export const separatorArrayNoExplode = (style: ArraySeparatorStyle): ',' | '|' | '%20' => { + switch (style) { + case 'form': + return ','; + case 'pipeDelimited': + return '|'; + case 'spaceDelimited': + return '%20'; + default: + return ','; + } +}; + +export const separatorObjectExplode = (style: ObjectSeparatorStyle): '.' | ';' | ',' | '&' => { + switch (style) { + case 'label': + return '.'; + case 'matrix': + return ';'; + case 'simple': + return ','; + default: + return '&'; + } +}; + +export const serializeArrayParam = ({ + allowReserved, + explode, + name, + style, + value, +}: SerializeOptions & { + value: unknown[]; +}): string => { + if (!explode) { + const joinedValues = (allowReserved ? value : value.map(v => encodeURIComponent(v as string))).join( + separatorArrayNoExplode(style) + ); + switch (style) { + case 'label': + return `.${joinedValues}`; + case 'matrix': + return `;${name}=${joinedValues}`; + case 'simple': + return joinedValues; + default: + return `${name}=${joinedValues}`; + } + } + + const separator = separatorArrayExplode(style); + const joinedValues = value + .map(v => { + if (style === 'label' || style === 'simple') { + return allowReserved ? v : encodeURIComponent(v as string); + } + + return serializePrimitiveParam({ + allowReserved, + name, + value: v as string, + }); + }) + .join(separator); + return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues; +}; + +export const serializePrimitiveParam = ({ allowReserved, name, value }: SerializePrimitiveParam): string => { + if (value === undefined || value === null) { + return ''; + } + + if (typeof value === 'object') { + throw new Error( + 'Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.' + ); + } + + return `${name}=${allowReserved ? value : encodeURIComponent(value)}`; +}; + +export const serializeObjectParam = ({ + allowReserved, + explode, + name, + style, + value, + valueOnly, +}: SerializeOptions & { + value: Record | Date; + valueOnly?: boolean; +}): string => { + if (value instanceof Date) { + return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`; + } + + if (style !== 'deepObject' && !explode) { + let values: string[] = []; + Object.entries(value).forEach(([key, v]) => { + values = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)]; + }); + const joinedValues = values.join(','); + switch (style) { + case 'form': + return `${name}=${joinedValues}`; + case 'label': + return `.${joinedValues}`; + case 'matrix': + return `;${name}=${joinedValues}`; + default: + return joinedValues; + } + } + + const separator = separatorObjectExplode(style); + const joinedValues = Object.entries(value) + .map(([key, v]) => + serializePrimitiveParam({ + allowReserved, + name: style === 'deepObject' ? `${name}[${key}]` : key, + value: v as string, + }) + ) + .join(separator); + return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues; +}; diff --git a/web/src/api/core/queryKeySerializer.gen.ts b/web/src/api/core/queryKeySerializer.gen.ts new file mode 100644 index 0000000..e84d0e4 --- /dev/null +++ b/web/src/api/core/queryKeySerializer.gen.ts @@ -0,0 +1,111 @@ +// This file is auto-generated by @hey-api/openapi-ts + +/** + * JSON-friendly union that mirrors what Pinia Colada can hash. + */ +export type JsonValue = null | string | number | boolean | JsonValue[] | { [key: string]: JsonValue }; + +/** + * Replacer that converts non-JSON values (bigint, Date, etc.) to safe substitutes. + */ +export const queryKeyJsonReplacer = (_key: string, value: unknown): unknown | undefined => { + if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { + return undefined; + } + if (typeof value === 'bigint') { + return value.toString(); + } + if (value instanceof Date) { + return value.toISOString(); + } + return value; +}; + +/** + * Safely stringifies a value and parses it back into a JsonValue. + */ +export const stringifyToJsonValue = (input: unknown): JsonValue | undefined => { + try { + const json = JSON.stringify(input, queryKeyJsonReplacer); + if (json === undefined) { + return undefined; + } + return JSON.parse(json) as JsonValue; + } catch { + return undefined; + } +}; + +/** + * Detects plain objects (including objects with a null prototype). + */ +const isPlainObject = (value: unknown): value is Record => { + if (value === null || typeof value !== 'object') { + return false; + } + const prototype = Object.getPrototypeOf(value as object); + return prototype === Object.prototype || prototype === null; +}; + +/** + * Turns URLSearchParams into a sorted JSON object for deterministic keys. + */ +const serializeSearchParams = (params: URLSearchParams): JsonValue => { + const entries = Array.from(params.entries()).sort(([a], [b]) => a.localeCompare(b)); + const result: Record = {}; + + for (const [key, value] of entries) { + const existing = result[key]; + if (existing === undefined) { + result[key] = value; + continue; + } + + if (Array.isArray(existing)) { + (existing as string[]).push(value); + } else { + result[key] = [existing, value]; + } + } + + return result; +}; + +/** + * Normalizes any accepted value into a JSON-friendly shape for query keys. + */ +export const serializeQueryKeyValue = (value: unknown): JsonValue | undefined => { + if (value === null) { + return null; + } + + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + return value; + } + + if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { + return undefined; + } + + if (typeof value === 'bigint') { + return value.toString(); + } + + if (value instanceof Date) { + return value.toISOString(); + } + + if (Array.isArray(value)) { + return stringifyToJsonValue(value); + } + + if (typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams) { + return serializeSearchParams(value); + } + + if (isPlainObject(value)) { + return stringifyToJsonValue(value); + } + + return undefined; +}; diff --git a/web/src/api/core/serverSentEvents.gen.ts b/web/src/api/core/serverSentEvents.gen.ts new file mode 100644 index 0000000..d89a228 --- /dev/null +++ b/web/src/api/core/serverSentEvents.gen.ts @@ -0,0 +1,238 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Config } from './types.gen'; + +export type ServerSentEventsOptions = Omit & + Pick & { + /** + * Fetch API implementation. You can use this option to provide a custom + * fetch instance. + * + * @default globalThis.fetch + */ + fetch?: typeof fetch; + /** + * Implementing clients can call request interceptors inside this hook. + */ + onRequest?: (url: string, init: RequestInit) => Promise; + /** + * Callback invoked when a network or parsing error occurs during streaming. + * + * This option applies only if the endpoint returns a stream of events. + * + * @param error The error that occurred. + */ + onSseError?: (error: unknown) => void; + /** + * Callback invoked when an event is streamed from the server. + * + * This option applies only if the endpoint returns a stream of events. + * + * @param event Event streamed from the server. + * @returns Nothing (void). + */ + onSseEvent?: (event: StreamEvent) => void; + serializedBody?: RequestInit['body']; + /** + * Default retry delay in milliseconds. + * + * This option applies only if the endpoint returns a stream of events. + * + * @default 3000 + */ + sseDefaultRetryDelay?: number; + /** + * Maximum number of retry attempts before giving up. + */ + sseMaxRetryAttempts?: number; + /** + * Maximum retry delay in milliseconds. + * + * Applies only when exponential backoff is used. + * + * This option applies only if the endpoint returns a stream of events. + * + * @default 30000 + */ + sseMaxRetryDelay?: number; + /** + * Optional sleep function for retry backoff. + * + * Defaults to using `setTimeout`. + */ + sseSleepFn?: (ms: number) => Promise; + url: string; + }; + +export interface StreamEvent { + data: TData; + event?: string; + id?: string; + retry?: number; +} + +export type ServerSentEventsResult = { + stream: AsyncGenerator ? TData[keyof TData] : TData, TReturn, TNext>; +}; + +export function createSseClient({ + onRequest, + onSseError, + onSseEvent, + responseTransformer, + responseValidator, + sseDefaultRetryDelay, + sseMaxRetryAttempts, + sseMaxRetryDelay, + sseSleepFn, + url, + ...options +}: ServerSentEventsOptions): ServerSentEventsResult { + let lastEventId: string | undefined; + + const sleep = sseSleepFn ?? ((ms: number) => new Promise(resolve => setTimeout(resolve, ms))); + + const createStream = async function* () { + let retryDelay: number = sseDefaultRetryDelay ?? 3000; + let attempt = 0; + const signal = options.signal ?? new AbortController().signal; + + while (true) { + if (signal.aborted) break; + + attempt++; + + const headers = + options.headers instanceof Headers + ? options.headers + : new Headers(options.headers as Record | undefined); + + if (lastEventId !== undefined) { + headers.set('Last-Event-ID', lastEventId); + } + + try { + const requestInit: RequestInit = { + redirect: 'follow', + ...options, + body: options.serializedBody, + headers, + signal, + }; + let request = new Request(url, requestInit); + if (onRequest) { + request = await onRequest(url, requestInit); + } + // fetch must be assigned here, otherwise it would throw the error: + // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation + const _fetch = options.fetch ?? globalThis.fetch; + const response = await _fetch(request); + + if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`); + + if (!response.body) throw new Error('No body in SSE response'); + + const reader = response.body.pipeThrough(new TextDecoderStream()).getReader(); + + let buffer = ''; + + const abortHandler = () => { + try { + reader.cancel(); + } catch { + // noop + } + }; + + signal.addEventListener('abort', abortHandler); + + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + buffer += value; + buffer = buffer.replace(/\r\n?/g, '\n'); // normalize line endings + + const chunks = buffer.split('\n\n'); + buffer = chunks.pop() ?? ''; + + for (const chunk of chunks) { + const lines = chunk.split('\n'); + const dataLines: Array = []; + let eventName: string | undefined; + + for (const line of lines) { + if (line.startsWith('data:')) { + dataLines.push(line.replace(/^data:\s*/, '')); + } else if (line.startsWith('event:')) { + eventName = line.replace(/^event:\s*/, ''); + } else if (line.startsWith('id:')) { + lastEventId = line.replace(/^id:\s*/, ''); + } else if (line.startsWith('retry:')) { + const parsed = Number.parseInt(line.replace(/^retry:\s*/, ''), 10); + if (!Number.isNaN(parsed)) { + retryDelay = parsed; + } + } + } + + let data: unknown; + let parsedJson = false; + + if (dataLines.length) { + const rawData = dataLines.join('\n'); + try { + data = JSON.parse(rawData); + parsedJson = true; + } catch { + data = rawData; + } + } + + if (parsedJson) { + if (responseValidator) { + await responseValidator(data); + } + + if (responseTransformer) { + data = await responseTransformer(data); + } + } + + onSseEvent?.({ + data, + event: eventName, + id: lastEventId, + retry: retryDelay, + }); + + if (dataLines.length) { + yield data as any; + } + } + } + } finally { + signal.removeEventListener('abort', abortHandler); + reader.releaseLock(); + } + + break; // exit loop on normal completion + } catch (error) { + // connection failed or aborted; retry after delay + onSseError?.(error); + + if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) { + break; // stop after firing error + } + + // exponential backoff: double retry each attempt, cap at 30s + const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000); + await sleep(backoff); + } + } + }; + + const stream = createStream(); + + return { stream }; +} diff --git a/web/src/api/core/types.gen.ts b/web/src/api/core/types.gen.ts new file mode 100644 index 0000000..2b9e67b --- /dev/null +++ b/web/src/api/core/types.gen.ts @@ -0,0 +1,86 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Auth, AuthToken } from './auth.gen'; +import type { BodySerializer, QuerySerializer, QuerySerializerOptions } from './bodySerializer.gen'; + +export type HttpMethod = 'connect' | 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put' | 'trace'; + +export type Client = { + /** + * Returns the final request URL. + */ + buildUrl: BuildUrlFn; + getConfig: () => Config; + request: RequestFn; + setConfig: (config: Config) => Config; +} & { + [K in HttpMethod]: MethodFn; +} & ([SseFn] extends [never] ? { sse?: never } : { sse: { [K in HttpMethod]: SseFn } }); + +export interface Config { + /** + * Auth token or a function returning auth token. The resolved value will be + * added to the request payload as defined by its `security` array. + */ + auth?: ((auth: Auth) => Promise | AuthToken) | AuthToken; + /** + * A function for serializing request body parameter. By default, + * {@link JSON.stringify()} will be used. + */ + bodySerializer?: BodySerializer | null; + /** + * An object containing any HTTP headers that you want to pre-populate your + * `Headers` object with. + * + * {@link https://developer.mozilla.org/docs/Web/API/Headers/Headers#init See more} + */ + headers?: + | RequestInit['headers'] + | Record; + /** + * The request method. + * + * {@link https://developer.mozilla.org/docs/Web/API/fetch#method See more} + */ + method?: Uppercase; + /** + * A function for serializing request query parameters. By default, arrays + * will be exploded in form style, objects will be exploded in deepObject + * style, and reserved characters are percent-encoded. + * + * This method will have no effect if the native `paramsSerializer()` Axios + * API function is used. + * + * {@link https://swagger.io/docs/specification/serialization/#query View examples} + */ + querySerializer?: QuerySerializer | QuerySerializerOptions; + /** + * A function validating request data. This is useful if you want to ensure + * the request conforms to the desired shape, so it can be safely sent to + * the server. + */ + requestValidator?: (data: unknown) => Promise; + /** + * A function transforming response data before it's returned. This is useful + * for post-processing data, e.g., converting ISO strings into Date objects. + */ + responseTransformer?: (data: unknown) => Promise; + /** + * A function validating response data. This is useful if you want to ensure + * the response conforms to the desired shape, so it can be safely passed to + * the transformers and returned to the user. + */ + responseValidator?: (data: unknown) => Promise; +} + +type IsExactlyNeverOrNeverUndefined = [T] extends [never] + ? true + : [T] extends [never | undefined] + ? [undefined] extends [T] + ? false + : true + : false; + +export type OmitNever> = { + [K in keyof T as IsExactlyNeverOrNeverUndefined extends true ? never : K]: T[K]; +}; diff --git a/web/src/api/core/utils.gen.ts b/web/src/api/core/utils.gen.ts new file mode 100644 index 0000000..340c8bd --- /dev/null +++ b/web/src/api/core/utils.gen.ts @@ -0,0 +1,137 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { BodySerializer, QuerySerializer } from './bodySerializer.gen'; +import { + type ArraySeparatorStyle, + serializeArrayParam, + serializeObjectParam, + serializePrimitiveParam, +} from './pathSerializer.gen'; + +export interface PathSerializer { + path: Record; + url: string; +} + +export const PATH_PARAM_RE: RegExp = /\{[^{}]+\}/g; + +export const defaultPathSerializer = ({ path, url: _url }: PathSerializer): string => { + let url = _url; + const matches = _url.match(PATH_PARAM_RE); + if (matches) { + for (const match of matches) { + let explode = false; + let name = match.substring(1, match.length - 1); + let style: ArraySeparatorStyle = 'simple'; + + if (name.endsWith('*')) { + explode = true; + name = name.substring(0, name.length - 1); + } + + if (name.startsWith('.')) { + name = name.substring(1); + style = 'label'; + } else if (name.startsWith(';')) { + name = name.substring(1); + style = 'matrix'; + } + + const value = path[name]; + + if (value === undefined || value === null) { + continue; + } + + if (Array.isArray(value)) { + url = url.replace(match, serializeArrayParam({ explode, name, style, value })); + continue; + } + + if (typeof value === 'object') { + url = url.replace( + match, + serializeObjectParam({ + explode, + name, + style, + value: value as Record, + valueOnly: true, + }) + ); + continue; + } + + if (style === 'matrix') { + url = url.replace( + match, + `;${serializePrimitiveParam({ + name, + value: value as string, + })}` + ); + continue; + } + + const replaceValue = encodeURIComponent(style === 'label' ? `.${value as string}` : (value as string)); + url = url.replace(match, replaceValue); + } + } + return url; +}; + +export const getUrl = ({ + baseUrl, + path, + query, + querySerializer, + url: _url, +}: { + baseUrl?: string; + path?: Record; + query?: Record; + querySerializer: QuerySerializer; + url: string; +}): string => { + const pathUrl = _url.startsWith('/') ? _url : `/${_url}`; + let url = (baseUrl ?? '') + pathUrl; + if (path) { + url = defaultPathSerializer({ path, url }); + } + let search = query ? querySerializer(query) : ''; + if (search.startsWith('?')) { + search = search.substring(1); + } + if (search) { + url += `?${search}`; + } + return url; +}; + +export function getValidRequestBody(options: { + body?: unknown; + bodySerializer?: BodySerializer | null; + serializedBody?: unknown; +}): unknown { + const hasBody = options.body !== undefined; + const isSerializedBody = hasBody && options.bodySerializer; + + if (isSerializedBody) { + if ('serializedBody' in options) { + const hasSerializedBody = options.serializedBody !== undefined && options.serializedBody !== ''; + + return hasSerializedBody ? options.serializedBody : null; + } + + // not all clients implement a serializedBody property (i.e., client-axios) + return options.body !== '' ? options.body : null; + } + + // plain/text body + if (hasBody) { + return options.body; + } + + // no body was provided + return undefined; +} diff --git a/web/src/api/ethereum.ts b/web/src/api/ethereum.ts deleted file mode 100644 index 98f424a..0000000 --- a/web/src/api/ethereum.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - Response, - V1GetEthereumNowResponse, - V1GetEthereumSpecResponse, - EthereumSpec, -} from '@app/types/api'; -import { BASE_URL } from '@utils/environment'; - -export type Spec = { - network_name: string; - spec: EthereumSpec; -}; - -export async function fetchNow(): Promise> { - const response = await fetch(`${BASE_URL}api/v1/ethereum/now`); - - if (!response.ok) { - throw new Error('Failed to fetch ethereum now'); - } - const json = (await response.json()) as Response; - - if (!json.data?.slot) throw new Error('No slot in response'); - if (!json.data?.epoch) throw new Error('No epoch in response'); - - return { - slot: json.data?.slot, - epoch: json.data?.epoch, - }; -} - -export async function fetchSpec(): Promise> { - const response = await fetch(`${BASE_URL}api/v1/ethereum/spec`); - - if (!response.ok) { - throw new Error('Failed to fetch ethereum spec'); - } - const json = (await response.json()) as Response; - - if (!json.data?.spec) throw new Error('No spec in response'); - - return { - network_name: json.data?.network_name ?? 'unknown', - spec: json.data.spec, - }; -} diff --git a/web/src/api/frames.ts b/web/src/api/frames.ts deleted file mode 100644 index 2f22462..0000000 --- a/web/src/api/frames.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Response, V1GetFrameResponse, Frame } from '@app/types/api'; -import { ProcessedData } from '@app/types/graph'; -import { BASE_URL } from '@utils/environment'; -import { processForkChoiceData } from '@utils/graph'; - -export async function fetchFrame(id: string): Promise { - const response = await fetch(`${BASE_URL}api/v1/frames/${id}`); - - if (!response.ok) { - throw new Error('Failed to fetch snapshot data'); - } - const json = (await response.json()) as Response; - const frame = json.data?.frame; - - if (frame === undefined) throw new Error('No frame in response'); - if (frame?.data === undefined) throw new Error('No frame data in response'); - if (frame?.metadata === undefined) throw new Error('No frame metadata in response'); - - return processForkChoiceData(frame as Required); -} diff --git a/web/src/api/index.ts b/web/src/api/index.ts new file mode 100644 index 0000000..96fbcb0 --- /dev/null +++ b/web/src/api/index.ts @@ -0,0 +1,75 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export { + getEthereumNow, + getEthereumSpec, + getFrame, + listMetadata, + listMetadataEpochs, + listMetadataLabels, + listMetadataNodes, + listMetadataSlots, + type Options, +} from './sdk.gen'; +export type { + Checkpoint, + ClientOptions, + Epoch, + EpochString, + Error, + EthereumNow, + EthereumSpec, + EthereumSpecResult, + ForkChoice, + ForkChoiceNode, + Frame, + FrameFilter, + FrameMetadata, + GetEthereumNowData, + GetEthereumNowError, + GetEthereumNowErrors, + GetEthereumNowResponse, + GetEthereumNowResponses, + GetEthereumSpecData, + GetEthereumSpecError, + GetEthereumSpecErrors, + GetEthereumSpecResponse, + GetEthereumSpecResponses, + GetFrameData, + GetFrameError, + GetFrameErrors, + GetFrameResponse, + GetFrameResponses, + ListMetadataData, + ListMetadataEpochsData, + ListMetadataEpochsError, + ListMetadataEpochsErrors, + ListMetadataEpochsResponse, + ListMetadataEpochsResponses, + ListMetadataError, + ListMetadataErrors, + ListMetadataLabelsData, + ListMetadataLabelsError, + ListMetadataLabelsErrors, + ListMetadataLabelsResponse, + ListMetadataLabelsResponses, + ListMetadataNodesData, + ListMetadataNodesError, + ListMetadataNodesErrors, + ListMetadataNodesResponse, + ListMetadataNodesResponses, + ListMetadataResponse, + ListMetadataResponses, + ListMetadataSlotsData, + ListMetadataSlotsError, + ListMetadataSlotsErrors, + ListMetadataSlotsResponse, + ListMetadataSlotsResponses, + MetadataQuery, + MetadataQuery2, + PaginationCursor, + PaginationResponse, + Root, + Slot, + SlotString, +} from './types.gen'; diff --git a/web/src/api/metadata.ts b/web/src/api/metadata.ts deleted file mode 100644 index d52fbcc..0000000 --- a/web/src/api/metadata.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - Response, - FrameMetaData, - V1MetadataListRequest, - V1MetadataListResponse, - V1MetadataListNodesRequest, - V1MetadataListNodesResponse, -} from '@app/types/api'; -import { BASE_URL } from '@utils/environment'; - -export async function fetchMetadataNodes(payload: V1MetadataListNodesRequest): Promise { - const response = await fetch(`${BASE_URL}api/v1/metadata/nodes`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(payload), - }); - - if (!response.ok) { - throw new Error('Failed to fetch metadata nodes'); - } - - const json = (await response.json()) as Response; - return json.data?.nodes || []; -} - -export async function fetchMetadataList(payload: V1MetadataListRequest): Promise { - const response = await fetch(`${BASE_URL}api/v1/metadata`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(payload), - }); - - if (!response.ok) { - throw new Error('Failed to fetch metadata list'); - } - const json = (await response.json()) as Response; - return json.data?.frames || []; -} diff --git a/web/src/api/sdk.gen.ts b/web/src/api/sdk.gen.ts new file mode 100644 index 0000000..84ba864 --- /dev/null +++ b/web/src/api/sdk.gen.ts @@ -0,0 +1,174 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { Client, Options as Options2, RequestResult, TDataShape } from './client'; +import { client } from './client.gen'; +import type { + GetEthereumNowData, + GetEthereumNowErrors, + GetEthereumNowResponses, + GetEthereumSpecData, + GetEthereumSpecErrors, + GetEthereumSpecResponses, + GetFrameData, + GetFrameErrors, + GetFrameResponses, + ListMetadataData, + ListMetadataEpochsData, + ListMetadataEpochsErrors, + ListMetadataEpochsResponses, + ListMetadataErrors, + ListMetadataLabelsData, + ListMetadataLabelsErrors, + ListMetadataLabelsResponses, + ListMetadataNodesData, + ListMetadataNodesErrors, + ListMetadataNodesResponses, + ListMetadataResponses, + ListMetadataSlotsData, + ListMetadataSlotsErrors, + ListMetadataSlotsResponses, +} from './types.gen'; +import { + zGetEthereumNowResponse, + zGetEthereumSpecResponse, + zGetFrameResponse, + zListMetadataEpochsResponse, + zListMetadataLabelsResponse, + zListMetadataNodesResponse, + zListMetadataResponse, + zListMetadataSlotsResponse, +} from './zod.gen'; + +export type Options< + TData extends TDataShape = TDataShape, + ThrowOnError extends boolean = boolean, + TResponse = unknown, +> = Options2 & { + /** + * You can provide a client instance returned by `createClient()` instead of + * individual options. This might be also useful if you want to implement a + * custom client. + */ + client?: Client; + /** + * You can pass arbitrary values through the `meta` object. This can be + * used to access values that aren't defined as part of the SDK function. + */ + meta?: Record; +}; + +/** + * Get the current wall-clock slot and epoch + */ +export const getEthereumNow = ( + options?: Options +): RequestResult => + (options?.client ?? client).get({ + responseValidator: async data => await zGetEthereumNowResponse.parseAsync(data), + url: '/api/v1/ethereum/now', + ...options, + }); + +/** + * Get the Ethereum network name and spec + */ +export const getEthereumSpec = ( + options?: Options +): RequestResult => + (options?.client ?? client).get({ + responseValidator: async data => await zGetEthereumSpecResponse.parseAsync(data), + url: '/api/v1/ethereum/spec', + ...options, + }); + +/** + * Get a single fork-choice frame by ID + */ +export const getFrame = ( + options: Options +): RequestResult => + (options.client ?? client).get({ + responseValidator: async data => await zGetFrameResponse.parseAsync(data), + url: '/api/v1/frames/{id}', + ...options, + }); + +/** + * List fork-choice frame metadata + */ +export const listMetadata = ( + options: Options +): RequestResult => + (options.client ?? client).post({ + responseValidator: async data => await zListMetadataResponse.parseAsync(data), + url: '/api/v1/metadata', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + +/** + * List distinct nodes across stored frames + */ +export const listMetadataNodes = ( + options: Options +): RequestResult => + (options.client ?? client).post({ + responseValidator: async data => await zListMetadataNodesResponse.parseAsync(data), + url: '/api/v1/metadata/nodes', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + +/** + * List distinct slots across stored frames + */ +export const listMetadataSlots = ( + options: Options +): RequestResult => + (options.client ?? client).post({ + responseValidator: async data => await zListMetadataSlotsResponse.parseAsync(data), + url: '/api/v1/metadata/slots', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + +/** + * List distinct epochs across stored frames + */ +export const listMetadataEpochs = ( + options: Options +): RequestResult => + (options.client ?? client).post({ + responseValidator: async data => await zListMetadataEpochsResponse.parseAsync(data), + url: '/api/v1/metadata/epochs', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + +/** + * List distinct labels across stored frames + */ +export const listMetadataLabels = ( + options: Options +): RequestResult => + (options.client ?? client).post({ + responseValidator: async data => await zListMetadataLabelsResponse.parseAsync(data), + url: '/api/v1/metadata/labels', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); diff --git a/web/src/api/types.gen.ts b/web/src/api/types.gen.ts new file mode 100644 index 0000000..2456691 --- /dev/null +++ b/web/src/api/types.gen.ts @@ -0,0 +1,452 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: 'https://forky.mainnet.ethpandaops.io' | 'https://forky.hoodi.ethpandaops.io' | (string & {}); +}; + +/** + * A beacon-chain slot number. + */ +export type Slot = number; + +/** + * A beacon-chain epoch number. + */ +export type Epoch = number; + +/** + * A beacon-chain slot number serialized as a string, following the + * beacon-API convention used by the fork-choice dump. + * + */ +export type SlotString = string; + +/** + * A beacon-chain epoch number serialized as a string, following the + * beacon-API convention used by the fork-choice dump. + * + */ +export type EpochString = string; + +/** + * A 32-byte hex-encoded root. + */ +export type Root = string; + +export type Error = { + /** + * The HTTP status code. + */ + code: number; + /** + * A human-readable error message. + */ + message: string; +}; + +/** + * Offset-based pagination cursor. + */ +export type PaginationCursor = { + /** + * The number of items to skip. + */ + offset?: number; + /** + * The maximum number of items to return. + */ + limit?: number; +}; + +export type PaginationResponse = { + /** + * The total number of matching items. + */ + total: number; +}; + +/** + * Filters applied to a frame query. All fields are optional. + */ +export type FrameFilter = { + node?: string; + before?: string; + after?: string; + slot?: Slot; + epoch?: Epoch; + labels?: Array; + consensus_client?: string; + event_source?: string; +}; + +export type MetadataQuery = { + filter?: FrameFilter; + pagination?: PaginationCursor; +}; + +export type FrameMetadata = { + /** + * The frame ID. + */ + id: string; + /** + * The node that provided the frame. For a beacon node this is the + * configured node ID; for Xatu it is the Xatu Sentry ID. + * + */ + node: string; + /** + * When the frame was fetched. + */ + fetched_at: string; + wall_clock_slot: Slot; + wall_clock_epoch: Epoch; + labels: Array; + consensus_client: string; + event_source: string; +}; + +export type Checkpoint = { + epoch: EpochString; + root: Root; +}; + +export type ForkChoiceNode = { + slot: SlotString; + block_root: Root; + parent_root: Root; + justified_epoch: EpochString; + finalized_epoch: EpochString; + /** + * The node's fork-choice weight, serialized as a string. + */ + weight: string; + /** + * The node's validity status. + */ + validity: 'valid' | 'invalid' | 'optimistic' | 'unknown'; + execution_block_hash: Root; + extra_data?: { + [key: string]: unknown; + }; +}; + +/** + * A beacon node's fork-choice dump. + */ +export type ForkChoice = { + justified_checkpoint: Checkpoint; + finalized_checkpoint: Checkpoint; + fork_choice_nodes: Array; +}; + +export type Frame = { + data: ForkChoice; + metadata: FrameMetadata; +}; + +export type EthereumNow = { + slot: Slot; + epoch: Epoch; +}; + +export type EthereumSpec = { + seconds_per_slot: number; + slots_per_epoch: number; + genesis_time: string; +}; + +export type EthereumSpecResult = { + network_name: string; + spec: EthereumSpec; +}; + +/** + * Filter and pagination for a metadata query. + */ +export type MetadataQuery2 = MetadataQuery; + +export type GetEthereumNowData = { + body?: never; + path?: never; + query?: never; + url: '/api/v1/ethereum/now'; +}; + +export type GetEthereumNowErrors = { + /** + * The request was malformed. + */ + 400: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type GetEthereumNowError = GetEthereumNowErrors[keyof GetEthereumNowErrors]; + +export type GetEthereumNowResponses = { + /** + * The current wall-clock slot and epoch. + */ + 200: { + data: EthereumNow; + }; +}; + +export type GetEthereumNowResponse = GetEthereumNowResponses[keyof GetEthereumNowResponses]; + +export type GetEthereumSpecData = { + body?: never; + path?: never; + query?: never; + url: '/api/v1/ethereum/spec'; +}; + +export type GetEthereumSpecErrors = { + /** + * The request was malformed. + */ + 400: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type GetEthereumSpecError = GetEthereumSpecErrors[keyof GetEthereumSpecErrors]; + +export type GetEthereumSpecResponses = { + /** + * The configured network name and spec. + */ + 200: { + data: EthereumSpecResult; + }; +}; + +export type GetEthereumSpecResponse = GetEthereumSpecResponses[keyof GetEthereumSpecResponses]; + +export type GetFrameData = { + body?: never; + path: { + /** + * The frame ID. + */ + id: string; + }; + query?: never; + url: '/api/v1/frames/{id}'; +}; + +export type GetFrameErrors = { + /** + * The requested resource was not found. + */ + 404: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type GetFrameError = GetFrameErrors[keyof GetFrameErrors]; + +export type GetFrameResponses = { + /** + * The requested fork-choice frame. + */ + 200: { + data: { + frame: Frame; + }; + }; +}; + +export type GetFrameResponse = GetFrameResponses[keyof GetFrameResponses]; + +export type ListMetadataData = { + /** + * Filter and pagination for a metadata query. + */ + body: MetadataQuery2; + path?: never; + query?: never; + url: '/api/v1/metadata'; +}; + +export type ListMetadataErrors = { + /** + * The request was malformed. + */ + 400: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type ListMetadataError = ListMetadataErrors[keyof ListMetadataErrors]; + +export type ListMetadataResponses = { + /** + * A page of frame metadata. + */ + 200: { + data: { + frames: Array; + pagination: PaginationResponse; + }; + }; +}; + +export type ListMetadataResponse = ListMetadataResponses[keyof ListMetadataResponses]; + +export type ListMetadataNodesData = { + /** + * Filter and pagination for a metadata query. + */ + body: MetadataQuery2; + path?: never; + query?: never; + url: '/api/v1/metadata/nodes'; +}; + +export type ListMetadataNodesErrors = { + /** + * The request was malformed. + */ + 400: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type ListMetadataNodesError = ListMetadataNodesErrors[keyof ListMetadataNodesErrors]; + +export type ListMetadataNodesResponses = { + /** + * A page of distinct node names. + */ + 200: { + data: { + nodes: Array; + pagination: PaginationResponse; + }; + }; +}; + +export type ListMetadataNodesResponse = ListMetadataNodesResponses[keyof ListMetadataNodesResponses]; + +export type ListMetadataSlotsData = { + /** + * Filter and pagination for a metadata query. + */ + body: MetadataQuery2; + path?: never; + query?: never; + url: '/api/v1/metadata/slots'; +}; + +export type ListMetadataSlotsErrors = { + /** + * The request was malformed. + */ + 400: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type ListMetadataSlotsError = ListMetadataSlotsErrors[keyof ListMetadataSlotsErrors]; + +export type ListMetadataSlotsResponses = { + /** + * A page of distinct slots. + */ + 200: { + data: { + slots: Array; + pagination: PaginationResponse; + }; + }; +}; + +export type ListMetadataSlotsResponse = ListMetadataSlotsResponses[keyof ListMetadataSlotsResponses]; + +export type ListMetadataEpochsData = { + /** + * Filter and pagination for a metadata query. + */ + body: MetadataQuery2; + path?: never; + query?: never; + url: '/api/v1/metadata/epochs'; +}; + +export type ListMetadataEpochsErrors = { + /** + * The request was malformed. + */ + 400: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type ListMetadataEpochsError = ListMetadataEpochsErrors[keyof ListMetadataEpochsErrors]; + +export type ListMetadataEpochsResponses = { + /** + * A page of distinct epochs. + */ + 200: { + data: { + epochs: Array; + pagination: PaginationResponse; + }; + }; +}; + +export type ListMetadataEpochsResponse = ListMetadataEpochsResponses[keyof ListMetadataEpochsResponses]; + +export type ListMetadataLabelsData = { + /** + * Filter and pagination for a metadata query. + */ + body: MetadataQuery2; + path?: never; + query?: never; + url: '/api/v1/metadata/labels'; +}; + +export type ListMetadataLabelsErrors = { + /** + * The request was malformed. + */ + 400: Error; + /** + * An unexpected error occurred. + */ + default: Error; +}; + +export type ListMetadataLabelsError = ListMetadataLabelsErrors[keyof ListMetadataLabelsErrors]; + +export type ListMetadataLabelsResponses = { + /** + * A page of distinct labels. + */ + 200: { + data: { + labels: Array; + pagination: PaginationResponse; + }; + }; +}; + +export type ListMetadataLabelsResponse = ListMetadataLabelsResponses[keyof ListMetadataLabelsResponses]; diff --git a/web/src/api/zod.gen.ts b/web/src/api/zod.gen.ts new file mode 100644 index 0000000..62eb0c8 --- /dev/null +++ b/web/src/api/zod.gen.ts @@ -0,0 +1,264 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import * as z from 'zod/mini'; + +/** + * A beacon-chain slot number. + */ +export const zSlot = z.coerce + .bigint() + .check( + z.gte(BigInt(0)), + z.maximum(BigInt('9223372036854775807'), { error: 'Invalid value: Expected int64 to be <= 9223372036854775807' }) + ); + +/** + * A beacon-chain epoch number. + */ +export const zEpoch = z.coerce + .bigint() + .check( + z.gte(BigInt(0)), + z.maximum(BigInt('9223372036854775807'), { error: 'Invalid value: Expected int64 to be <= 9223372036854775807' }) + ); + +/** + * A beacon-chain slot number serialized as a string, following the + * beacon-API convention used by the fork-choice dump. + * + */ +export const zSlotString = z.string(); + +/** + * A beacon-chain epoch number serialized as a string, following the + * beacon-API convention used by the fork-choice dump. + * + */ +export const zEpochString = z.string(); + +/** + * A 32-byte hex-encoded root. + */ +export const zRoot = z.string(); + +export const zError = z.object({ + code: z.int(), + message: z.string(), +}); + +/** + * Offset-based pagination cursor. + */ +export const zPaginationCursor = z.object({ + offset: z._default(z.optional(z.int()), 0), + limit: z._default(z.optional(z.int()), 1000), +}); + +export const zPaginationResponse = z.object({ + total: z.coerce + .bigint() + .check( + z.minimum(BigInt('-9223372036854775808'), { + error: 'Invalid value: Expected int64 to be >= -9223372036854775808', + }), + z.maximum(BigInt('9223372036854775807'), { error: 'Invalid value: Expected int64 to be <= 9223372036854775807' }) + ), +}); + +/** + * Filters applied to a frame query. All fields are optional. + */ +export const zFrameFilter = z.object({ + node: z.optional(z.string()), + before: z.optional(z.iso.datetime()), + after: z.optional(z.iso.datetime()), + slot: z.optional(zSlot), + epoch: z.optional(zEpoch), + labels: z.optional(z.array(z.string())), + consensus_client: z.optional(z.string()), + event_source: z.optional(z.string()), +}); + +export const zMetadataQuery = z.object({ + filter: z.optional(zFrameFilter), + pagination: z.optional(zPaginationCursor), +}); + +export const zFrameMetadata = z.object({ + id: z.string(), + node: z.string(), + fetched_at: z.iso.datetime(), + wall_clock_slot: zSlot, + wall_clock_epoch: zEpoch, + labels: z.array(z.string()), + consensus_client: z.string(), + event_source: z.string(), +}); + +export const zCheckpoint = z.object({ + epoch: zEpochString, + root: zRoot, +}); + +export const zForkChoiceNode = z.object({ + slot: zSlotString, + block_root: zRoot, + parent_root: zRoot, + justified_epoch: zEpochString, + finalized_epoch: zEpochString, + weight: z.string(), + validity: z.enum(['valid', 'invalid', 'optimistic', 'unknown']), + execution_block_hash: zRoot, + extra_data: z.optional(z.record(z.string(), z.unknown())), +}); + +/** + * A beacon node's fork-choice dump. + */ +export const zForkChoice = z.object({ + justified_checkpoint: zCheckpoint, + finalized_checkpoint: zCheckpoint, + fork_choice_nodes: z.array(zForkChoiceNode), +}); + +export const zFrame = z.object({ + data: zForkChoice, + metadata: zFrameMetadata, +}); + +export const zEthereumNow = z.object({ + slot: zSlot, + epoch: zEpoch, +}); + +export const zEthereumSpec = z.object({ + seconds_per_slot: z.coerce + .bigint() + .check( + z.minimum(BigInt('-9223372036854775808'), { + error: 'Invalid value: Expected int64 to be >= -9223372036854775808', + }), + z.maximum(BigInt('9223372036854775807'), { error: 'Invalid value: Expected int64 to be <= 9223372036854775807' }) + ), + slots_per_epoch: z.coerce + .bigint() + .check( + z.minimum(BigInt('-9223372036854775808'), { + error: 'Invalid value: Expected int64 to be >= -9223372036854775808', + }), + z.maximum(BigInt('9223372036854775807'), { error: 'Invalid value: Expected int64 to be <= 9223372036854775807' }) + ), + genesis_time: z.iso.datetime(), +}); + +export const zEthereumSpecResult = z.object({ + network_name: z.string(), + spec: zEthereumSpec, +}); + +/** + * Filter and pagination for a metadata query. + */ +export const zMetadataQuery2 = zMetadataQuery; + +/** + * The current wall-clock slot and epoch. + */ +export const zGetEthereumNowResponse = z.object({ + data: zEthereumNow, +}); + +/** + * The configured network name and spec. + */ +export const zGetEthereumSpecResponse = z.object({ + data: zEthereumSpecResult, +}); + +export const zGetFramePath = z.object({ + id: z.string(), +}); + +/** + * The requested fork-choice frame. + */ +export const zGetFrameResponse = z.object({ + data: z.object({ + frame: zFrame, + }), +}); + +/** + * Filter and pagination for a metadata query. + */ +export const zListMetadataBody = zMetadataQuery2; + +/** + * A page of frame metadata. + */ +export const zListMetadataResponse = z.object({ + data: z.object({ + frames: z.array(zFrameMetadata), + pagination: zPaginationResponse, + }), +}); + +/** + * Filter and pagination for a metadata query. + */ +export const zListMetadataNodesBody = zMetadataQuery2; + +/** + * A page of distinct node names. + */ +export const zListMetadataNodesResponse = z.object({ + data: z.object({ + nodes: z.array(z.string()), + pagination: zPaginationResponse, + }), +}); + +/** + * Filter and pagination for a metadata query. + */ +export const zListMetadataSlotsBody = zMetadataQuery2; + +/** + * A page of distinct slots. + */ +export const zListMetadataSlotsResponse = z.object({ + data: z.object({ + slots: z.array(zSlot), + pagination: zPaginationResponse, + }), +}); + +/** + * Filter and pagination for a metadata query. + */ +export const zListMetadataEpochsBody = zMetadataQuery2; + +/** + * A page of distinct epochs. + */ +export const zListMetadataEpochsResponse = z.object({ + data: z.object({ + epochs: z.array(zEpoch), + pagination: zPaginationResponse, + }), +}); + +/** + * Filter and pagination for a metadata query. + */ +export const zListMetadataLabelsBody = zMetadataQuery2; + +/** + * A page of distinct labels. + */ +export const zListMetadataLabelsResponse = z.object({ + data: z.object({ + labels: z.array(z.string()), + pagination: zPaginationResponse, + }), +}); diff --git a/web/src/components/AggregatedBlockSummary.tsx b/web/src/components/AggregatedBlockSummary.tsx index dce6230..78307c7 100644 --- a/web/src/components/AggregatedBlockSummary.tsx +++ b/web/src/components/AggregatedBlockSummary.tsx @@ -1,20 +1,18 @@ -import { - CheckCircleIcon, - MagnifyingGlassIcon, - XCircleIcon, - ArrowTopRightOnSquareIcon, -} from '@heroicons/react/20/solid'; +import { CheckCircleIcon, MagnifyingGlassIcon, XCircleIcon } from '@heroicons/react/20/solid'; import classNames from 'clsx'; -import { Link } from 'wouter'; +import Link from '@components/Link'; import { ProcessedData, WeightedNodeAttributes } from '@app/types/graph'; -import { truncateHash } from '@app/utils/strings'; import Loading from '@components/Loading'; +import { SummaryCard, SummaryLink, SummaryRow, SummarySection } from '@components/Summary'; import useEthereum from '@contexts/ethereum'; import useSelection, { AggregatedFramesBlock } from '@contexts/selection'; import { useFrameQueries } from '@hooks/useQuery'; import { aggregateProcessedData } from '@utils/graph'; +const HEADER_CELL = 'px-3 py-2 text-center text-xs font-semibold text-foreground'; +const ICON_CELL = 'whitespace-nowrap py-2 text-sm text-muted'; + export default function AggregatedBlockSummary({ frameIds, blockRoot }: AggregatedFramesBlock) { const { slotsPerEpoch } = useEthereum(); const { clearAll, setFrameBlock } = useSelection(); @@ -48,238 +46,197 @@ export default function AggregatedBlockSummary({ frameIds, blockRoot }: Aggregat ); return ( -
-
-
-
-
Epoch
-
- {Math.floor(node.slot / slotsPerEpoch)} -
-
-
-
Slot
-
- {node.slot} -
-
-
-
Block Root
-
- - - {truncateHash(node.blockRoot)} - - - - {node.blockRoot} -
-
-
-
Status
-
-
- - - - - - + + {Math.floor(node.slot / slotsPerEpoch)} + {node.slot} + + {node.blockRoot} + + +
+
- Source - - Canonical - - Seen -
+ + + + + + {hasFinalized && ( + + )} + {hasJustified && ( + + )} + {hasInvalid && ( + + )} + {hasOrphaned && ( + + )} + + + + + {results.map(({ data }) => { + if (!data) return null; + let isAggregatedCanonical = false; + let seen = false; + let canonical = false; + let validity = 'valid'; + let orphaned = false; + let attributes: WeightedNodeAttributes | undefined; + try { + const aggregatedAttributes = graph.getNodeAttributes(nodeId); + isAggregatedCanonical = aggregatedAttributes.canonical; + attributes = data.graph.getNodeAttributes(nodeId); + validity = attributes.validity; + orphaned = attributes.orphaned || false; + seen = true; + canonical = attributes.canonical; + } catch (err) { + // ignore + } + return ( + + + + {hasFinalized && ( - + )} {hasJustified && ( - + )} {hasInvalid && ( - + )} {hasOrphaned && ( - + )} - - - - - {results.map(({ data }) => { - if (!data) return null; - let isAggregatedCanonical = false; - let seen = false; - let canonical = false; - let validity = 'valid'; - let orphaned = false; - let attributes: WeightedNodeAttributes | undefined; - try { - const aggregatedAttributes = graph.getNodeAttributes(nodeId); - isAggregatedCanonical = aggregatedAttributes.canonical; - attributes = data.graph.getNodeAttributes(nodeId); - validity = attributes.validity; - orphaned = attributes.orphaned || false; - seen = true; - canonical = attributes.canonical; - } catch (err) { - // ignore - } - return ( - - - - - {hasFinalized && ( - - )} - {hasJustified && ( - - )} - {hasInvalid && ( - - )} - {hasOrphaned && ( - - )} - - - ); - })} - -
+ Source + + Canonical + + Seen + + Finalized + + Justified + + Validity + + Detached + + View +
+ + {data.frame.metadata.node} + + +
+ {seen && + (canonical ? ( + + ) : ( + + ))} +
+
+
+ {seen ? ( + + ) : ( + + )} +
+
- Finalized - +
+ {attributes?.checkpoint === 'finalized' ? ( + + ) : ( + + )} +
+
- Justified - +
+ {attributes?.checkpoint === 'justified' ? ( + + ) : ( + + )} +
+
- Validity - +
+ {validity.toLowerCase() === 'valid' ? ( + + ) : ( + + )} +
+
- Detached - +
+ {orphaned ? ( + + ) : ( + + )} +
+
- View -
- - {data.frame.metadata.node} + + {attributes && ( +
+ + setFrameBlock({ blockRoot, frameId: data.frame.metadata.id }) + } + > + - -
-
- {seen && - (canonical ? ( - - ) : ( - - ))} -
-
-
- {seen ? ( - - ) : ( - - )} -
-
-
- {attributes?.checkpoint === 'finalized' ? ( - - ) : ( - - )} -
-
-
- {attributes?.checkpoint === 'justified' ? ( - - ) : ( - - )} -
-
-
- {validity.toLowerCase() === 'valid' ? ( - - ) : ( - - )} -
-
-
- {orphaned ? ( - - ) : ( - - )} -
-
- {attributes && ( -
- - setFrameBlock({ blockRoot, frameId: data.frame.metadata.id }) - } - > - - -
- )} -
-
-
+
+ )} + + + ); + })} + +
-
+ ); } diff --git a/web/src/components/AggregatedFramesSummary.tsx b/web/src/components/AggregatedFramesSummary.tsx index 40923e5..296ebe4 100644 --- a/web/src/components/AggregatedFramesSummary.tsx +++ b/web/src/components/AggregatedFramesSummary.tsx @@ -1,14 +1,19 @@ -import { MagnifyingGlassIcon, ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; +import { MagnifyingGlassIcon } from '@heroicons/react/20/solid'; import classNames from 'clsx'; import ReactTimeAgo from 'react-time-ago'; -import { Link } from 'wouter'; +import Link from '@components/Link'; import { ProcessedData, WeightedNodeAttributes } from '@app/types/graph'; import Download from '@components/Download'; import Loading from '@components/Loading'; +import { SummaryLink } from '@components/Summary'; import useSelection from '@contexts/selection'; import { useFrameQueries } from '@hooks/useQuery'; import { aggregateProcessedData } from '@utils/graph'; +import { truncateHash } from '@utils/strings'; + +const HEADER_CELL = 'px-2.5 py-2 text-left text-xs font-semibold text-foreground'; +const BODY_CELL = 'whitespace-nowrap px-2.5 py-2 text-sm text-foreground'; export default function AggregatedFramesSummary({ ids }: { ids: string[] }) { const { clearAll } = useSelection(); @@ -25,206 +30,153 @@ export default function AggregatedFramesSummary({ ids }: { ids: string[] }) { ); return ( -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - {results.map(({ data }, i) => { - if (!data) - return ( - - - - ); - let head: WeightedNodeAttributes | undefined; - try { - head = data.graph.getNodeAttributes(data.graph.getAttribute('head')); - } catch (err) { - // ignore - } +
+
+
- Source - - Taken At - - Head - - Head Root - - Finalized - - Justified - - Snapshot ID - - View -
- Slot - - Root - - Epoch - - Root - - Epoch - - Root -
Data error
+ + + + + + + + + + + + + + + + + + + + + {results.map(({ data }, i) => { + if (!data) + return ( + + + + ); + let head: WeightedNodeAttributes | undefined; + try { + head = data.graph.getNodeAttributes(data.graph.getAttribute('head')); + } catch (err) { + // ignore + } - const isCanonicalHead = - graph.getAttribute('head') === data.graph.getAttribute('head'); - return ( - - - - - - - - - - - - - ); - })} - -
+ Source + + Taken At + + Head + + Finalized + + Justified + + Snapshot ID + + View +
+ Slot + + Root + + Epoch + + Root + + Epoch + + Root +
+ Data error +
- - {data.frame.metadata.node} - - - - - - ({new Date(data.frame.metadata.fetched_at).toISOString()}) - - - {head?.slot} - - {head?.blockRoot} - - {data.frame.data.finalized_checkpoint?.epoch} - - {data.frame.data.finalized_checkpoint?.root} - - {data.frame.data.justified_checkpoint?.epoch} - - {data.frame.data.justified_checkpoint?.root} - - - {data.frame.metadata.id} - - - - - - - -
-
-
-
-
+ const isCanonicalHead = + graph.getAttribute('head') === data.graph.getAttribute('head'); + return ( + + + + {data.frame.metadata.node} + + + + + + + {head?.slot} + + + {head?.blockRoot && truncateHash(head.blockRoot)} + + {data.frame.data.finalized_checkpoint?.epoch} + + {data.frame.data.finalized_checkpoint?.root && + truncateHash(data.frame.data.finalized_checkpoint.root)} + + {data.frame.data.justified_checkpoint?.epoch} + + {data.frame.data.justified_checkpoint?.root && + truncateHash(data.frame.data.justified_checkpoint.root)} + + + + {truncateHash(data.frame.metadata.id)} + + + + + + + + + + ); + })} + +
); diff --git a/web/src/components/AggregatedNode.tsx b/web/src/components/AggregatedNode.tsx index 9fc7dd4..54104e0 100644 --- a/web/src/components/AggregatedNode.tsx +++ b/web/src/components/AggregatedNode.tsx @@ -45,70 +45,50 @@ function AggregatedNode({ const [color, backgroundColor, borderColor, title] = (() => { if (valid !== seen) { return [ - 'text-red-600', - 'text-red-800', - 'border-red-500 dark:border-red-900', + 'text-invalid-ring', + 'text-invalid-deep', + 'border-invalid-edge', `${seen - valid} NOT VALID`, ]; } if (orphans > 0) { return [ - 'text-red-600', - 'text-red-800', - 'border-red-500 dark:border-red-900', + 'text-invalid-ring', + 'text-invalid-deep', + 'border-invalid-edge', `${orphans} DETACHED`, ]; } if (finalizedCheckpoints > 0) { - return [ - 'text-fuchsia-600', - 'text-fuchsia-800', - 'border-fuchsia-500 dark:border-fuchsia-900', - 'FINALIZED', - ]; + return ['text-finalized-ring', 'text-finalized-deep', 'border-finalized-edge', 'FINALIZED']; } if (justifiedCheckpoints > 0) { - return [ - 'text-indigo-600', - 'text-indigo-800', - 'border-indigo-500 dark:border-indigo-900', - 'JUSTIFIED', - ]; + return ['text-justified-ring', 'text-justified-deep', 'border-justified-edge', 'JUSTIFIED']; } switch (type) { case 'canonical': if (optimistic > 0) { return [ - 'text-yellow-600', - 'text-yellow-800', - 'border-yellow-500 dark:border-yellow-900', + 'text-optimistic-ring', + 'text-optimistic-deep', + 'border-optimistic-edge', `${optimistic}/${valid} OPTIMISTIC`, ]; } - return [ - 'text-emerald-600', - 'text-emerald-800', - 'border-emerald-500 dark:border-emerald-900', - 'VALID', - ]; + return ['text-canonical-ring', 'text-canonical-deep', 'border-canonical-edge', 'VALID']; case 'fork': return [ - 'text-amber-600', - 'text-amber-800', - 'border-amber-500 dark:border-amber-900', + 'text-fork-ring', + 'text-fork-deep', + 'border-fork-edge', optimistic > 0 ? `${optimistic}/${valid} OPTIMISTIC` : 'VALID', ]; default: - return [ - 'text-emerald-600', - 'text-emerald-800', - 'border-emerald-500 dark:border-emerald-900', - type, - ]; + return ['text-canonical-ring', 'text-canonical-deep', 'border-canonical-edge', type]; } })(); @@ -118,7 +98,7 @@ function AggregatedNode({ className={classNames( 'absolute flex flex-col items-center justify-center rounded-full cursor-pointer gap-3 shadow-inner-xl', borderColor, - isHighlighted ? 'bg-stone-300 dark:bg-stone-500' : 'bg-stone-200 dark:bg-stone-600', + isHighlighted ? 'bg-track' : 'bg-field', className, )} style={{ @@ -139,11 +119,11 @@ function AggregatedNode({ color={color} backgroundColor={backgroundColor} /> -

{title}

-

+

{title}

+

{hash.substring(0, 6)}...{hash.substring(hash.length - 4)}

-

+

{finalizedCheckpoints > 0 || justifiedCheckpoints > 0 ? ( <> diff --git a/web/src/components/BYOFrameBlockSummary.tsx b/web/src/components/BYOFrameBlockSummary.tsx index 87ec687..b1a56f6 100644 --- a/web/src/components/BYOFrameBlockSummary.tsx +++ b/web/src/components/BYOFrameBlockSummary.tsx @@ -2,10 +2,10 @@ import ReactTimeAgo from 'react-time-ago'; import Download from '@components/Download'; import Loading from '@components/Loading'; +import { SummaryCard, SummaryRow, SummarySection, ValidityBadge } from '@components/Summary'; import useEthereum from '@contexts/ethereum'; import useFocus from '@contexts/focus'; import { FrameBlock } from '@contexts/selection'; -import { truncateHash } from '@utils/strings'; export default function BYOFrameBlockSummary({ blockRoot }: FrameBlock) { const { byoData: data } = useFocus(); @@ -23,121 +23,44 @@ export default function BYOFrameBlockSummary({ blockRoot }: FrameBlock) { return ( <> -

-
-
-
-
Epoch
-
- {Math.floor(Number.parseInt(node.slot) / slotsPerEpoch)} -
-
-
-
Slot
-
- {node.slot} -
-
-
-
- Snapshot Time -
-
- - ({data.frame.metadata.fetched_at}) -
-
-
-
Block Root
-
- - - {truncateHash(node.block_root)} - - - - {node.block_root} -
-
-
-
- Parent Root -
-
- - - {truncateHash(node.parent_root)} - - - - {node.parent_root} -
-
-
-
- Execution Block Hash -
-
- - - {truncateHash(node.execution_block_hash)} - - - - {node.execution_block_hash} -
-
-
-
Weight
-
- {node.weight} -
-
-
-
Validity
-
- {node.validity} -
-
-
-
- Justified Epoch -
-
- {node.justified_epoch} -
-
-
-
- Finalized Epoch -
-
- {node.finalized_epoch} -
-
- {node.extra_data && ( - <> -
-
- Extra data -
-
- {Object.entries(node.extra_data).map(([key, value]) => ( -
-
- {key.replaceAll('_', ' ')} -
-
- {`${value}`} -
-
- ))} - - )} -
-
-
-
+ + + {Math.floor(Number.parseInt(node.slot) / slotsPerEpoch)} + + {node.slot} + + + {data.frame.metadata.fetched_at} + + + {node.block_root} + + + {node.parent_root} + + + {node.execution_block_hash} + + + {node.weight} + + + + + {node.justified_epoch} + {node.finalized_epoch} + {node.extra_data && ( + <> + + {Object.entries(node.extra_data).map(([key, value]) => ( + + {`${value}`} + + ))} + + )} + +
{ + if (new URLSearchParams(window.location.search).get('t')) { + navigate(pathname, { replace: true }); + } + }, [pathname, navigate]); + + return null; +} diff --git a/web/src/components/ConcatNode.tsx b/web/src/components/ConcatNode.tsx index 506c789..2664162 100644 --- a/web/src/components/ConcatNode.tsx +++ b/web/src/components/ConcatNode.tsx @@ -22,8 +22,8 @@ function ConcatNode({ id={id} className={classNames( 'absolute flex flex-col items-center justify-center rounded-full gap-3 shadow-inner-xl', - 'border-dashed border-2 border-stone-400 dark:border-stone-500', - 'bg-stone-100 dark:bg-stone-700', + 'border-dashed border-2 border-faint', + 'bg-field', className, )} style={{ @@ -33,8 +33,8 @@ function ConcatNode({ height: `${radius * 2}px`, }} > -

CONCAT

-

+

CONCAT

+

{slotStart} → {slotEnd}

diff --git a/web/src/components/Control.tsx b/web/src/components/Control.tsx index 5ee1f9a..161d7e0 100644 --- a/web/src/components/Control.tsx +++ b/web/src/components/Control.tsx @@ -10,6 +10,7 @@ import { import EditableInput from '@components/EditableInput'; import useEthereum from '@contexts/ethereum'; import useFocus from '@contexts/focus'; +import useNow from '@hooks/useNow'; import useOutsideInteraction from '@hooks/useOutsideInteraction'; function TimelineControl() { @@ -33,8 +34,9 @@ function TimelineControl() { playing, } = useFocus(); const { genesisTime, secondsPerSlot } = useEthereum(); + const now = useNow(); - const slotDiff = Math.floor((Date.now() - genesisTime) / 1000 / secondsPerSlot) - focusedSlot; + const slotDiff = Math.floor((now - genesisTime) / 1000 / secondsPerSlot) - focusedSlot; const isCloseToLiveSlot = slotDiff <= 3 && slotDiff >= -1; const handleBack = () => { @@ -60,11 +62,11 @@ function TimelineControl() { return (
-
+
@@ -78,7 +80,7 @@ function TimelineControl() {
@@ -92,7 +94,7 @@ function TimelineControl() {
@@ -108,7 +110,7 @@ function TimelineControl() {
- + @@ -149,14 +151,12 @@ function TimelineControl() { > diff --git a/web/src/components/Download.tsx b/web/src/components/Download.tsx index 02705ff..56ec391 100644 --- a/web/src/components/Download.tsx +++ b/web/src/components/Download.tsx @@ -21,7 +21,7 @@ export default function Download({ href={`data:${type};charset=utf-8,${encodeURIComponent(data)}`} download={filename} className={classNames( - 'flex items-center rounded transition hover:bg-stone-900/5 dark:hover:bg-white/5 gap-2', + 'flex items-center rounded transition hover:bg-overlay/5 gap-2', `text-${size}`, size === 'sm' && 'p-2', size === 'md' && 'p-3', diff --git a/web/src/components/EditableInput.tsx b/web/src/components/EditableInput.tsx index b833458..f8ccda0 100644 --- a/web/src/components/EditableInput.tsx +++ b/web/src/components/EditableInput.tsx @@ -10,8 +10,10 @@ type ValueType = { : never; }; -interface Props - extends Omit, 'value' | 'onChange' | 'type'> { +interface Props extends Omit< + HTMLAttributes, + 'value' | 'onChange' | 'type' +> { value: ValueType[T]; onChange: (newValue: ValueType[T]) => void; type: T; @@ -49,11 +51,15 @@ function EditableInput({ value, onChange, type, id }: Props } }, [isEditing]); - useEffect(() => { + // Sync the draft with the external value outside of editing, adjusting + // state during render instead of in an effect. + const [prevSync, setPrevSync] = useState({ value, isEditing }); + if (prevSync.value !== value || prevSync.isEditing !== isEditing) { + setPrevSync({ value, isEditing }); if (!isEditing) { setInputValue(value); } - }, [value, isEditing]); + } const handleSave = () => { if (isEditing) { @@ -77,7 +83,7 @@ function EditableInput({ value, onChange, type, id }: Props id={id} ref={inputRef} type={type} - className="pl-2 bg-stone-100 dark:bg-stone-500 block w-full rounded-md border-0 py-1 text-stone-900 dark:text-stone-100 shadow-sm ring-1 ring-inset ring-stone-300 dark:ring-stone-700 placeholder:text-stone-400 focus:ring-2 focus:ring-inset focus:ring-stone-600 text-sm leading-6" + className="pl-2 bg-field block w-full rounded-md border-0 py-1 text-foreground shadow-sm ring-1 ring-inset ring-border-strong placeholder:text-faint focus:ring-2 focus:ring-inset focus:ring-active text-sm leading-6" value={formattedValue(inputValue)} onChange={e => setInputValue(e.target.value as unknown as ValueType[T])} onBlur={handleSave} @@ -88,7 +94,7 @@ function EditableInput({ value, onChange, type, id }: Props +
{leftSideRulers}
-
-
-
-
-
Epoch
-
- {Math.floor(Number.parseInt(node.slot) / slotsPerEpoch)} -
-
-
-
Slot
-
- {node.slot} -
-
-
-
- Snapshot Time -
-
- - ({data.frame.metadata.fetched_at}) -
-
-
-
- Snapshot ID -
-
- - {data.frame.metadata.id} - - -
-
-
-
Source
-
- - {data.frame.metadata.node} - - -
-
-
-
Block Root
-
- - - {truncateHash(node.block_root)} - - - - {node.block_root} -
-
-
-
- Parent Root -
-
- - - {truncateHash(node.parent_root)} - - - - {node.parent_root} -
-
-
-
- Execution Block Hash -
-
- - - {truncateHash(node.execution_block_hash)} - - - - {node.execution_block_hash} -
-
-
-
Weight
-
- {node.weight} -
-
-
-
Validity
-
- {node.validity} -
-
-
-
- Justified Epoch -
-
- {node.justified_epoch} -
-
-
-
- Finalized Epoch -
-
- {node.finalized_epoch} -
-
- {node.extra_data && ( - <> -
-
- Extra data -
-
- {Object.entries(node.extra_data).map(([key, value]) => ( -
-
- {key.replaceAll('_', ' ')} -
-
- {`${value}`} -
-
- ))} - - )} -
-
-
-
+ + + {Math.floor(Number.parseInt(node.slot) / slotsPerEpoch)} + + {node.slot} + + + {data.frame.metadata.fetched_at} + + + + {data.frame.metadata.id} + + + + + {data.frame.metadata.node} + + + + {node.block_root} + + + {node.parent_root} + + + {node.execution_block_hash} + + + {node.weight} + + + + + {node.justified_epoch} + {node.finalized_epoch} + {node.extra_data && ( + <> + + {Object.entries(node.extra_data).map(([key, value]) => ( + + {`${value}`} + + ))} + + )} + +
-
-
-
-
-
ID
-
- - {data.frame.metadata.id} - - -
-
-
-
Taken at
-
- - - ({new Date(data.frame.metadata.fetched_at).toISOString()}) - -
-
-
-
Source
-
- - {data.frame.metadata.node} - - -
-
-
-
- Wall clock Epoch -
-
- {data.frame.metadata.wall_clock_epoch} -
-
-
-
- Wall clock slot -
-
- {data.frame.metadata.wall_clock_slot} -
-
- {data.frame.metadata.labels && ( - <> -
-
Labels
-
- {data.frame.metadata.labels?.map(label => { - const [key, value] = parseLabel(label); - return ( -
-
- {key.replaceAll('_', ' ')} -
-
- {value} -
-
- ); - })} - - )} -
-
-
-
+ + + + {data.frame.metadata.id} + + + + + + {new Date(data.frame.metadata.fetched_at).toISOString()} + + + + + {data.frame.metadata.node} + + + {data.frame.metadata.wall_clock_epoch} + {data.frame.metadata.wall_clock_slot} + {data.frame.metadata.labels && data.frame.metadata.labels.length > 0 && ( + <> + + {data.frame.metadata.labels?.map(label => { + const [key, value] = parseLabel(label); + return ( + + {value} + + ); + })} + + )} + +
; + title?: string; + children?: ReactNode; +} + +/** + * The app's link primitive: forky composes paths on a single catch-all splat + * route, so links take a plain `href` path string and route it through the + * splat param (see hooks/useAppNavigation.ts for the programmatic version). + */ +export default function Link({ href, ...props }: Props) { + if (href === '/') { + return ; + } + + return ; +} diff --git a/web/src/components/Loading.tsx b/web/src/components/Loading.tsx index 37ea360..41a07b6 100644 --- a/web/src/components/Loading.tsx +++ b/web/src/components/Loading.tsx @@ -15,7 +15,7 @@ export default function Loading({
diff --git a/web/src/components/ModeToggle.tsx b/web/src/components/ModeToggle.tsx index d28330c..35313d0 100644 --- a/web/src/components/ModeToggle.tsx +++ b/web/src/components/ModeToggle.tsx @@ -33,12 +33,12 @@ export function ModeToggle() { return ( ); } diff --git a/web/src/components/Ruler.tsx b/web/src/components/Ruler.tsx index f11f7bd..76ab2aa 100644 --- a/web/src/components/Ruler.tsx +++ b/web/src/components/Ruler.tsx @@ -37,7 +37,7 @@ const Ruler: React.FC = ({
= ({ {markText && isCentimeter && i !== 0 && i != totalSubmarks && ( @@ -69,11 +69,7 @@ const Ruler: React.FC = ({ >
{children}
- {summary && ( - - {summary} - - )} + {summary && {summary}}
{ + // Close the dialog when the route actually changes, adjusting state + // during render instead of in an effect. + const [prevLocation, setPrevLocation] = useState(location); + if (prevLocation !== location) { + setPrevLocation(location); if (open) { setOpen(false); } - }, [location, open]); + } return ( <> setOpen(true)} title="Share link" - className="fixed z-10 right-6 lg:right-8 top-20 text-stone-700 dark:text-stone-300 cursor-pointer w-10 h-10 rounded-md transition hover:bg-stone-900/5 dark:hover:bg-white/5" + className="fixed z-10 right-6 lg:right-8 top-20 text-muted cursor-pointer w-10 h-10 rounded-md transition hover:bg-overlay/5" > - - - -
- + + -
-
- - -
-
-
- -
-
-
-
- +
+
+ +
+
+
+
- - -
+
+
+
+ +
+
-
- +
+
); } diff --git a/web/src/components/Slot.tsx b/web/src/components/Slot.tsx index 40771f8..7caef29 100644 --- a/web/src/components/Slot.tsx +++ b/web/src/components/Slot.tsx @@ -2,7 +2,7 @@ import React, { useMemo, ReactNode } from 'react'; import classNames from 'clsx'; -import { FrameMetaData } from '@app/types/api'; +import { FrameMetadata } from '@api'; import Ruler from '@components/Ruler'; import SnapshotMarker from '@components/SnapshotMarker'; import useEthereum from '@contexts/ethereum'; @@ -33,7 +33,7 @@ function Slot({ subMarks, slot, shouldFetch = false, segments }: Props) { const groupedMarkers = useMemo(() => { const groupSize = 100 / segments; const groups = - data?.reduce>((acc, frame) => { + data?.reduce>((acc, frame) => { if (node && frame.node !== node) return acc; const timeIntoSlot = new Date(frame.fetched_at).getTime() - slotStart; @@ -58,10 +58,10 @@ function Slot({ subMarks, slot, shouldFetch = false, segments }: Props) { 'h-24 shadow-inner-xl', isLoading && shouldFetch && 'animate-pulse dark:animate-pulse-light', isLoading - ? 'bg-stone-200 dark:bg-stone-800/95' + ? 'bg-surface-raised dark:bg-surface-raised/95' : error - ? 'bg-rose-200 dark:bg-rose-950/95' - : 'bg-stone-300 dark:bg-stone-800', + ? 'bg-danger-surface dark:bg-danger-surface/95' + : 'bg-track', )} marks={secondsPerSlot} subMarks={subMarks} diff --git a/web/src/components/SlotBoundary.tsx b/web/src/components/SlotBoundary.tsx index c11aebe..10dc89c 100644 --- a/web/src/components/SlotBoundary.tsx +++ b/web/src/components/SlotBoundary.tsx @@ -1,6 +1,5 @@ import { memo } from 'react'; -import { Transition } from '@headlessui/react'; import classNames from 'clsx'; function SlotBoundary({ @@ -23,50 +22,39 @@ function SlotBoundary({ textOffset: number; }) { return ( - -
-
+
+ {epoch && ( +

- {epoch && ( -

- EPOCH {epoch} -

- )} - {slot && ( -

- SLOT {slot} -

- )} -
-
+ > + EPOCH {epoch} +

+ )} + {slot && ( +

+ SLOT {slot} +

+ )} +
); } diff --git a/web/src/components/SlotDial.tsx b/web/src/components/SlotDial.tsx index 324cb30..1fba1fd 100644 --- a/web/src/components/SlotDial.tsx +++ b/web/src/components/SlotDial.tsx @@ -51,7 +51,7 @@ const SlotDial = () => { }); return ( -
+
{leftSideRulers}
diff --git a/web/src/components/SnapshotMarker.tsx b/web/src/components/SnapshotMarker.tsx index 6652d00..10afc02 100644 --- a/web/src/components/SnapshotMarker.tsx +++ b/web/src/components/SnapshotMarker.tsx @@ -3,7 +3,7 @@ import { memo, useMemo } from 'react'; import { Popover, PopoverButton, PopoverPanel } from '@headlessui/react'; import classNames from 'clsx'; -import { FrameMetaData } from '@app/types/api'; +import { FrameMetadata } from '@api'; import useSelection from '@contexts/selection'; function SnapshotMarker({ @@ -11,7 +11,7 @@ function SnapshotMarker({ activeIds, percentage, }: { - metadata: FrameMetaData[]; + metadata: FrameMetadata[]; activeIds: string[]; percentage: string; }) { @@ -25,14 +25,14 @@ function SnapshotMarker({ const isActive = activeIds.includes(metadata[i].id); const isReorg = metadata[i].event_source === 'xatu_reorg_event'; - let color = 'bg-sky-400 dark:bg-sky-700'; + let color = 'bg-marker-time'; if (isReorg) { - color = 'dark:bg-amber-400 bg-amber-700'; + color = 'bg-marker'; if (isActive) { - color = 'bg-amber-600 dark:bg-amber-500'; + color = 'bg-marker-active'; } } else if (isActive) { - color = 'bg-sky-600 dark:bg-sky-500'; + color = 'bg-marker-time-active'; } segments.push( @@ -84,15 +84,11 @@ function SnapshotMarker({ {segments} - + {metadata.map(meta => ( -
setFrameId(meta.id)} - > -
{meta.id}
-
{meta.node}
+
setFrameId(meta.id)}> +
{meta.id}
+
{meta.node}
))} diff --git a/web/src/components/Summary.tsx b/web/src/components/Summary.tsx new file mode 100644 index 0000000..48d133f --- /dev/null +++ b/web/src/components/Summary.tsx @@ -0,0 +1,97 @@ +import { ReactNode } from 'react'; + +import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; +import classNames from 'clsx'; + +import Link from '@components/Link'; + +/** + * Shared building blocks for the slide-out selection panel: a compact, + * consistent key/value card used by every summary state (snapshot, block, + * aggregated, BYO). + */ + +export function SummaryCard({ children }: { children: ReactNode }) { + return ( +
+
{children}
+
+ ); +} + +export function SummaryRow({ + label, + mono = false, + children, +}: { + label: string; + mono?: boolean; + children: ReactNode; +}) { + return ( +
+
{label}
+
+ {children} +
+
+ ); +} + +export function SummarySection({ title }: { title: string }) { + return ( +
+
{title}
+
+ ); +} + +export function SummaryLink({ + href, + onClick, + children, +}: { + href: string; + onClick?: () => void; + children: ReactNode; +}) { + return ( + + {children} +
+
+
- - +
+
); diff --git a/web/src/parts/FrameFooter.tsx b/web/src/parts/FrameFooter.tsx index e4da499..ca66bf4 100644 --- a/web/src/parts/FrameFooter.tsx +++ b/web/src/parts/FrameFooter.tsx @@ -1,7 +1,7 @@ import { memo } from 'react'; import { RectangleGroupIcon, RectangleStackIcon } from '@heroicons/react/24/solid'; -import { Link } from 'wouter'; +import Link from '@components/Link'; import Download from '@components/Download'; import useAction from '@hooks/useActive'; @@ -13,12 +13,12 @@ function FrameFooter() { return (
-
+
- + Aggregated View @@ -26,7 +26,7 @@ function FrameFooter() { {data && ( <> - + Source View diff --git a/web/src/parts/Graph.tsx b/web/src/parts/Graph.tsx index 218d1ec..78f5e57 100644 --- a/web/src/parts/Graph.tsx +++ b/web/src/parts/Graph.tsx @@ -10,7 +10,8 @@ import { } from '@heroicons/react/24/solid'; import classNames from 'clsx'; import { TransformWrapper, TransformComponent, ReactZoomPanPinchRef } from 'react-zoom-pan-pinch'; -import { useLocation, Link } from 'wouter'; +import Link from '@components/Link'; +import { useAppNavigate, usePathname } from '@hooks/useAppNavigation'; import SlotBoundary from '@app/components/SlotBoundary'; import { AggregatedNodeAttributes, ProcessedData, WeightedNodeAttributes } from '@app/types/graph'; @@ -35,7 +36,8 @@ function calculateScaleMultiplier(windowWidth: number, windowHeight: number) { } function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; unique: string }) { - const [location, navigate] = useLocation(); + const location = usePathname(); + const navigate = useAppNavigate(); const { setFrameId, setAggregatedFrameIds, setFrameBlock, setAggregatedFramesBlock } = useSelection(); const { slotsPerEpoch } = useEthereum(); @@ -49,17 +51,11 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un const isBYO = location.startsWith('/byo'); const [windowWidth, windowHeight] = useWindowSize(); - const [scaleMultiplier, setScaleMultiplier] = useState( - calculateScaleMultiplier(windowWidth, windowHeight), - ); + const scaleMultiplier = calculateScaleMultiplier(windowWidth, windowHeight); const [scale, setScale] = useState(scaleMultiplier); const [focused, setFocused] = useState(true); const [isSummaryCollapsed, setIsSummaryCollapsed] = useState(false); - useEffect(() => { - setScaleMultiplier(calculateScaleMultiplier(windowWidth, windowHeight)); - }, [windowHeight, windowWidth]); - useEffect(() => { if (focused) ref.current?.zoomToElement('head', scaleMultiplier); }, [nodes, focused, scaleMultiplier]); @@ -83,7 +79,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un x={SPACING_X - RADIUS / 2 + index * SPACING_X} y={-SPACING_Y + RADIUS - 1800 / 2} textOffset={SPACING_Y / 2 - RADIUS / 1.5} - className="bg-gradient-to-t from-stone-100 dark:from-stone-900 from-10% dark:from-10% via-stone-500 dark:via-stone-500 via-50% dark:via-50% to-stone-100 dark:to-stone-900 to-90% dark:to-90%" + className="column-fade" /> ); }); @@ -126,9 +122,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un href={`/node/${frame.metadata.node}`} className={classNames( 'font-semibold', - isAggregatedHead - ? 'text-green-800 dark:text-green-300' - : 'text-amber-500 dark:text-amber-300', + isAggregatedHead ? 'text-success' : 'text-warning', )} > {truncateHash(weightedHead?.blockRoot)} @@ -149,7 +143,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un y1={edge.source.y + RADIUS} x2={edge.target.x + RADIUS} y2={edge.target.y + RADIUS} - className="dark:bg-stone-50 bg-stone-700" + className="bg-edge" thickness={12} /> )); @@ -252,7 +246,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un <> {location.startsWith('/node/') && ( {isSummaryCollapsed ? ( ) : ( -
+
Sources
-
+
- {formattedSummary} + {formattedSummary}
)} @@ -357,7 +351,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un title="Focus to the head of the canonical chain" className={classNames( isBYO ? 'top-20' : 'top-36', - 'fixed z-10 right-6 lg:right-8 top-36 text-stone-700 dark:text-stone-300 cursor-pointer w-10 h-10 rounded-md transition hover:bg-stone-900/5 dark:hover:bg-white/5', + 'fixed z-10 right-6 lg:right-8 top-36 text-muted cursor-pointer w-10 h-10 rounded-md transition hover:bg-overlay/5', )} > Focus to the head of the canonical chain @@ -365,7 +359,7 @@ function Graph({ data, ids, unique }: { data: ProcessedData[]; ids: string[]; un <> - + )} diff --git a/web/src/parts/Header.tsx b/web/src/parts/Header.tsx index ac508ca..a564e58 100644 --- a/web/src/parts/Header.tsx +++ b/web/src/parts/Header.tsx @@ -1,13 +1,14 @@ -import { Fragment, useState } from 'react'; +import { useState } from 'react'; -import { Dialog, Transition, TransitionChild, DialogPanel } from '@headlessui/react'; +import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'; import { Bars3Icon, XMarkIcon, CalendarDaysIcon, DocumentArrowUpIcon, } from '@heroicons/react/24/outline'; -import { Link, useLocation } from 'wouter'; +import Link from '@components/Link'; +import { usePathname } from '@hooks/useAppNavigation'; import Walker from '@app/components/Walker'; import LogoSmall from '@assets/forky_logo_small.png'; @@ -15,29 +16,29 @@ import { ModeToggle } from '@components/ModeToggle'; export default function Header() { const [menuOpen, setMenuOpen] = useState(false); - const [location] = useLocation(); + const location = usePathname(); return ( -
+
- - - -
- -
-
-
- - -
- -
-
-
- + + +
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+

+ An Ethereum fork choice explorer +

+
+

+ About +

+

+ Forky captures, stores and + visualizes fork choice data from the Ethereum Beacon Chain.{' '} + Forky is designed to provide a + live view of the Ethereum network, along with historical access. +

+

+ While the Forky source code is + maintained by the Ethereum Foundation DevOps team, instances can be + operated by the community ❤️ +

+

+ If you'd like to run your own instance of{' '} + Forky, checkout out the{' '} + + Github repository + {' '} + for instructions. +

-
-
-
-

- An Ethereum fork choice explorer -

-
-

- About -

-

- Forky captures, stores and - visualizes fork choice data from the Ethereum Beacon Chain.{' '} - Forky is designed to provide - a live view of the Ethereum network, along with historical access. -

-

- While the Forky source code - is maintained by the Ethereum Foundation DevOps team, instances can - be operated by the community ❤️ -

-

- If you'd like to run your own instance of{' '} - Forky, checkout out the{' '} - - Github repository - {' '} - for instructions. -

-
-
-
-
- - -
+
+
+
- - +
+
); diff --git a/web/src/parts/Selection.tsx b/web/src/parts/Selection.tsx index 09d563f..79628db 100644 --- a/web/src/parts/Selection.tsx +++ b/web/src/parts/Selection.tsx @@ -1,9 +1,9 @@ -import { Fragment, useEffect } from 'react'; +import { useEffect } from 'react'; -import { Dialog, Transition, TransitionChild, DialogPanel, DialogTitle } from '@headlessui/react'; +import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react'; import { XMarkIcon } from '@heroicons/react/24/outline'; import classNames from 'clsx'; -import { useLocation } from 'wouter'; +import { usePathname } from '@hooks/useAppNavigation'; import AggregatedBlockSummary from '@components/AggregatedBlockSummary'; import AggregatedFramesSummary from '@components/AggregatedFramesSummary'; @@ -15,89 +15,69 @@ import useSelection from '@contexts/selection'; export default function Selection() { const { frameId, aggregatedFrameIds, frameBlock, aggregatedFramesBlock, clearAll } = useSelection(); - const [location] = useLocation(); + const location = usePathname(); const isBYO = location.startsWith('/byo'); useEffect(clearAll, [location, clearAll]); return ( -
+
- - - -
- -
-
-
- - +
+
+
+ +
+
+ + {frameId && 'Snapshot'} + {aggregatedFrameIds && 'Aggregated Snapshots'} + {frameBlock && 'Block'} + {aggregatedFramesBlock && 'Aggregated Block'} + + +
+
+ {frameId && } + {aggregatedFrameIds && } + {frameBlock && !isBYO && } + {frameBlock && isBYO && } + {aggregatedFramesBlock && ( + )} - > -
-
-
- - {frameId && 'Snapshot'} - {aggregatedFrameIds && 'Aggregated Snapshots'} - {frameBlock && 'Block'} - {aggregatedFramesBlock && 'Aggregated Block'} - -
- -
-
-
- {frameId && } - {aggregatedFrameIds && } - {frameBlock && !isBYO && } - {frameBlock && isBYO && } - {aggregatedFramesBlock && ( - - )} -
- - -
+
+
+
-
-
+
+
); diff --git a/web/src/parts/Stage.tsx b/web/src/parts/Stage.tsx index b27c7ae..eee0aee 100644 --- a/web/src/parts/Stage.tsx +++ b/web/src/parts/Stage.tsx @@ -38,10 +38,7 @@ export default function Stage() { } return ( -
+
{!isLoading && }
); diff --git a/web/src/parts/Timeline.tsx b/web/src/parts/Timeline.tsx index bd6a917..571f1e0 100644 --- a/web/src/parts/Timeline.tsx +++ b/web/src/parts/Timeline.tsx @@ -8,16 +8,16 @@ export default function Timeline() { return (
-
+
-
+
- + - +
diff --git a/web/src/providers/application.tsx b/web/src/providers/application.tsx index ae053ae..9110d31 100644 --- a/web/src/providers/application.tsx +++ b/web/src/providers/application.tsx @@ -1,7 +1,5 @@ import { ReactNode } from 'react'; -import { navigate } from 'wouter/use-browser-location'; - import EthereumProvider, { Props as EthereumProps } from '@providers/ethereum'; import FocusProvider, { Props as FocusProps } from '@providers/focus'; import SelectionProvider, { Props as SelectionProps } from '@providers/selection'; @@ -14,10 +12,6 @@ interface Props { } function Provider({ children, ethereum, focus, selection }: Props) { - // clear the time param if it exists - if (new URLSearchParams(window.location.search).get('t')) { - navigate(window.location.pathname, { replace: true }); - } return ( diff --git a/web/src/routeTree.gen.ts b/web/src/routeTree.gen.ts new file mode 100644 index 0000000..7a34e77 --- /dev/null +++ b/web/src/routeTree.gen.ts @@ -0,0 +1,77 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as SplatRouteImport } from './routes/$' +import { Route as IndexRouteImport } from './routes/index' + +const SplatRoute = SplatRouteImport.update({ + id: '/$', + path: '/$', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/$': typeof SplatRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/$': typeof SplatRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/$': typeof SplatRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/$' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/$' + id: '__root__' | '/' | '/$' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + SplatRoute: typeof SplatRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/$': { + id: '/$' + path: '/$' + fullPath: '/$' + preLoaderRoute: typeof SplatRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + SplatRoute: SplatRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/web/src/routes/$.tsx b/web/src/routes/$.tsx new file mode 100644 index 0000000..1beb142 --- /dev/null +++ b/web/src/routes/$.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from '@tanstack/react-router'; + +import RouteView from './-RouteView'; + +export const Route = createFileRoute('/$')({ + component: RouteView, +}); diff --git a/web/src/routes/-RouteView.tsx b/web/src/routes/-RouteView.tsx new file mode 100644 index 0000000..dde3376 --- /dev/null +++ b/web/src/routes/-RouteView.tsx @@ -0,0 +1,34 @@ +import { useLocation } from '@tanstack/react-router'; + +import App from '@app/App'; + +/** + * Derives the application view from the current pathname. Forky's URL scheme + * composes paths (`/byo`, `/node/`, `/snapshot/`) with an optional + * `/events` suffix, so a single component reads the pathname and renders the + * App with the appropriate props. + */ +export default function RouteView() { + const pathname = useLocation({ select: location => location.pathname }); + + if (pathname.startsWith('/byo')) { + return ; + } + + if (pathname.startsWith('/snapshot/')) { + const id = pathname.slice('/snapshot/'.length).split('/')[0]; + + return ; + } + + if (pathname.startsWith('/node/')) { + const rest = pathname.slice('/node/'.length); + const parts = rest.split('/'); + const hasEvents = parts[parts.length - 1] === 'events'; + const node = hasEvents ? parts.slice(0, -1).join('/') : rest; + + return ; + } + + return ; +} diff --git a/web/src/routes/__root.tsx b/web/src/routes/__root.tsx new file mode 100644 index 0000000..d4053db --- /dev/null +++ b/web/src/routes/__root.tsx @@ -0,0 +1,5 @@ +import { createRootRoute, Outlet } from '@tanstack/react-router'; + +export const Route = createRootRoute({ + component: () => , +}); diff --git a/web/src/routes/index.tsx b/web/src/routes/index.tsx new file mode 100644 index 0000000..a09824a --- /dev/null +++ b/web/src/routes/index.tsx @@ -0,0 +1,7 @@ +import { createFileRoute } from '@tanstack/react-router'; + +import RouteView from './-RouteView'; + +export const Route = createFileRoute('/')({ + component: RouteView, +}); diff --git a/web/src/styles/global.css b/web/src/styles/global.css deleted file mode 100644 index 150ffc3..0000000 --- a/web/src/styles/global.css +++ /dev/null @@ -1,13 +0,0 @@ -@import "tailwindcss"; - -@custom-variant dark (&:where(.dark, .dark *)); - -/* fix for safari https://github.com/mdn/browser-compat-data/issues/17726 */ -.drop-shadow-sm, -.drop-shadow, -.drop-shadow-md, -.drop-shadow-lg, -.drop-shadow-xl, -.drop-shadow-2xl { - transform: translateZ(0) -} \ No newline at end of file diff --git a/web/src/types/api.ts b/web/src/types/api.ts index d837341..271a117 100644 --- a/web/src/types/api.ts +++ b/web/src/types/api.ts @@ -1,28 +1,9 @@ -export interface Checkpoint { - epoch: string; - root: string; -} - -export interface ForkChoiceNode { - slot: string; - block_root: string; - parent_root: string; - justified_epoch: string; - finalized_epoch: string; - weight: string; - validity: string; - execution_block_hash: string; - extra_data?: Record; -} +/** + * App-specific API view types. The wire types live in the generated client + * (`@api`) — only types that intentionally differ from the spec belong here. + */ -export interface ForkChoiceData { - justified_checkpoint?: Checkpoint; - finalized_checkpoint?: Checkpoint; - fork_choice_nodes?: ForkChoiceNode[]; - extra_data?: unknown; -} - -/* REQUESTS */ +/** Frame filter with the event sources the UI knows how to present. */ export interface FrameFilter { node?: string; before?: string; @@ -33,104 +14,3 @@ export interface FrameFilter { consensus_client?: string; event_source?: 'unknown' | 'beacon_node' | 'xatu_polling' | 'xatu_reorg_event'; } - -export interface PaginationCursor { - limit?: number; - offset?: number; - order?: string; -} - -export interface V1MetadataListSlotsRequest { - filter?: FrameFilter; - pagination?: PaginationCursor; -} - -export interface V1MetadataListRequest { - filter?: FrameFilter; - pagination?: PaginationCursor; -} - -export interface V1MetadataListNodesRequest { - filter?: FrameFilter; - pagination?: PaginationCursor; -} - -export interface V1MetadataListEpochsRequest { - filter?: FrameFilter; - pagination?: PaginationCursor; -} - -export interface V1MetadataListLabelsRequest { - filter?: FrameFilter; - pagination?: PaginationCursor; -} - -/* RESPONSE */ -export interface Response { - data?: T; -} - -export interface Frame { - data?: ForkChoiceData; - metadata?: FrameMetaData; -} - -export interface FrameMetaData { - id: string; - node: string; - fetched_at: string; - wall_clock_slot: number; - wall_clock_epoch: number; - labels?: string[] | null; - consensus_client?: string | null; - event_source?: string | null; -} - -export interface EthereumSpec { - seconds_per_slot: number; - slots_per_epoch: number; - genesis_time: string; -} - -export interface PaginationResponse { - total?: number; -} - -export interface V1MetadataListResponse { - frames?: FrameMetaData[]; - pagination?: PaginationResponse; -} - -export interface V1GetEthereumSpecResponse { - network_name: string; - spec?: EthereumSpec; -} - -export interface V1GetEthereumNowResponse { - slot?: number; - epoch?: number; -} - -export interface V1MetadataListNodesResponse { - nodes?: string[]; - pagination: PaginationResponse; -} - -export interface V1MetadataListSlotsResponse { - slots?: number[]; - pagination: PaginationResponse; -} - -export interface V1MetadataListEpochsResponse { - epochs?: number[]; - pagination: PaginationResponse; -} - -export interface V1MetadataListLabelsResponse { - labels?: string[]; - pagination: PaginationResponse; -} - -export interface V1GetFrameResponse { - frame?: Frame; -} diff --git a/web/src/types/graph.ts b/web/src/types/graph.ts index bc7fc49..a86cbfb 100644 --- a/web/src/types/graph.ts +++ b/web/src/types/graph.ts @@ -1,6 +1,6 @@ import Graphology from 'graphology'; -import { V1GetFrameResponse, FrameMetaData, Checkpoint } from '@app/types/api'; +import { Frame, FrameMetadata, Checkpoint } from '@api'; export interface ProcessedForkChoiceNode { slot: number; @@ -52,7 +52,7 @@ export interface WeightedGraphAttributes extends GraphAttributes { export interface AggregatedGraphAttributes extends GraphAttributes { nodes: { - metadata: FrameMetaData; + metadata: FrameMetadata; head?: WeightedNodeAttributes; justifiedCheckpoint?: Checkpoint; finalizedCheckpoint?: Checkpoint; @@ -79,7 +79,7 @@ export interface AggregatedNodeAttributes extends NodeAttributes { } export type ProcessedData = { - frame: Required['frame']>; + frame: Required; graph: WeightedGraph; }; diff --git a/web/src/utils/__tests__/api.test.ts b/web/src/utils/__tests__/api.test.ts index 0d44e65..f646ae5 100644 --- a/web/src/utils/__tests__/api.test.ts +++ b/web/src/utils/__tests__/api.test.ts @@ -1,4 +1,4 @@ -import { ForkChoiceNode, ForkChoiceData } from '@app/types/api'; +import { ForkChoiceNode, ForkChoice } from '@api'; import { equalForkChoiceNode, equalForkChoiceData, getCheckpointType } from '@utils/api'; function generateForkChoiceNode(): ForkChoiceNode { @@ -22,7 +22,7 @@ function generateForkChoiceNode(): ForkChoiceNode { }; } -function generateForkChoiceData(): ForkChoiceData { +function generateForkChoiceData(): ForkChoice { return { justified_checkpoint: { epoch: '1', root: '0x1' }, finalized_checkpoint: { epoch: '2', root: '0x2' }, @@ -82,13 +82,13 @@ describe('api', () => { expect(equalForkChoiceData(undefined, undefined)).toBe(false); }); - it('should return true for equal ForkChoiceData', () => { + it('should return true for equal ForkChoice', () => { const a = generateForkChoiceData(); const b = generateForkChoiceData(); expect(equalForkChoiceData(a, b)).toBe(true); }); - it('should return true for equal ForkChoiceData and ForkChoiceNodes', () => { + it('should return true for equal ForkChoice and ForkChoiceNodes', () => { const a = generateForkChoiceData(); const b = generateForkChoiceData(); a.fork_choice_nodes = [generateForkChoiceNode()]; diff --git a/web/src/utils/__tests__/functions.test.ts b/web/src/utils/__tests__/functions.test.ts index 7ca2e8f..14f7282 100644 --- a/web/src/utils/__tests__/functions.test.ts +++ b/web/src/utils/__tests__/functions.test.ts @@ -97,9 +97,8 @@ describe('functions', () => { it('should return different bigints for multiple calls within the same range', () => { const min = BigInt(1); const max = BigInt(100); - const result1 = randomBigInt(min, max); - const result2 = randomBigInt(min, max); - expect(result1).not.toBe(result2); + const results = new Set(Array.from({ length: 20 }, () => randomBigInt(min, max))); + expect(results.size).toBeGreaterThan(1); }); it('should return a bigint within large range', () => { diff --git a/web/src/utils/__tests__/graph.test.ts b/web/src/utils/__tests__/graph.test.ts index bfe76aa..a969d86 100644 --- a/web/src/utils/__tests__/graph.test.ts +++ b/web/src/utils/__tests__/graph.test.ts @@ -1,6 +1,6 @@ import Graphology from 'graphology'; -import { Frame } from '@app/types/api'; +import { Frame } from '@api'; import { NodeAttributes, WeightedNodeAttributes, diff --git a/web/src/utils/api-config.ts b/web/src/utils/api-config.ts new file mode 100644 index 0000000..05590b1 --- /dev/null +++ b/web/src/utils/api-config.ts @@ -0,0 +1,22 @@ +/** + * Runtime configuration for the generated API client (hey-api). + * + * Wired in via `openapi-ts.config.ts` (`runtimeConfigPath`). The generated + * client imports `createClientConfig` from here and calls it with its default + * config. Forky's API is unauthenticated and served from the same origin, so + * the base URL defaults to a relative path. + */ + +export const BASE_URL = import.meta.env.VITEST + ? 'http://localhost:5555' + : import.meta.env.VITE_API_URL || ''; + +interface ClientConfig { + baseUrl?: string; + fetch?: typeof fetch; +} + +export const createClientConfig = (config: T): T & { baseUrl: string } => ({ + ...config, + baseUrl: BASE_URL, +}); diff --git a/web/src/utils/api.ts b/web/src/utils/api.ts index 5110902..7242923 100644 --- a/web/src/utils/api.ts +++ b/web/src/utils/api.ts @@ -1,4 +1,4 @@ -import { ForkChoiceData, ForkChoiceNode } from '@app/types/api'; +import type { ForkChoice, ForkChoiceNode } from '@api'; import { randomHex, randomBigInt, randomInt } from '@utils/functions'; export function equalForkChoiceNode(a?: ForkChoiceNode, b?: ForkChoiceNode) { @@ -12,7 +12,7 @@ export function equalForkChoiceNode(a?: ForkChoiceNode, b?: ForkChoiceNode) { return true; } -export function equalForkChoiceData(a?: ForkChoiceData, b?: ForkChoiceData) { +export function equalForkChoiceData(a?: ForkChoice, b?: ForkChoice) { if (!a || !b) return false; // check if nodes length changed @@ -75,7 +75,7 @@ export function generateRandomForkChoiceData({ continueForkChance?: number; invalidChance?: number; } - | undefined = {}): ForkChoiceData { + | undefined = {}): ForkChoice { const totalSlots = randomInt(minSlots, maxSlots); const startSlot = totalSlots + @@ -133,7 +133,7 @@ export function generateRandomForkChoiceData({ justified_epoch: justifiedCheckpoint.epoch, finalized_epoch: finalizedCheckpoint.epoch, weight: currentWeight.toString(), - validity: invalidChance > Math.random() ? 'INVALID' : 'VALID', + validity: invalidChance > Math.random() ? 'invalid' : 'valid', execution_block_hash: randomHex(64), extra_data: extraData, }; @@ -152,14 +152,14 @@ export function generateRandomForkChoiceData({ const canonicalWeight = BigInt(nextForkChoiceNode.weight); const nextWeight = randomBigInt(0n, canonicalWeight); - let forkedNode = { + let forkedNode: ForkChoiceNode = { slot: (Number.parseInt(forkChoiceNode.slot) + randomInt(1, 5)).toString(), block_root: randomHex(64), parent_root: forkChoiceNode.block_root, justified_epoch: justifiedCheckpoint.epoch, finalized_epoch: finalizedCheckpoint.epoch, weight: nextWeight.toString(), - validity: invalidChance > Math.random() ? 'INVALID' : 'VALID', + validity: invalidChance > Math.random() ? 'invalid' : 'valid', execution_block_hash: randomHex(64), extra_data: { state_root: randomHex(64), @@ -184,7 +184,7 @@ export function generateRandomForkChoiceData({ justified_epoch: justifiedCheckpoint.epoch, finalized_epoch: finalizedCheckpoint.epoch, weight: randomBigInt(0n, BigInt(forkedNode.weight)).toString(), - validity: invalidChance > Math.random() ? 'INVALID' : 'VALID', + validity: invalidChance > Math.random() ? 'invalid' : 'valid', execution_block_hash: randomHex(64), extra_data: { state_root: randomHex(64), diff --git a/web/src/utils/graph.ts b/web/src/utils/graph.ts index c25fadb..3d71dcb 100644 --- a/web/src/utils/graph.ts +++ b/web/src/utils/graph.ts @@ -1,7 +1,7 @@ import Graphology from 'graphology'; import { Attributes } from 'graphology-types'; -import { ForkChoiceNode, Frame } from '@app/types/api'; +import { ForkChoiceNode, Frame } from '@api'; import { Graph, WeightedGraph, diff --git a/web/src/utils/tailwind.ts b/web/src/utils/tailwind.ts deleted file mode 100644 index 457a450..0000000 --- a/web/src/utils/tailwind.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Technically, tailwind config could be imported and the colors be extracted from there. - * However this adds ~100kb to the production bundle size, so we'll just hardcode them here - * for colors that are used in canvas/webgl components. - * - * https://tailwindcss.com/docs/configuration#referencing-in-java-script - */ - -export const colors = { - stone: { - 50: '#fafaf9', - 600: '#57534e', - 700: '#44403c', - 800: '#292524', - 900: '#1c1917', - }, - emerald: { - 600: '#059669', - 800: '#065f46', - }, - amber: { - 600: '#d97706', - 800: '#92400e', - }, - indigo: { - 600: '#4f46e5', - 800: '#3730a3', - }, - fuchsia: { - 600: '#c026d3', - 800: '#86198f', - }, - rose: { - 600: '#e11d48', - 800: '#9f1239', - }, -}; - -export const fonts = { - mono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace', - sans: 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"', - serif: 'ui-serif, Georgia, Cambria, "Times New Roman", Times, serif', -}; diff --git a/web/static.go b/web/static.go deleted file mode 100644 index e796dd2..0000000 --- a/web/static.go +++ /dev/null @@ -1,6 +0,0 @@ -package static - -import "embed" - -//go:embed build/* -var FS embed.FS diff --git a/web/tailwind.config.js b/web/tailwind.config.js deleted file mode 100644 index 76f410d..0000000 --- a/web/tailwind.config.js +++ /dev/null @@ -1,22 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], - theme: { - extend: { - boxShadow: { - 'inner-lg': '0px 0px 5px 1px rgba(0,0,0,0.5) inset', - 'inner-xl': '0px 0px 10px 2px rgba(0,0,0,0.5) inset', - }, - keyframes: { - 'pulse-light': { - '50%': { opacity: 0.97 }, - }, - }, - animation: { - 'pulse-light': 'pulse-light 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', - }, - }, - }, - plugins: [], - darkMode: 'class', -}; diff --git a/web/tsconfig.app.json b/web/tsconfig.app.json index 77233bc..327bad8 100644 --- a/web/tsconfig.app.json +++ b/web/tsconfig.app.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "baseUrl": ".", "target": "ES2020", "useDefineForClassFields": true, "lib": [ @@ -10,8 +9,7 @@ ], "allowJs": false, "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, + "esModuleInterop": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "ESNext", @@ -27,37 +25,40 @@ "jsx": "react-jsx", "paths": { "@app/*": [ - "src/*" + "./src/*" + ], + "@api": [ + "./src/api" ], "@api/*": [ - "src/api/*" + "./src/api/*" ], "@styles/*": [ - "src/styles/*" + "./src/styles/*" ], "@public/*": [ - "public/*" + "./public/*" ], "@parts/*": [ - "src/parts/*" + "./src/parts/*" ], "@components/*": [ - "src/components/*" + "./src/components/*" ], "@hooks/*": [ - "src/hooks/*" + "./src/hooks/*" ], "@assets/*": [ - "src/assets/*" + "./src/assets/*" ], "@utils/*": [ - "src/utils/*" + "./src/utils/*" ], "@providers/*": [ - "src/providers/*" + "./src/providers/*" ], "@contexts/*": [ - "src/contexts/*" + "./src/contexts/*" ] } }, @@ -66,6 +67,6 @@ "vitest.setup.ts" ], "exclude": [ - "src/**/__tests__/*" + "./src/**/__tests__/*" ] } diff --git a/web/vite.config.ts b/web/vite.config.ts index 19bb7a9..16aa574 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,12 +1,24 @@ +import { tanstackRouter } from '@tanstack/router-plugin/vite'; import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; import tailwindcss from '@tailwindcss/vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; export default defineConfig({ - plugins: [react(), tsconfigPaths(), tailwindcss()], + plugins: [ + tanstackRouter({ + routesDirectory: './src/routes', + generatedRouteTree: './src/routeTree.gen.ts', + autoCodeSplitting: false, + quoteStyle: 'single', + }), + react(), + tailwindcss(), + ], + resolve: { + tsconfigPaths: true, + }, build: { - outDir: 'build/frontend', + outDir: 'dist', }, server: { proxy: { diff --git a/web/vitest.config.ts b/web/vitest.config.ts index 8a30e6a..a48c34a 100644 --- a/web/vitest.config.ts +++ b/web/vitest.config.ts @@ -1,19 +1,14 @@ -import tsconfigPaths from 'vite-tsconfig-paths'; import { defineConfig, mergeConfig } from 'vitest/config'; -import GithubActionsReporter from 'vitest-github-actions-reporter'; import viteConfig from './vite.config.js'; export default mergeConfig( viteConfig, defineConfig({ - plugins: [tsconfigPaths()], test: { globals: true, environment: 'jsdom', setupFiles: 'vitest.setup.ts', - reporters: process.env.GITHUB_ACTIONS - ? ['default', new GithubActionsReporter()] - : ['default'], + reporters: process.env.GITHUB_ACTIONS ? ['default', 'github-actions'] : ['default'], coverage: {}, }, }), From 1112595f6404dac2a1b5dc462b401155690af37e Mon Sep 17 00:00:00 2001 From: Andrew Davis <1709934+Savid@users.noreply.github.com> Date: Wed, 10 Jun 2026 14:16:38 +1000 Subject: [PATCH 18/27] refactor(web): typed file routes, Storybook, split test suites Continue the web overhaul by replacing the catch-all splat route with typed file-based TanStack routes, adding a Storybook setup, and splitting the Vitest suite into unit and Storybook browser tests. Routing: - Drop the single splat route (`routes/$.tsx`, `routes/-RouteView.tsx`) in favor of concrete routes: `byo`, `events`, `node.$nodeId`, `snapshot.$frameId`, plus their non-nested `_.events` overlay variants. - Add `utils/routes.ts` (`parseAppRoute`, `nodePath`, `snapshotPath`, `eventsPathFor`, and `*EventsPath` helpers) as the single boundary that turns plain app path strings into typed route targets; cover it with `utils/__tests__/routes.test.ts`. - Rework `Link.tsx` and `useAppNavigation.ts` to dispatch parsed routes to typed `RouterLink`/`navigate` targets, falling back to a plain anchor / `window.location.assign` for unknown paths. - Thread events overlay state through props: `App` takes `eventsOpen` / `eventsCloseTo`, `Events` consumes them instead of sniffing the pathname, and each `_.events` route opens the overlay with the right close target. - Wire a `notFoundComponent` on the root route and simplify Header links. Storybook: - Add Storybook 10 (`.storybook/` config, preview, story routes, MSW setup) and stories for App, Fallbacks, and the component/parts library. - Add `src/stories/` fixtures and helpers shared across stories. - Register `eslint-plugin-storybook` and `tsconfig.storybook.json`. Testing: - Split Vitest: `vitest.config.unit.ts` (jsdom unit tests) and `vitest.config.ts` (Storybook tests in a Playwright/Chromium browser); add `test:unit*`, `test:storybook*`, and `test:ui` scripts. - Extract `ErrorBoundaryFallback` so the fallback can be story-tested. Tooling: - Bump msw to 2.14.6, add Storybook/Vitest browser/Playwright and supporting dev deps; ignore `storybook-static` and `.tanstack`. --- web/.gitignore | 4 +- web/.storybook/main.ts | 23 + web/.storybook/preview.tsx | 110 + web/.storybook/story-routes.tsx | 10 + web/.storybook/vitest-setup.ts | 22 + web/CLAUDE.md | 17 +- web/eslint.config.js | 19 +- web/package.json | 32 +- web/pnpm-lock.yaml | 2104 +++++++++++++++-- web/public/mockServiceWorker.js | 168 +- web/src/App.stories.tsx | 127 + web/src/App.tsx | 6 +- web/src/ErrorBoundary.tsx | 16 +- web/src/Fallbacks.stories.tsx | 23 + web/src/components/Controls.stories.tsx | 130 + .../components/GraphPrimitives.stories.tsx | 293 +++ web/src/components/Link.tsx | 35 +- web/src/components/Loading.stories.tsx | 41 + .../components/SelectionSummaries.stories.tsx | 143 ++ web/src/components/Summary.stories.tsx | 58 + web/src/components/Timeline.stories.tsx | 176 ++ web/src/hooks/useAppNavigation.ts | 63 +- web/src/parts/BYOFooter.stories.tsx | 94 + web/src/parts/Events.stories.tsx | 154 ++ web/src/parts/Events.tsx | 29 +- web/src/parts/FrameFooter.stories.tsx | 44 + web/src/parts/Graph.stories.tsx | 375 +++ web/src/parts/Header.stories.tsx | 44 + web/src/parts/Header.tsx | 5 +- web/src/parts/Selection.stories.tsx | 144 ++ web/src/parts/Stage.stories.tsx | 94 + web/src/routeTree.gen.ts | 167 +- web/src/routes/$.tsx | 7 - web/src/routes/-AppRoute.tsx | 13 + web/src/routes/-RouteView.tsx | 34 - web/src/routes/__root.tsx | 3 + web/src/routes/byo.tsx | 7 + web/src/routes/byo_.events.tsx | 7 + web/src/routes/events.tsx | 7 + web/src/routes/index.tsx | 4 +- web/src/routes/node.$nodeId.tsx | 11 + web/src/routes/node_.$nodeId.events.tsx | 12 + web/src/routes/snapshot.$frameId.tsx | 11 + web/src/routes/snapshot_.$frameId.events.tsx | 12 + web/src/stories/fixtures.ts | 582 +++++ web/src/stories/storybook.tsx | 138 ++ web/src/utils/__tests__/routes.test.ts | 39 + web/src/utils/routes.ts | 98 + web/tsconfig.app.json | 63 +- web/tsconfig.json | 1 + web/tsconfig.node.json | 2 +- web/tsconfig.storybook.json | 9 + web/vitest.config.ts | 61 +- web/vitest.config.unit.ts | 22 + 54 files changed, 5495 insertions(+), 418 deletions(-) create mode 100644 web/.storybook/main.ts create mode 100644 web/.storybook/preview.tsx create mode 100644 web/.storybook/story-routes.tsx create mode 100644 web/.storybook/vitest-setup.ts create mode 100644 web/src/App.stories.tsx create mode 100644 web/src/Fallbacks.stories.tsx create mode 100644 web/src/components/Controls.stories.tsx create mode 100644 web/src/components/GraphPrimitives.stories.tsx create mode 100644 web/src/components/Loading.stories.tsx create mode 100644 web/src/components/SelectionSummaries.stories.tsx create mode 100644 web/src/components/Summary.stories.tsx create mode 100644 web/src/components/Timeline.stories.tsx create mode 100644 web/src/parts/BYOFooter.stories.tsx create mode 100644 web/src/parts/Events.stories.tsx create mode 100644 web/src/parts/FrameFooter.stories.tsx create mode 100644 web/src/parts/Graph.stories.tsx create mode 100644 web/src/parts/Header.stories.tsx create mode 100644 web/src/parts/Selection.stories.tsx create mode 100644 web/src/parts/Stage.stories.tsx delete mode 100644 web/src/routes/$.tsx create mode 100644 web/src/routes/-AppRoute.tsx delete mode 100644 web/src/routes/-RouteView.tsx create mode 100644 web/src/routes/byo.tsx create mode 100644 web/src/routes/byo_.events.tsx create mode 100644 web/src/routes/events.tsx create mode 100644 web/src/routes/node.$nodeId.tsx create mode 100644 web/src/routes/node_.$nodeId.events.tsx create mode 100644 web/src/routes/snapshot.$frameId.tsx create mode 100644 web/src/routes/snapshot_.$frameId.events.tsx create mode 100644 web/src/stories/fixtures.ts create mode 100644 web/src/stories/storybook.tsx create mode 100644 web/src/utils/__tests__/routes.test.ts create mode 100644 web/src/utils/routes.ts create mode 100644 web/tsconfig.storybook.json create mode 100644 web/vitest.config.unit.ts diff --git a/web/.gitignore b/web/.gitignore index 5b5d4ab..2654eae 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -10,6 +10,8 @@ lerna-debug.log* node_modules dist dist-ssr +storybook-static +.tanstack build *.local @@ -25,4 +27,4 @@ build *.sw? *.tsbuildinfo eslint_report.json -coverage \ No newline at end of file +coverage diff --git a/web/.storybook/main.ts b/web/.storybook/main.ts new file mode 100644 index 0000000..c0d1bc6 --- /dev/null +++ b/web/.storybook/main.ts @@ -0,0 +1,23 @@ +import type { StorybookConfig } from '@storybook/tanstack-react'; + +const config: StorybookConfig = { + stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@chromatic-com/storybook', + '@storybook/addon-docs', + '@storybook/addon-vitest', + '@storybook/addon-themes', + 'storybook/viewport', + ], + framework: { + name: '@storybook/tanstack-react', + options: {}, + }, + core: { + builder: '@storybook/builder-vite', + disableTelemetry: true, + }, + staticDirs: ['../public'], +}; + +export default config; diff --git a/web/.storybook/preview.tsx b/web/.storybook/preview.tsx new file mode 100644 index 0000000..3bd2ce1 --- /dev/null +++ b/web/.storybook/preview.tsx @@ -0,0 +1,110 @@ +import type { Decorator, Preview } from '@storybook/tanstack-react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import TimeAgo from 'javascript-time-ago'; +import en from 'javascript-time-ago/locale/en.json'; +import { initialize, mswLoader } from 'msw-storybook-addon'; +import { INITIAL_VIEWPORTS } from 'storybook/viewport'; + +import { storyRoute } from './story-routes'; +import '../src/index.css'; + +type StorybookThemeMode = 'light' | 'dark' | 'system'; + +TimeAgo.addLocale(en); +TimeAgo.setDefaultLocale('en'); + +initialize({ + onUnhandledRequest: 'bypass', + quiet: true, +}); + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + staleTime: Infinity, + }, + }, +}); + +function applyThemeMode(themeMode: StorybookThemeMode) { + if (typeof window === 'undefined') return; + + if (themeMode === 'system') { + delete window.localStorage.isDarkMode; + document.documentElement.classList.toggle( + 'dark', + window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false, + ); + return; + } + + const isDarkMode = themeMode === 'dark'; + window.localStorage.isDarkMode = String(isDarkMode); + document.documentElement.classList.toggle('dark', isDarkMode); +} + +const decorators: Decorator[] = [ + (Story, context) => { + const themeMode = (context.globals.themeMode as StorybookThemeMode | undefined) ?? 'system'; + applyThemeMode(themeMode); + + return ( + + + + ); + }, +]; + +const preview: Preview = { + globalTypes: { + themeMode: { + name: 'Theme', + description: 'Global theme mode', + defaultValue: 'system', + toolbar: { + icon: 'mirror', + dynamicTitle: true, + items: [ + { value: 'light', title: 'Light' }, + { value: 'dark', title: 'Dark' }, + { value: 'system', title: 'System' }, + ], + }, + }, + }, + beforeEach: () => { + queryClient.clear(); + }, + loaders: [mswLoader], + decorators, + parameters: { + tanstack: { + router: { + route: storyRoute, + path: '/', + context: { queryClient }, + }, + }, + msw: { + handlers: [], + }, + viewport: { + viewports: INITIAL_VIEWPORTS, + }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + options: { + storySort: { + method: 'alphabetical', + }, + }, + }, +}; + +export default preview; diff --git a/web/.storybook/story-routes.tsx b/web/.storybook/story-routes.tsx new file mode 100644 index 0000000..4e25da6 --- /dev/null +++ b/web/.storybook/story-routes.tsx @@ -0,0 +1,10 @@ +import { createRootRoute, createRoute } from '@tanstack/react-router'; + +const rootRoute = createRootRoute(); + +export const storyRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '$', +}); + +rootRoute.addChildren([storyRoute]); diff --git a/web/.storybook/vitest-setup.ts b/web/.storybook/vitest-setup.ts new file mode 100644 index 0000000..a312078 --- /dev/null +++ b/web/.storybook/vitest-setup.ts @@ -0,0 +1,22 @@ +import '@testing-library/jest-dom'; +import { beforeAll, vi } from 'vitest'; + +beforeAll(() => { + Object.defineProperty(HTMLElement.prototype, 'clientWidth', { + configurable: true, + value: 800, + }); + + Object.defineProperty(HTMLElement.prototype, 'clientHeight', { + configurable: true, + value: 600, + }); + + const ResizeObserverMock = vi.fn(function (this: ResizeObserver) { + this.observe = vi.fn(); + this.unobserve = vi.fn(); + this.disconnect = vi.fn(); + }); + + vi.stubGlobal('ResizeObserver', ResizeObserverMock); +}); diff --git a/web/CLAUDE.md b/web/CLAUDE.md index ab28d49..478b076 100644 --- a/web/CLAUDE.md +++ b/web/CLAUDE.md @@ -48,14 +48,16 @@ generated client directly. ## Routing -TanStack Router with a catch-all splat route. `src/routes/` holds the route -definitions (`__root.tsx`, `index.tsx`, `$.tsx`); `routeTree.gen.ts` is -generated by the Vite plugin. Forky's URL scheme composes paths (`/byo`, -`/node/`, `/snapshot/`) with an optional `/events` suffix, so -`routes/-RouteView.tsx` reads the pathname and renders the App accordingly. +TanStack Router with file-based routes. `src/routes/` holds the route +definitions (`__root.tsx`, `index.tsx`, `byo.tsx`, `events.tsx`, +`node.$nodeId.tsx`, `snapshot.$frameId.tsx` and their non-nested `_.events` +variants); `routeTree.gen.ts` is generated by the Vite plugin. Forky's URL +scheme models top-level views (`/byo`, `/node/`, `/snapshot/`) and +route-specific event overlays (`/events`, `/byo/events`, `/node//events`, +`/snapshot//events`) as concrete TanStack routes. `src/hooks/useAppNavigation.ts` (`usePathname`, `useAppNavigate`) and -`src/components/Link.tsx` are the app's routing primitives over the splat -route, taking plain path strings. +`src/components/Link.tsx` remain the app's routing primitives for components +that pass plain path strings. ## Structure @@ -86,4 +88,3 @@ src/ dark values flip via CSS variables on `html.dark`). Enforced by the custom ESLint rules in `eslint-rules/`. - Run `pnpm lint` and `pnpm build` before committing. -``` diff --git a/web/eslint.config.js b/web/eslint.config.js index 6831a24..c1466da 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -1,3 +1,6 @@ +// For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format +import storybook from 'eslint-plugin-storybook'; + import js from '@eslint/js'; import globals from 'globals'; import reactHooks from 'eslint-plugin-react-hooks'; @@ -18,7 +21,8 @@ export default tseslint.config( 'node_modules', 'coverage', 'eslint_report.json', - 'eslint-rules' + 'eslint-rules', + 'storybook-static', ], }, // Custom color theming rules: app code may only use the semantic tokens @@ -74,4 +78,17 @@ export default tseslint.config( 'react/react-in-jsx-scope': 'off', }, }, + storybook.configs['flat/recommended'], + { + files: ['**/.storybook/**/*.{js,ts}'], + rules: { + 'storybook/no-uninstalled-addons': [ + 'error', + { + packageJsonLocation: './package.json', + ignore: ['storybook/viewport'], + }, + ], + }, + } ); diff --git a/web/package.json b/web/package.json index a9387a8..986a469 100644 --- a/web/package.json +++ b/web/package.json @@ -16,7 +16,14 @@ "typecheck": "tsc --noEmit", "format": "prettier --write \"src/**/*.{ts,tsx}\"", "test:coverage": "vitest run --coverage", - "test": "vitest" + "test": "pnpm test:unit && pnpm test:storybook", + "test:unit": "vitest run --no-ui --config vitest.config.unit.ts --passWithNoTests", + "test:unit:watch": "vitest --no-ui --config vitest.config.unit.ts", + "test:storybook": "vitest run --no-ui --config vitest.config.ts", + "test:storybook:watch": "vitest --no-ui --config vitest.config.ts", + "test:ui": "vitest --ui", + "storybook": "storybook dev -p 6006 --no-open", + "build-storybook": "storybook build" }, "dependencies": { "@headlessui/react": "2.2.10", @@ -35,31 +42,48 @@ "zod": "4.4.3" }, "devDependencies": { + "@chromatic-com/storybook": "5.2.1", "@eslint/js": "10.0.1", "@hey-api/openapi-ts": "0.98.1", + "@storybook/addon-docs": "10.4.2", + "@storybook/addon-themes": "10.4.2", + "@storybook/addon-vitest": "10.4.2", + "@storybook/builder-vite": "10.4.2", + "@storybook/tanstack-react": "10.4.2", + "@tanstack/react-store": "0.9.3", "@tanstack/router-plugin": "1.168.18", "@testing-library/dom": "10.4.1", + "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "16.3.2", "@types/js-yaml": "4.0.9", + "@types/node": "25.9.2", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", "@vitejs/plugin-react": "6.0.2", + "@vitest/browser": "4.1.8", + "@vitest/browser-playwright": "4.1.8", "@vitest/coverage-v8": "4.1.8", "@vitest/eslint-plugin": "1.6.19", + "@vitest/ui": "4.1.8", "autoprefixer": "10.4.21", "eslint": "10.4.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-prettier": "5.5.6", "eslint-plugin-react-hooks": "7.1.1", "eslint-plugin-react-refresh": "0.5.2", + "eslint-plugin-storybook": "10.4.2", "globals": "17.6.0", "jsdom": "29.1.1", - "msw": "2.7.5", + "msw": "2.14.6", + "msw-storybook-addon": "2.0.7", + "playwright": "1.60.0", "prettier": "3.8.3", "prop-types": "15.8.1", + "storybook": "10.4.2", "tailwindcss": "4.3.0", "typescript": "6.0.3", "typescript-eslint": "8.60.1", + "use-sync-external-store": "1.6.0", "vite": "8.0.16", "vitest": "4.1.8" }, @@ -68,7 +92,9 @@ "npm": "10.9.2" }, "msw": { - "workerDirectory": "public" + "workerDirectory": [ + "public" + ] }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 7209700..f9f64eb 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 2.2.0(react@19.2.7) '@tailwindcss/vite': specifier: 4.3.0 - version: 4.3.0(vite@8.0.16(jiti@2.7.0)) + version: 4.3.0(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) '@tanstack/react-query': specifier: 5.75.0 version: 5.75.0(react@19.2.7) @@ -51,24 +51,51 @@ importers: specifier: 4.4.3 version: 4.4.3 devDependencies: + '@chromatic-com/storybook': + specifier: 5.2.1 + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@eslint/js': specifier: 10.0.1 version: 10.0.1(eslint@10.4.1(jiti@2.7.0)) '@hey-api/openapi-ts': specifier: 0.98.1 version: 0.98.1(magicast@0.5.3)(typescript@6.0.3) + '@storybook/addon-docs': + specifier: 10.4.2 + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@storybook/addon-themes': + specifier: 10.4.2 + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + '@storybook/addon-vitest': + specifier: 10.4.2 + version: 10.4.2(@vitest/browser-playwright@4.1.8)(@vitest/browser@4.1.8)(@vitest/runner@4.1.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vitest@4.1.8) + '@storybook/builder-vite': + specifier: 10.4.2 + version: 10.4.2(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@storybook/tanstack-react': + specifier: 10.4.2 + version: 10.4.2(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.13)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.27.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@tanstack/react-store': + specifier: 0.9.3 + version: 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/router-plugin': specifier: 1.168.18 - version: 1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(jiti@2.7.0)) + version: 1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) '@testing-library/dom': specifier: 10.4.1 version: 10.4.1 + '@testing-library/jest-dom': + specifier: 6.9.1 + version: 6.9.1 '@testing-library/react': specifier: 16.3.2 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/js-yaml': specifier: 4.0.9 version: 4.0.9 + '@types/node': + specifier: 25.9.2 + version: 25.9.2 '@types/react': specifier: 19.2.17 version: 19.2.17 @@ -77,13 +104,22 @@ importers: version: 19.2.3(@types/react@19.2.17) '@vitejs/plugin-react': specifier: 6.0.2 - version: 6.0.2(vite@8.0.16(jiti@2.7.0)) + version: 6.0.2(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@vitest/browser': + specifier: 4.1.8 + version: 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8) + '@vitest/browser-playwright': + specifier: 4.1.8 + version: 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8) '@vitest/coverage-v8': specifier: 4.1.8 - version: 4.1.8(vitest@4.1.8) + version: 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) '@vitest/eslint-plugin': specifier: 1.6.19 version: 1.6.19(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8) + '@vitest/ui': + specifier: 4.1.8 + version: 4.1.8(vitest@4.1.8) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.15) @@ -102,6 +138,9 @@ importers: eslint-plugin-react-refresh: specifier: 0.5.2 version: 0.5.2(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-storybook: + specifier: 10.4.2 + version: 10.4.2(eslint@10.4.1(jiti@2.7.0))(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3) globals: specifier: 17.6.0 version: 17.6.0 @@ -109,14 +148,23 @@ importers: specifier: 29.1.1 version: 29.1.1 msw: - specifier: 2.7.5 - version: 2.7.5(typescript@6.0.3) + specifier: 2.14.6 + version: 2.14.6(@types/node@25.9.2)(typescript@6.0.3) + msw-storybook-addon: + specifier: 2.0.7 + version: 2.0.7(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3)) + playwright: + specifier: 1.60.0 + version: 1.60.0 prettier: specifier: 3.8.3 version: 3.8.3 prop-types: specifier: 15.8.1 version: 15.8.1 + storybook: + specifier: 10.4.2 + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) tailwindcss: specifier: 4.3.0 version: 4.3.0 @@ -126,15 +174,21 @@ importers: typescript-eslint: specifier: 8.60.1 version: 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + use-sync-external-store: + specifier: 1.6.0 + version: 1.6.0(react@19.2.7) vite: specifier: 8.0.16 - version: 8.0.16(jiti@2.7.0) + version: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) vitest: specifier: 4.1.8 - version: 4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + version: 4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) packages: + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} + '@asamuzakjp/css-color@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -225,18 +279,18 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@blazediff/core@1.9.1': + resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true - '@bundled-es-modules/cookie@2.0.1': - resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} - - '@bundled-es-modules/statuses@1.0.1': - resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} - - '@bundled-es-modules/tough-cookie@0.1.6': - resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@chromatic-com/storybook@5.2.1': + resolution: {integrity: sha512-z6I7NJk/0VngA64y5TNYaB4Hc2X8+90n4op6lBt9PvWk5TmIlFLDqdX33rlrwbNRkkYijVgA/wO04rVYXi5Mlg==} + engines: {node: '>=20.0.0', yarn: '>=1.22.18'} + peerDependencies: + storybook: ^0.0.0-0 || ^10.1.0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0 '@csstools/color-helpers@6.0.2': resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} @@ -277,12 +331,174 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -409,35 +625,35 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -453,6 +669,15 @@ packages: '@internationalized/string@3.2.9': resolution: {integrity: sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==} + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0': + resolution: {integrity: sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -476,8 +701,14 @@ packages: resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} - '@mswjs/interceptors@0.37.6': - resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@mswjs/interceptors@0.41.9': + resolution: {integrity: sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==} engines: {node: '>=18'} '@napi-rs/wasm-runtime@1.1.4': @@ -486,22 +717,264 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@neoconfetti/react@1.0.0': + resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + '@open-draft/deferred-promise@3.0.0': + resolution: {integrity: sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==} + '@open-draft/logger@0.3.0': resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@oxc-parser/binding-android-arm-eabi@0.127.0': + resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.127.0': + resolution: {integrity: sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.127.0': + resolution: {integrity: sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.127.0': + resolution: {integrity: sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.127.0': + resolution: {integrity: sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + resolution: {integrity: sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + resolution: {integrity: sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + resolution: {integrity: sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + resolution: {integrity: sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + resolution: {integrity: sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + resolution: {integrity: sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + resolution: {integrity: sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + resolution: {integrity: sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + resolution: {integrity: sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.127.0': + resolution: {integrity: sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.127.0': + resolution: {integrity: sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.127.0': + resolution: {integrity: sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + resolution: {integrity: sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + resolution: {integrity: sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + resolution: {integrity: sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@oxc-project/types@0.133.0': resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-resolver/binding-android-arm-eabi@11.20.0': + resolution: {integrity: sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.20.0': + resolution: {integrity: sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.20.0': + resolution: {integrity: sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.20.0': + resolution: {integrity: sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.20.0': + resolution: {integrity: sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': + resolution: {integrity: sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': + resolution: {integrity: sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': + resolution: {integrity: sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-arm64-musl@11.20.0': + resolution: {integrity: sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': + resolution: {integrity: sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': + resolution: {integrity: sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': + resolution: {integrity: sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': + resolution: {integrity: sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-gnu@11.20.0': + resolution: {integrity: sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-resolver/binding-linux-x64-musl@11.20.0': + resolution: {integrity: sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-resolver/binding-openharmony-arm64@11.20.0': + resolution: {integrity: sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.20.0': + resolution: {integrity: sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': + resolution: {integrity: sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.20.0': + resolution: {integrity: sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw==} + cpu: [x64] + os: [win32] + '@pkgr/core@0.3.6': resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} engines: {node: ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@react-aria/focus@3.22.1': resolution: {integrity: sha512-CPxtkyrBi/HYY5P3lE/57sQ6qfa0lN8E55TOm89H0kNGv0lKt+/0zP7lWERzBjRr5IxBVrQX4gFEowBN52LPaA==} peerDependencies: @@ -617,9 +1090,139 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@storybook/addon-docs@10.4.2': + resolution: {integrity: sha512-CtW1O4xSKZPNtpWgpfp4yB/x4pj/of+3MvlEDfErSlr3Hp3QmEa2pCLaecR08H5LJqJFlt1PtG0UrIynTvgW9w==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.2 + peerDependenciesMeta: + '@types/react': + optional: true + + '@storybook/addon-themes@10.4.2': + resolution: {integrity: sha512-e5rP/RLujp06wmO75njxnfi3ndOBbgHIXceAsuN870BVh7D7iGx+8bwslIWy+FwRBYsCMCnWk+d25Zp4ai3p4w==} + peerDependencies: + storybook: ^10.4.2 + + '@storybook/addon-vitest@10.4.2': + resolution: {integrity: sha512-gq1ZVr0IOLgiS2PzaJqHxKLczwrXvA5g3W2k/FVJA19fJNFNUut1IyQCQRSJTXLLXbnNaa8I0wjGGc2BoLarJg==} + peerDependencies: + '@vitest/browser': ^3.0.0 || ^4.0.0 + '@vitest/browser-playwright': ^4.0.0 + '@vitest/runner': ^3.0.0 || ^4.0.0 + storybook: ^10.4.2 + vitest: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/runner': + optional: true + vitest: + optional: true + + '@storybook/builder-vite@10.4.2': + resolution: {integrity: sha512-d3+i9vbbUfV6hvT90qabmy1WmC4bEJ7iAYDm0217doeA+S6awF25GF0qOy9gN9waU4NMntHoVpdB1YQO2wUj/w==} + peerDependencies: + storybook: ^10.4.2 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@storybook/csf-plugin@10.4.2': + resolution: {integrity: sha512-GqX/2DeF3/jKs5D7gpDiuT9gd0c/f2TKcnQ5av4/s3YqeN+0nhm7btkCrDfgF16uzE1Zj3OrkxvB3AOkfxWgDg==} + peerDependencies: + esbuild: '*' + rollup: '*' + storybook: ^10.4.2 + vite: '*' + webpack: '*' + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@2.0.2': + resolution: {integrity: sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@storybook/react-dom-shim@10.4.2': + resolution: {integrity: sha512-Eng3Yt2NCjPX94QcfyLeUFhrMj0hec2yU9J/qafBVbfj9XrFI8o+0ZwYJ7uXb9ECbvPN4y06dgt/2W/LiR417w==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.2 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@storybook/react-vite@10.4.2': + resolution: {integrity: sha512-nGrS74p0ujPSQ7qD5jKLLlao2igfTTb6Kf/uRhVV8XM0uM7WvxR9K20ddCM8jFmx1jY9fRm0UBGaeaXHDIh5SA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.2 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@storybook/react@10.4.2': + resolution: {integrity: sha512-NfEH3CrdCAgUV4Z7SPN3Iw6nofcueqtRj8iHuo77GNjz0qSfuVi9iS7a8o7x7QFSeIBZwS0Jv3CgmhN8qvoLjg==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.2 + typescript: '>= 4.9.x' + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + typescript: + optional: true + + '@storybook/tanstack-react@10.4.2': + resolution: {integrity: sha512-d9cTzb7o0+SHE+nvwlalMIwgUWRD5x+DbfyjthymUftDeX7Bbyy0W8nzM2v/+EhydWOVfAjNfZ35HYMUlyM/Iw==} + peerDependencies: + '@tanstack/react-router': ^1.168.10 + '@tanstack/react-start': ^1.167.16 + '@tanstack/router-core': ^1.168.9 + '@tanstack/start-client-core': ^1.167.9 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.2 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@tanstack/react-start': + optional: true + '@tanstack/start-client-core': + optional: true + '@swc/helpers@0.5.23': resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} @@ -795,6 +1398,10 @@ packages: resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/react@16.3.2': resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} engines: {node: '>=18'} @@ -810,21 +1417,39 @@ packages: '@types/react-dom': optional: true + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -837,6 +1462,12 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} + + '@types/node@25.9.2': + resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -845,12 +1476,15 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/resolve@1.20.6': + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + + '@types/set-cookie-parser@2.4.10': + resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} + '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@typescript-eslint/eslint-plugin@8.60.1': resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -923,6 +1557,17 @@ packages: babel-plugin-react-compiler: optional: true + '@vitest/browser-playwright@4.1.8': + resolution: {integrity: sha512-SR7FqgegaexEg73xvf3ArtygXegagMdXnL0EZMpxrWvvhQxvicD/E8p0ib0J91riPRtQUViyh67Xjw3NqvyhVg==} + peerDependencies: + playwright: '*' + vitest: 4.1.8 + + '@vitest/browser@4.1.8': + resolution: {integrity: sha512-u21VzX07HzlJYpFgkxmjEXar/tG2UqWGgyGG/46SrrPc7rSdCTPw5vuowopO9CIqF8UCUQzDFdbVnNpw6N0BfQ==} + peerDependencies: + vitest: 4.1.8 + '@vitest/coverage-v8@4.1.8': resolution: {integrity: sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==} peerDependencies: @@ -948,6 +1593,9 @@ packages: vitest: optional: true + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.1.8': resolution: {integrity: sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==} @@ -962,6 +1610,9 @@ packages: vite: optional: true + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.1.8': resolution: {integrity: sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==} @@ -971,12 +1622,26 @@ packages: '@vitest/snapshot@4.1.8': resolution: {integrity: sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.1.8': resolution: {integrity: sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==} + '@vitest/ui@4.1.8': + resolution: {integrity: sha512-RUS2ZU2TsduVrI+9c12uTNaKrNUTsm6yFt3fueEUB9iKvyC2UP83F+sqIz00HQIah4UOL1TMoDAki8K0NjGvsA==} + peerDependencies: + vitest: 4.1.8 + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.1.8': resolution: {integrity: sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==} + '@webcontainer/env@1.1.1': + resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -998,6 +1663,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1024,6 +1693,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + ast-v8-to-istanbul@1.0.3: resolution: {integrity: sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==} @@ -1073,14 +1746,37 @@ packages: caniuse-lite@1.0.30001797: resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + chromatic@16.10.0: + resolution: {integrity: sha512-nFsztmnu7rFiGafUJgXvLUNpqmRylz92eNvzBoJNTKKQj4EQUyxznwnfpf1dTs7hXtWD8JwcH92jADydaHA1sw==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + '@chromatic-com/vitest': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + '@chromatic-com/vitest': + optional: true + cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -1117,9 +1813,9 @@ packages: cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -1129,6 +1825,9 @@ packages: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -1148,6 +1847,10 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1181,9 +1884,16 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} @@ -1194,6 +1904,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + enhanced-resolve@5.23.0: resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==} engines: {node: '>=10.13.0'} @@ -1202,9 +1916,18 @@ packages: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1244,6 +1967,12 @@ packages: peerDependencies: eslint: ^9 || ^10 + eslint-plugin-storybook@10.4.2: + resolution: {integrity: sha512-l3/vzLRmb8VSi3X1Bo6/Pa+64naw1jFsZE5jPPA4izvVdNhH1rF4rGuOC3kDTU926qKVBQtKua8D24XWQtvcGg==} + peerDependencies: + eslint: '>=8' + storybook: ^10.4.2 + eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -1270,6 +1999,11 @@ packages: resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -1282,6 +2016,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1312,6 +2049,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1321,6 +2067,9 @@ packages: picomatch: optional: true + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1339,11 +2088,19 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1363,6 +2120,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + globals@17.6.0: resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} @@ -1386,8 +2147,12 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - headers-polyfill@4.0.3: - resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + headers-polyfill@5.0.1: + resolution: {integrity: sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==} hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -1414,6 +2179,14 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1514,6 +2287,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1603,6 +2379,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@11.5.1: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} @@ -1630,15 +2409,35 @@ packages: memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.7.5: - resolution: {integrity: sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==} + msw-storybook-addon@2.0.7: + resolution: {integrity: sha512-TGmlxXy2TsaB6QcClVKRxqvay5f93xoLguHOihRFQ+gIEIyiyvcoQjkEeuOe7Y9qvddzGB1LyFomzPo9/EpnuQ==} + peerDependencies: + msw: ^2.0.0 + + msw@2.14.6: + resolution: {integrity: sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1647,9 +2446,9 @@ packages: typescript: optional: true - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} @@ -1678,6 +2477,10 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + open@11.0.0: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} @@ -1689,6 +2492,13 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + oxc-parser@0.127.0: + resolution: {integrity: sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-resolver@11.20.0: + resolution: {integrity: sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1708,12 +2518,23 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} @@ -1730,6 +2551,20 @@ packages: pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + playwright-core@1.60.0: + resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.60.0: + resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} + engines: {node: '>=18'} + hasBin: true + + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -1761,16 +2596,10 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} @@ -1783,6 +2612,15 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-docgen-typescript@2.4.0: + resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} + peerDependencies: + typescript: '>= 4.3.x' + + react-docgen@8.0.3: + resolution: {integrity: sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==} + engines: {node: ^20.9.0 || >=22} + react-dom@19.2.7: resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: @@ -1821,6 +2659,14 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + relative-time-format@1.1.12: resolution: {integrity: sha512-qaZBjmRIuXLfuLnzgqpFdBPa5W0euSX1tMnoMUHGPphLwJmrt8xbNiOIHrlvYOD6oNJ0M5owPCZyPibI8de5pQ==} @@ -1832,12 +2678,17 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + rettime@0.11.11: + resolution: {integrity: sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==} + rolldown@1.0.3: resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1878,6 +2729,9 @@ packages: resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} + set-cookie-parser@3.1.0: + resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1893,10 +2747,18 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1907,6 +2769,21 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + storybook@10.4.2: + resolution: {integrity: sha512-5Ax5vbHxFgMBGGhQDm75Rrumm/HZC4ICFhMcJaM0UlqnC/4FKj/IaZtImZFupknyiiyUEcWHPQFA2kX3/VSv1A==} + hasBin: true + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + prettier: ^2 || ^3 + vite-plus: ^0.1.15 + peerDependenciesMeta: + '@types/react': + optional: true + prettier: + optional: true + vite-plus: + optional: true + strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -1918,10 +2795,30 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -1932,6 +2829,10 @@ packages: tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwindcss@4.3.0: resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} @@ -1939,6 +2840,9 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1950,10 +2854,18 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + tldts-core@7.4.2: resolution: {integrity: sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==} @@ -1961,8 +2873,8 @@ packages: resolution: {integrity: sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==} hasBin: true - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} tough-cookie@6.0.1: @@ -1979,6 +2891,14 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1986,9 +2906,9 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} + type-fest@5.7.0: + resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} + engines: {node: '>=20'} typescript-eslint@8.60.1: resolution: {integrity: sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==} @@ -2002,18 +2922,28 @@ packages: engines: {node: '>=14.17'} hasBin: true + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@7.27.2: resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==} engines: {node: '>=20.18.1'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} unplugin@3.0.0: resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} engines: {node: ^20.19.0 || >=22.12.0} + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -2023,9 +2953,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -2148,14 +3075,26 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + 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 + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} @@ -2186,10 +3125,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - zod-validation-error@4.0.2: resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} engines: {node: '>=18.0.0'} @@ -2201,6 +3136,8 @@ packages: snapshots: + '@adobe/css-tools@4.5.0': {} + '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 @@ -2325,22 +3262,23 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@blazediff/core@1.9.1': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 - '@bundled-es-modules/cookie@2.0.1': - dependencies: - cookie: 0.7.2 - - '@bundled-es-modules/statuses@1.0.1': - dependencies: - statuses: 2.0.2 - - '@bundled-es-modules/tough-cookie@0.1.6': + '@chromatic-com/storybook@5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': dependencies: - '@types/tough-cookie': 4.0.5 - tough-cookie: 4.1.4 + '@neoconfetti/react': 1.0.0 + chromatic: 16.10.0 + jsonfile: 6.2.1 + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + strip-ansi: 7.2.0 + transitivePeerDependencies: + - '@chromatic-com/cypress' + - '@chromatic-com/playwright' + - '@chromatic-com/vitest' '@csstools/color-helpers@6.0.2': {} @@ -2372,16 +3310,105 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.9.2': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1(jiti@2.7.0))': dependencies: eslint: 10.4.1(jiti@2.7.0) @@ -2523,27 +3550,32 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/ansi@1.0.2': {} + '@inquirer/ansi@2.0.7': {} - '@inquirer/confirm@5.1.21': + '@inquirer/confirm@6.1.1(@types/node@25.9.2)': dependencies: - '@inquirer/core': 10.3.2 - '@inquirer/type': 3.0.10 + '@inquirer/core': 11.2.1(@types/node@25.9.2) + '@inquirer/type': 4.0.7(@types/node@25.9.2) + optionalDependencies: + '@types/node': 25.9.2 - '@inquirer/core@10.3.2': + '@inquirer/core@11.2.1(@types/node@25.9.2)': dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10 + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@25.9.2) cli-width: 4.1.0 - mute-stream: 2.0.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 25.9.2 - '@inquirer/figures@1.0.15': {} + '@inquirer/figures@2.0.7': {} - '@inquirer/type@3.0.10': {} + '@inquirer/type@4.0.7(@types/node@25.9.2)': + optionalDependencies: + '@types/node': 25.9.2 '@internationalized/date@3.12.2': dependencies: @@ -2557,6 +3589,14 @@ snapshots: dependencies: '@swc/helpers': 0.5.23 + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': + dependencies: + glob: 13.0.6 + react-docgen-typescript: 2.4.0(typescript@6.0.3) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) + optionalDependencies: + typescript: 6.0.3 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2580,7 +3620,13 @@ snapshots: '@lukeed/ms@2.0.2': {} - '@mswjs/interceptors@0.37.6': + '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@types/mdx': 2.0.14 + '@types/react': 19.2.17 + react: 19.2.7 + + '@mswjs/interceptors@0.41.9': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -2596,8 +3642,19 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@neoconfetti/react@1.0.0': {} + '@open-draft/deferred-promise@2.2.0': {} + '@open-draft/deferred-promise@3.0.0': {} + '@open-draft/logger@0.3.0': dependencies: is-node-process: 1.2.0 @@ -2605,10 +3662,139 @@ snapshots: '@open-draft/until@2.1.0': {} + '@oxc-parser/binding-android-arm-eabi@0.127.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.127.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.127.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.127.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.127.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.127.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.127.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.127.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.127.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.127.0': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.127.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.127.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.127.0': + optional: true + + '@oxc-project/types@0.127.0': {} + '@oxc-project/types@0.133.0': {} + '@oxc-resolver/binding-android-arm-eabi@11.20.0': + optional: true + + '@oxc-resolver/binding-android-arm64@11.20.0': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.20.0': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.20.0': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.20.0': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.20.0': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.20.0': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.20.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.20.0': + optional: true + '@pkgr/core@0.3.6': {} + '@polka/url@1.0.0-next.29': {} + '@react-aria/focus@3.22.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@swc/helpers': 0.5.23 @@ -2661,25 +3847,164 @@ snapshots: '@rolldown/binding-linux-x64-musl@1.0.3': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': - optional: true + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/pluginutils@5.4.0': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 + + '@standard-schema/spec@1.1.0': {} + + '@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': + dependencies: + '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.7) + '@storybook/csf-plugin': 10.4.2(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + ts-dedent: 2.2.0 + optionalDependencies: + '@types/react': 19.2.17 + transitivePeerDependencies: + - '@types/react-dom' + - esbuild + - rollup + - vite + - webpack + + '@storybook/addon-themes@10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + dependencies: + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + ts-dedent: 2.2.0 + + '@storybook/addon-vitest@10.4.2(@vitest/browser-playwright@4.1.8)(@vitest/browser@4.1.8)(@vitest/runner@4.1.8)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vitest@4.1.8)': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + optionalDependencies: + '@vitest/browser': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8) + '@vitest/browser-playwright': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8) + '@vitest/runner': 4.1.8 + vitest: 4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + transitivePeerDependencies: + - react + - react-dom + + '@storybook/builder-vite@10.4.2(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': + dependencies: + '@storybook/csf-plugin': 10.4.2(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + ts-dedent: 2.2.0 + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) + transitivePeerDependencies: + - esbuild + - rollup + - webpack + + '@storybook/csf-plugin@10.4.2(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': + dependencies: + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + unplugin: 2.3.11 + optionalDependencies: + esbuild: 0.27.7 + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) + + '@storybook/global@5.0.0': {} - '@rolldown/binding-wasm32-wasi@1.0.3': + '@storybook/icons@2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - optional: true + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rolldown/binding-win32-arm64-msvc@1.0.3': - optional: true + '@storybook/react-dom-shim@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@rolldown/binding-win32-x64-msvc@1.0.3': - optional: true + '@storybook/react-vite@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.27.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@rollup/pluginutils': 5.4.0 + '@storybook/builder-vite': 10.4.2(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@storybook/react': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3) + empathic: 2.0.1 + magic-string: 0.30.21 + react: 19.2.7 + react-docgen: 8.0.3 + react-dom: 19.2.7(react@19.2.7) + resolve: 1.22.12 + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tsconfig-paths: 4.2.0 + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - esbuild + - rollup + - supports-color + - typescript + - webpack - '@rolldown/pluginutils@1.0.1': {} + '@storybook/react@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)': + dependencies: + '@storybook/global': 5.0.0 + '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + react: 19.2.7 + react-docgen: 8.0.3 + react-docgen-typescript: 2.4.0(typescript@6.0.3) + react-dom: 19.2.7(react@19.2.7) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - '@standard-schema/spec@1.1.0': {} + '@storybook/tanstack-react@10.4.2(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(@tanstack/router-core@1.171.13)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.27.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': + dependencies: + '@storybook/builder-vite': 10.4.2(esbuild@0.27.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@storybook/react': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3) + '@storybook/react-vite': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(esbuild@0.27.7)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@tanstack/react-router': 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.13 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - esbuild + - rollup + - supports-color + - typescript + - webpack '@swc/helpers@0.5.23': dependencies: @@ -2746,12 +4071,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - '@tailwindcss/vite@4.3.0(vite@8.0.16(jiti@2.7.0))': + '@tailwindcss/vite@4.3.0(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: 8.0.16(jiti@2.7.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) '@tanstack/history@1.162.0': {} @@ -2804,7 +4129,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(jiti@2.7.0))': + '@tanstack/router-plugin@1.168.18(@tanstack/react-router@1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 @@ -2817,7 +4142,7 @@ snapshots: zod: 4.4.3 optionalDependencies: '@tanstack/react-router': 1.170.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - vite: 8.0.16(jiti@2.7.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) transitivePeerDependencies: - supports-color @@ -2851,6 +4176,15 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 + '@testing-library/jest-dom@6.9.1': + dependencies: + '@adobe/css-tools': 4.5.0 + aria-query: 5.3.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@babel/runtime': 7.29.7 @@ -2861,6 +4195,10 @@ snapshots: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 @@ -2868,15 +4206,36 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/cookie@0.6.0': {} - '@types/deep-eql@4.0.2': {} + '@types/doctrine@0.0.9': {} + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.9': {} @@ -2885,6 +4244,12 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/mdx@2.0.14': {} + + '@types/node@25.9.2': + dependencies: + undici-types: 7.24.6 + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -2893,9 +4258,13 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/statuses@2.0.6': {} + '@types/resolve@1.20.6': {} + + '@types/set-cookie-parser@2.4.10': + dependencies: + '@types/node': 25.9.2 - '@types/tough-cookie@4.0.5': {} + '@types/statuses@2.0.6': {} '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: @@ -2988,12 +4357,42 @@ snapshots: '@typescript-eslint/types': 8.60.1 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@6.0.2(vite@8.0.16(jiti@2.7.0))': + '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(jiti@2.7.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) + + '@vitest/browser-playwright@4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8)': + dependencies: + '@vitest/browser': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8) + '@vitest/mocker': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + playwright: 1.60.0 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8)': + dependencies: + '@blazediff/core': 1.9.1 + '@vitest/mocker': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + '@vitest/utils': 4.1.8 + magic-string: 0.30.21 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite - '@vitest/coverage-v8@4.1.8(vitest@4.1.8)': + '@vitest/coverage-v8@4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.8 @@ -3005,7 +4404,9 @@ snapshots: obug: 2.1.2 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + vitest: 4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + optionalDependencies: + '@vitest/browser': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8) '@vitest/eslint-plugin@1.6.19(@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8)': dependencies: @@ -3015,10 +4416,18 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 - vitest: 4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + vitest: 4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) transitivePeerDependencies: - supports-color + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + '@vitest/expect@4.1.8': dependencies: '@standard-schema/spec': 1.1.0 @@ -3028,14 +4437,18 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0))': + '@vitest/mocker@4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.7.5(typescript@6.0.3) - vite: 8.0.16(jiti@2.7.0) + msw: 2.14.6(@types/node@25.9.2)(typescript@6.0.3) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 '@vitest/pretty-format@4.1.8': dependencies: @@ -3053,14 +4466,37 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + '@vitest/spy@4.1.8': {} + '@vitest/ui@4.1.8(vitest@4.1.8)': + dependencies: + '@vitest/utils': 4.1.8 + fflate: 0.8.3 + flatted: 3.4.2 + pathe: 2.0.3 + sirv: 3.0.2 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vitest: 4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@vitest/utils@4.1.8': dependencies: '@vitest/pretty-format': 4.1.8 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 + '@webcontainer/env@1.1.1': {} + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -3078,6 +4514,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -3098,6 +4536,10 @@ snapshots: assertion-error@2.0.1: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + ast-v8-to-istanbul@1.0.3: dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -3166,12 +4608,26 @@ snapshots: caniuse-lite@1.0.30001797: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chai@6.2.2: {} + check-error@2.1.3: {} + chokidar@5.0.0: dependencies: readdirp: 5.0.0 + chromatic@16.10.0: + dependencies: + semver: 7.8.2 + cli-width@4.1.0: {} cliui@8.0.1: @@ -3198,7 +4654,7 @@ snapshots: cookie-es@3.1.1: {} - cookie@0.7.2: {} + cookie@1.1.1: {} cross-spawn@7.0.6: dependencies: @@ -3211,6 +4667,8 @@ snapshots: mdn-data: 2.27.1 source-map-js: 1.2.1 + css.escape@1.5.1: {} + csstype@3.2.3: {} data-urls@7.0.0: @@ -3226,6 +4684,8 @@ snapshots: decimal.js@10.6.0: {} + deep-eql@5.0.2: {} + deep-is@0.1.4: {} default-browser-id@5.0.1: {} @@ -3247,14 +4707,22 @@ snapshots: diff@8.0.4: {} + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + dom-accessibility-api@0.5.16: {} + dom-accessibility-api@0.6.3: {} + dotenv@17.4.2: {} electron-to-chromium@1.5.368: {} emoji-regex@8.0.0: {} + empathic@2.0.1: {} + enhanced-resolve@5.23.0: dependencies: graceful-fs: 4.2.11 @@ -3262,8 +4730,39 @@ snapshots: entities@8.0.0: {} + es-errors@1.3.0: {} + es-module-lexer@2.1.0: {} + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -3296,6 +4795,15 @@ snapshots: dependencies: eslint: 10.4.1(jiti@2.7.0) + eslint-plugin-storybook@10.4.2(eslint@10.4.1(jiti@2.7.0))(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(typescript@6.0.3): + dependencies: + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - supports-color + - typescript + eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 @@ -3350,6 +4858,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 5.0.1 + esprima@4.0.1: {} + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -3360,6 +4870,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -3380,10 +4892,22 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 + fflate@0.8.3: {} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3402,9 +4926,14 @@ snapshots: fraction.js@4.3.7: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -3419,6 +4948,12 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + globals@17.6.0: {} graceful-fs@4.2.11: {} @@ -3434,7 +4969,14 @@ snapshots: has-flag@4.0.0: {} - headers-polyfill@4.0.3: {} + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + headers-polyfill@5.0.1: + dependencies: + '@types/set-cookie-parser': 2.4.10 + set-cookie-parser: 3.1.0 hermes-estree@0.25.1: {} @@ -3456,6 +4998,12 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -3547,6 +5095,12 @@ snapshots: json5@2.2.3: {} + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -3613,6 +5167,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@3.2.1: {} + lru-cache@11.5.1: {} lru-cache@5.1.1: @@ -3639,38 +5195,51 @@ snapshots: memoize-one@6.0.0: {} + min-indent@1.0.1: {} + minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 + minimist@1.2.8: {} + + minipass@7.1.3: {} + + mrmime@2.0.1: {} + ms@2.1.3: {} - msw@2.7.5(typescript@6.0.3): + msw-storybook-addon@2.0.7(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3)): dependencies: - '@bundled-es-modules/cookie': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.21 - '@mswjs/interceptors': 0.37.6 - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 + is-node-process: 1.2.0 + msw: 2.14.6(@types/node@25.9.2)(typescript@6.0.3) + + msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3): + dependencies: + '@inquirer/confirm': 6.1.1(@types/node@25.9.2) + '@mswjs/interceptors': 0.41.9 + '@open-draft/deferred-promise': 3.0.0 '@types/statuses': 2.0.6 + cookie: 1.1.1 graphql: 16.14.1 - headers-polyfill: 4.0.3 + headers-polyfill: 5.0.1 is-node-process: 1.2.0 outvariant: 1.4.3 path-to-regexp: 6.3.0 picocolors: 1.1.1 + rettime: 0.11.11 + statuses: 2.0.2 strict-event-emitter: 0.5.1 - type-fest: 4.41.0 + tough-cookie: 6.0.1 + type-fest: 5.7.0 + until-async: 3.0.2 yargs: 17.7.2 optionalDependencies: typescript: 6.0.3 transitivePeerDependencies: - '@types/node' - mute-stream@2.0.0: {} + mute-stream@3.0.0: {} nanoid@3.3.12: {} @@ -3686,6 +5255,13 @@ snapshots: ohash@2.0.11: {} + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + open@11.0.0: dependencies: default-browser: 5.5.0 @@ -3706,6 +5282,53 @@ snapshots: outvariant@1.4.3: {} + oxc-parser@0.127.0: + dependencies: + '@oxc-project/types': 0.127.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.127.0 + '@oxc-parser/binding-android-arm64': 0.127.0 + '@oxc-parser/binding-darwin-arm64': 0.127.0 + '@oxc-parser/binding-darwin-x64': 0.127.0 + '@oxc-parser/binding-freebsd-x64': 0.127.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.127.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.127.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.127.0 + '@oxc-parser/binding-linux-arm64-musl': 0.127.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.127.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.127.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-gnu': 0.127.0 + '@oxc-parser/binding-linux-x64-musl': 0.127.0 + '@oxc-parser/binding-openharmony-arm64': 0.127.0 + '@oxc-parser/binding-wasm32-wasi': 0.127.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.127.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.127.0 + '@oxc-parser/binding-win32-x64-msvc': 0.127.0 + + oxc-resolver@11.20.0: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.20.0 + '@oxc-resolver/binding-android-arm64': 11.20.0 + '@oxc-resolver/binding-darwin-arm64': 11.20.0 + '@oxc-resolver/binding-darwin-x64': 11.20.0 + '@oxc-resolver/binding-freebsd-x64': 11.20.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.20.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.20.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.20.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.20.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.20.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.20.0 + '@oxc-resolver/binding-linux-x64-musl': 11.20.0 + '@oxc-resolver/binding-openharmony-arm64': 11.20.0 + '@oxc-resolver/binding-wasm32-wasi': 11.20.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.20.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.20.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -3722,10 +5345,19 @@ snapshots: path-key@3.1.1: {} + path-parse@1.0.7: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.1 + minipass: 7.1.3 + path-to-regexp@6.3.0: {} pathe@2.0.3: {} + pathval@2.0.1: {} + perfect-debounce@2.1.0: {} performance-now@2.1.0: {} @@ -3740,6 +5372,16 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 + playwright-core@1.60.0: {} + + playwright@1.60.0: + dependencies: + playwright-core: 1.60.0 + optionalDependencies: + fsevents: 2.3.2 + + pngjs@7.0.0: {} + postcss-value-parser@4.2.0: {} postcss@8.5.15: @@ -3770,14 +5412,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - psl@1.15.0: - dependencies: - punycode: 2.3.1 - punycode@2.3.1: {} - querystringify@2.2.0: {} - raf@3.4.1: dependencies: performance-now: 2.1.0 @@ -3801,6 +5437,25 @@ snapshots: react-stately: 3.47.0(react@19.2.7) use-sync-external-store: 1.6.0(react@19.2.7) + react-docgen-typescript@2.4.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + react-docgen@8.0.3: + dependencies: + '@babel/core': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.12 + strip-indent: 4.1.1 + transitivePeerDependencies: + - supports-color + react-dom@19.2.7(react@19.2.7): dependencies: react: 19.2.7 @@ -3838,16 +5493,36 @@ snapshots: readdirp@5.0.0: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + relative-time-format@1.1.12: {} require-directory@2.1.1: {} require-from-string@2.0.2: {} - requires-port@1.0.0: {} - resolve-pkg-maps@1.0.0: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rettime@0.11.11: {} + rolldown@1.0.3: dependencies: '@oxc-project/types': 0.133.0 @@ -3889,6 +5564,8 @@ snapshots: seroval@1.5.4: {} + set-cookie-parser@3.1.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -3899,14 +5576,49 @@ snapshots: signal-exit@4.1.0: {} + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + source-map-js@1.2.1: {} + source-map@0.6.1: {} + stackback@0.0.2: {} statuses@2.0.2: {} std-env@4.1.0: {} + storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.17)(prettier@3.8.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@testing-library/jest-dom': 6.9.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + '@webcontainer/env': 1.1.1 + esbuild: 0.27.7 + open: 10.2.0 + oxc-parser: 0.127.0 + oxc-resolver: 11.20.0 + recast: 0.23.11 + semver: 7.8.2 + use-sync-external-store: 1.6.0(react@19.2.7) + ws: 8.21.0 + optionalDependencies: + '@types/react': 19.2.17 + prettier: 3.8.3 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - react + - react-dom + - utf-8-validate + strict-event-emitter@0.5.1: {} string-width@4.2.3: @@ -3919,10 +5631,24 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-indent@4.1.1: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} synckit@0.11.13: @@ -3931,10 +5657,14 @@ snapshots: tabbable@6.4.0: {} + tagged-tag@1.0.0: {} + tailwindcss@4.3.0: {} tapable@2.3.3: {} + tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@1.2.4: {} @@ -3944,20 +5674,19 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyrainbow@2.0.0: {} + tinyrainbow@3.1.0: {} + tinyspy@4.0.4: {} + tldts-core@7.4.2: {} tldts@7.4.2: dependencies: tldts-core: 7.4.2 - tough-cookie@4.1.4: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + totalist@3.0.1: {} tough-cookie@6.0.1: dependencies: @@ -3971,13 +5700,23 @@ snapshots: dependencies: typescript: 6.0.3 + ts-dedent@2.2.0: {} + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@4.41.0: {} + type-fest@5.7.0: + dependencies: + tagged-tag: 1.0.0 typescript-eslint@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): dependencies: @@ -3992,9 +5731,18 @@ snapshots: typescript@6.0.3: {} + undici-types@7.24.6: {} + undici@7.27.2: {} - universalify@0.2.0: {} + universalify@2.0.1: {} + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 unplugin@3.0.0: dependencies: @@ -4002,6 +5750,8 @@ snapshots: picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 + until-async@3.0.2: {} + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: browserslist: 4.28.2 @@ -4012,16 +5762,11 @@ snapshots: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - use-sync-external-store@1.6.0(react@19.2.7): dependencies: react: 19.2.7 - vite@8.0.16(jiti@2.7.0): + vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -4029,13 +5774,15 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: + '@types/node': 25.9.2 + esbuild: 0.27.7 fsevents: 2.3.3 jiti: 2.7.0 - vitest@4.1.8(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)): + vitest@4.1.8(@types/node@25.9.2)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(@vitest/ui@4.1.8)(jsdom@29.1.1)(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(msw@2.7.5(typescript@6.0.3))(vite@8.0.16(jiti@2.7.0)) + '@vitest/mocker': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -4052,10 +5799,13 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(jiti@2.7.0) + vite: 8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@vitest/coverage-v8': 4.1.8(vitest@4.1.8) + '@types/node': 25.9.2 + '@vitest/browser-playwright': 4.1.8(msw@2.14.6(@types/node@25.9.2)(typescript@6.0.3))(playwright@1.60.0)(vite@8.0.16(@types/node@25.9.2)(esbuild@0.27.7)(jiti@2.7.0))(vitest@4.1.8) + '@vitest/coverage-v8': 4.1.8(@vitest/browser@4.1.8)(vitest@4.1.8) + '@vitest/ui': 4.1.8(vitest@4.1.8) jsdom: 29.1.1 transitivePeerDependencies: - msw @@ -4089,17 +5839,17 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@6.2.0: + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@7.0.0: + ws@8.21.0: {} + + wsl-utils@0.1.0: dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + is-wsl: 3.1.1 wsl-utils@0.3.1: dependencies: @@ -4128,8 +5878,6 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.3: {} - zod-validation-error@4.0.2(zod@4.4.3): dependencies: zod: 4.4.3 diff --git a/web/public/mockServiceWorker.js b/web/public/mockServiceWorker.js index 8b841ba..33dde9e 100644 --- a/web/public/mockServiceWorker.js +++ b/web/public/mockServiceWorker.js @@ -5,24 +5,23 @@ * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. - * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.7.5' -const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' +const PACKAGE_VERSION = '2.14.6' +const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() -self.addEventListener('install', function () { +addEventListener('install', function () { self.skipWaiting() }) -self.addEventListener('activate', function (event) { +addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()) }) -self.addEventListener('message', async function (event) { - const clientId = event.source.id +addEventListener('message', async function (event) { + const clientId = Reflect.get(event.source || {}, 'id') if (!clientId || !self.clients) { return @@ -72,11 +71,6 @@ self.addEventListener('message', async function (event) { break } - case 'MOCK_DEACTIVATE': { - activeClientIds.delete(clientId) - break - } - case 'CLIENT_CLOSED': { activeClientIds.delete(clientId) @@ -94,69 +88,92 @@ self.addEventListener('message', async function (event) { } }) -self.addEventListener('fetch', function (event) { - const { request } = event +addEventListener('fetch', function (event) { + const requestInterceptedAt = Date.now() // Bypass navigation requests. - if (request.mode === 'navigate') { + if (event.request.mode === 'navigate') { return } // Opening the DevTools triggers the "only-if-cached" request // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + if ( + event.request.cache === 'only-if-cached' && + event.request.mode !== 'same-origin' + ) { return } // Bypass all requests when there are no active clients. // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). + // after it's been terminated (still remains active until the next reload). if (activeClientIds.size === 0) { return } - // Generate unique request ID. const requestId = crypto.randomUUID() - event.respondWith(handleRequest(event, requestId)) + event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) }) -async function handleRequest(event, requestId) { +/** + * @param {FetchEvent} event + * @param {string} requestId + * @param {number} requestInterceptedAt + */ +async function handleRequest(event, requestId, requestInterceptedAt) { const client = await resolveMainClient(event) - const response = await getResponse(event, client, requestId) + const requestCloneForEvents = event.request.clone() + const response = await getResponse( + event, + client, + requestId, + requestInterceptedAt, + ) // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { - ;(async function () { - const responseClone = response.clone() - - sendToClient( - client, - { - type: 'RESPONSE', - payload: { - requestId, - isMockedResponse: IS_MOCKED_RESPONSE in response, + const serializedRequest = await serializeRequest(requestCloneForEvents) + + // Clone the response so both the client and the library could consume it. + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + isMockedResponse: IS_MOCKED_RESPONSE in response, + request: { + id: requestId, + ...serializedRequest, + }, + response: { type: responseClone.type, status: responseClone.status, statusText: responseClone.statusText, - body: responseClone.body, headers: Object.fromEntries(responseClone.headers.entries()), + body: responseClone.body, }, }, - [responseClone.body], - ) - })() + }, + responseClone.body ? [serializedRequest.body, responseClone.body] : [], + ) } return response } -// Resolve the main client for the given event. -// Client that issues a request doesn't necessarily equal the client -// that registered the worker. It's with the latter the worker should -// communicate with during the response resolving phase. +/** + * Resolve the main client for the given event. + * Client that issues a request doesn't necessarily equal the client + * that registered the worker. It's with the latter the worker should + * communicate with during the response resolving phase. + * @param {FetchEvent} event + * @returns {Promise} + */ async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) @@ -184,12 +201,17 @@ async function resolveMainClient(event) { }) } -async function getResponse(event, client, requestId) { - const { request } = event - +/** + * @param {FetchEvent} event + * @param {Client | undefined} client + * @param {string} requestId + * @param {number} requestInterceptedAt + * @returns {Promise} + */ +async function getResponse(event, client, requestId, requestInterceptedAt) { // Clone the request because it might've been already used // (i.e. its body has been read and sent to the client). - const requestClone = request.clone() + const requestClone = event.request.clone() function passthrough() { // Cast the request headers to a new Headers instance @@ -230,29 +252,18 @@ async function getResponse(event, client, requestId) { } // Notify the client that a request has been intercepted. - const requestBuffer = await request.arrayBuffer() + const serializedRequest = await serializeRequest(event.request) const clientMessage = await sendToClient( client, { type: 'REQUEST', payload: { id: requestId, - url: request.url, - mode: request.mode, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: requestBuffer, - keepalive: request.keepalive, + interceptedAt: requestInterceptedAt, + ...serializedRequest, }, }, - [requestBuffer], + [serializedRequest.body], ) switch (clientMessage.type) { @@ -268,6 +279,12 @@ async function getResponse(event, client, requestId) { return passthrough() } +/** + * @param {Client} client + * @param {any} message + * @param {Array} transferrables + * @returns {Promise} + */ function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() @@ -280,14 +297,18 @@ function sendToClient(client, message, transferrables = []) { resolve(event.data) } - client.postMessage( - message, - [channel.port2].concat(transferrables.filter(Boolean)), - ) + client.postMessage(message, [ + channel.port2, + ...transferrables.filter(Boolean), + ]) }) } -async function respondWithMock(response) { +/** + * @param {Response} response + * @returns {Response} + */ +function respondWithMock(response) { // Setting response status code to 0 is a no-op. // However, when responding with a "Response.error()", the produced Response // instance will have status code set to 0. Since it's not possible to create @@ -305,3 +326,24 @@ async function respondWithMock(response) { return mockedResponse } + +/** + * @param {Request} request + */ +async function serializeRequest(request) { + return { + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.arrayBuffer(), + keepalive: request.keepalive, + } +} diff --git a/web/src/App.stories.tsx b/web/src/App.stories.tsx new file mode 100644 index 0000000..523990f --- /dev/null +++ b/web/src/App.stories.tsx @@ -0,0 +1,127 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; + +import App from '@app/App'; +import { storyApiHandlers } from '@app/stories/fixtures'; + +const meta = { + title: 'App/Routes', + component: App, + parameters: { + layout: 'fullscreen', + msw: { + handlers: storyApiHandlers(), + }, + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const AggregatedLive: Story = { + parameters: { + tanstack: { + router: { + path: '/', + }, + }, + }, +}; + +export const SourceView: Story = { + args: { + node: 'syd1-lighthouse-001', + }, + parameters: { + tanstack: { + router: { + path: '/node/$nodeId', + params: { nodeId: 'syd1-lighthouse-001' }, + }, + }, + }, +}; + +export const SnapshotView: Story = { + args: { + frameId: 'frame-alpha', + }, + parameters: { + tanstack: { + router: { + path: '/snapshot/$frameId', + params: { frameId: 'frame-alpha' }, + }, + }, + }, +}; + +export const BYOUploadView: Story = { + args: { + byo: true, + }, + parameters: { + tanstack: { + router: { + path: '/byo', + }, + }, + }, +}; + +export const EventsOverlay: Story = { + args: { + eventsOpen: true, + eventsCloseTo: '/', + }, + parameters: { + tanstack: { + router: { + path: '/events', + }, + }, + }, +}; + +export const NodeEventsOverlay: Story = { + args: { + node: 'ams3-teku-001', + eventsOpen: true, + eventsCloseTo: '/node/ams3-teku-001', + }, + parameters: { + tanstack: { + router: { + path: '/node/$nodeId/events', + params: { nodeId: 'ams3-teku-001' }, + }, + }, + }, +}; + +export const LoadingSpec: Story = { + tags: ['test-exclude'], + parameters: { + tanstack: { + router: { + path: '/', + }, + }, + msw: { + handlers: storyApiHandlers({ specDelay: 10_000 }), + }, + }, +}; + +export const SpecError: Story = { + parameters: { + tanstack: { + router: { + path: '/', + }, + }, + msw: { + handlers: storyApiHandlers({ specError: true }), + }, + }, +}; diff --git a/web/src/App.tsx b/web/src/App.tsx index 864a519..a7c83b1 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -17,10 +17,14 @@ export default function App({ node, frameId, byo = false, + eventsOpen = false, + eventsCloseTo = '/', }: { node?: string; frameId?: string; byo?: boolean; + eventsOpen?: boolean; + eventsCloseTo?: string; }) { const { data, isLoading, error } = useSpecQuery(); const { @@ -99,7 +103,7 @@ export default function App({
- +
diff --git a/web/src/ErrorBoundary.tsx b/web/src/ErrorBoundary.tsx index 479ec71..d156f7c 100644 --- a/web/src/ErrorBoundary.tsx +++ b/web/src/ErrorBoundary.tsx @@ -10,6 +10,15 @@ interface State { hasError: boolean; } +export function ErrorBoundaryFallback() { + return ( +
+ +

Uhh... Something went wrong

+
+ ); +} + class ErrorBoundary extends Component { public state: State = { hasError: false, @@ -26,12 +35,7 @@ class ErrorBoundary extends Component { public render() { if (this.state.hasError) { - return ( -
- -

Uhh... Something went wrong

-
- ); + return ; } return this.props.children; diff --git a/web/src/Fallbacks.stories.tsx b/web/src/Fallbacks.stories.tsx new file mode 100644 index 0000000..612affb --- /dev/null +++ b/web/src/Fallbacks.stories.tsx @@ -0,0 +1,23 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; + +import { ErrorBoundaryFallback as ErrorBoundaryFallbackView } from '@app/ErrorBoundary'; +import NotFound from '@app/NotFound'; + +const meta = { + title: 'App/Fallbacks', + parameters: { + layout: 'fullscreen', + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const NotFoundPage: Story = { + render: () => , +}; + +export const ErrorBoundaryFallback: Story = { + render: () => , +}; diff --git a/web/src/components/Controls.stories.tsx b/web/src/components/Controls.stories.tsx new file mode 100644 index 0000000..a6c9278 --- /dev/null +++ b/web/src/components/Controls.stories.tsx @@ -0,0 +1,130 @@ +import { useState } from 'react'; + +import type { Meta, StoryObj } from '@storybook/tanstack-react'; +import { ArrowDownTrayIcon, CheckCircleIcon } from '@heroicons/react/20/solid'; +import { expect, userEvent, waitFor, within } from 'storybook/test'; + +import Download from '@components/Download'; +import EditableInput from '@components/EditableInput'; +import Icon from '@components/Icon'; +import { ModeToggle } from '@components/ModeToggle'; +import Share from '@components/Share'; +import { withForkyProviders } from '@app/stories/storybook'; + +const meta = { + title: 'Components/Controls', + parameters: { + layout: 'fullscreen', + tanstack: { + router: { + path: '/', + }, + }, + }, + decorators: [withForkyProviders()], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +function EditableInputSet() { + const [textValue, setTextValue] = useState('ams3-teku-001'); + const [slotValue, setSlotValue] = useState(107); + const [timeValue, setTimeValue] = useState(new Date('2024-01-01T00:21:24.000Z').getTime()); + + return ( +
+ + + +
+ ); +} + +export const ActionsAndThemeToggle: Story = { + render: () => ( +
+
+
+ + + +
+
+ } text="Small" /> + } + text="Medium" + size="md" + /> + } + text="Large" + size="lg" + /> + +
+
+
+ ), +}; + +export const EditableInputs: Story = { + render: () => ( +
+ +
+ ), +}; + +export const EditableInputEditing: Story = { + render: () => ( +
+ +
+ ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const input = canvas.getByDisplayValue('ams3-teku-001'); + await userEvent.click(input); + await userEvent.clear(input); + await userEvent.type(input, 'syd1-lighthouse-001'); + await expect(input).toHaveValue('syd1-lighthouse-001'); + }, +}; + +export const ShareClosed: Story = { + render: () => ( +
+ +
+ ), +}; + +export const ShareDialogOpen: Story = { + render: () => ( +
+ +
+ ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement.ownerDocument.body); + await userEvent.click(canvas.getByTitle('Share link')); + await waitFor(() => expect(canvas.getByRole('button', { name: /copy/i })).toBeVisible()); + }, +}; diff --git a/web/src/components/GraphPrimitives.stories.tsx b/web/src/components/GraphPrimitives.stories.tsx new file mode 100644 index 0000000..51b5a75 --- /dev/null +++ b/web/src/components/GraphPrimitives.stories.tsx @@ -0,0 +1,293 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; + +import AggregatedNode from '@components/AggregatedNode'; +import ConcatNode from '@components/ConcatNode'; +import Edge from '@components/Edge'; +import ProgressCircle from '@components/ProgressCircle'; +import SlotBoundary from '@components/SlotBoundary'; +import WeightedNode from '@components/WeightedNode'; +import { storyBlockRoots } from '@app/stories/fixtures'; +import { withForkyProviders } from '@app/stories/storybook'; + +const meta = { + title: 'Components/Graph Primitives', + parameters: { + layout: 'fullscreen', + }, + decorators: [withForkyProviders()], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const WeightedNodeStates: Story = { + render: () => ( +
+ + + + + + + + +
+ ), +}; + +export const AggregatedNodeStates: Story = { + render: () => ( +
+ + + + + + + +
+ ), +}; + +export const EdgesBoundariesAndProgress: Story = { + render: () => ( +
+ + + + + + + + +
+ + + +
+
+ ), +}; diff --git a/web/src/components/Link.tsx b/web/src/components/Link.tsx index cc0f418..61c1eab 100644 --- a/web/src/components/Link.tsx +++ b/web/src/components/Link.tsx @@ -2,6 +2,8 @@ import { MouseEventHandler, ReactNode } from 'react'; import { Link as RouterLink } from '@tanstack/react-router'; +import { parseAppRoute } from '@utils/routes'; + interface Props { href: string; className?: string; @@ -10,15 +12,30 @@ interface Props { children?: ReactNode; } -/** - * The app's link primitive: forky composes paths on a single catch-all splat - * route, so links take a plain `href` path string and route it through the - * splat param (see hooks/useAppNavigation.ts for the programmatic version). - */ +/** The app's link primitive: links take plain paths and route to typed targets. */ export default function Link({ href, ...props }: Props) { - if (href === '/') { - return ; - } + const route = parseAppRoute(href); - return ; + switch (route?.kind) { + case 'home': + return ; + case 'events': + return ; + case 'byo': + return ; + case 'byoEvents': + return ; + case 'node': + return ; + case 'nodeEvents': + return ; + case 'snapshot': + return ; + case 'snapshotEvents': + return ( + + ); + default: + return
; + } } diff --git a/web/src/components/Loading.stories.tsx b/web/src/components/Loading.stories.tsx new file mode 100644 index 0000000..e7fd9e2 --- /dev/null +++ b/web/src/components/Loading.stories.tsx @@ -0,0 +1,41 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; + +import Loading from './Loading'; + +const meta = { + title: 'Components/Loading', + component: Loading, + parameters: { + layout: 'fullscreen', + }, + decorators: [ + Story => ( +
+ +
+ ), + ], + args: { + message: 'Loading...', + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; + +export const Shell: Story = { + decorators: [ + Story => ( +
+ +
+ ), + ], + args: { + message: 'Loading fork-choice data...', + textColor: 'text-on-shell', + }, +}; diff --git a/web/src/components/SelectionSummaries.stories.tsx b/web/src/components/SelectionSummaries.stories.tsx new file mode 100644 index 0000000..ca4911a --- /dev/null +++ b/web/src/components/SelectionSummaries.stories.tsx @@ -0,0 +1,143 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; + +import AggregatedBlockSummary from '@components/AggregatedBlockSummary'; +import AggregatedFramesSummary from '@components/AggregatedFramesSummary'; +import BYOFrameBlockSummary from '@components/BYOFrameBlockSummary'; +import FrameBlockSummary from '@components/FrameBlockSummary'; +import FrameSummary from '@components/FrameSummary'; +import { + getProcessedStoryFrame, + storyApiHandlers, + storyBlockRoots, + storyFrameIds, +} from '@app/stories/fixtures'; +import { PanelSurface, withForkyProviders } from '@app/stories/storybook'; + +const meta = { + title: 'Components/Selection Summaries', + parameters: { + layout: 'fullscreen', + msw: { + handlers: storyApiHandlers(), + }, + }, + decorators: [withForkyProviders()], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const FrameLoaded: Story = { + render: () => ( + + + + ), +}; + +export const FrameLoading: Story = { + tags: ['test-exclude'], + parameters: { + msw: { + handlers: storyApiHandlers({ frameDelay: 10_000 }), + }, + }, + render: () => ( + + + + ), +}; + +export const FrameError: Story = { + parameters: { + msw: { + handlers: storyApiHandlers({ frameError: true }), + }, + }, + render: () => ( + + + + ), +}; + +export const FrameBlockLoaded: Story = { + render: () => ( + + + + ), +}; + +export const FrameBlockMissing: Story = { + render: () => ( + + + + ), +}; + +export const AggregatedFramesLoaded: Story = { + render: () => ( + + + + ), +}; + +export const AggregatedFramesPartialError: Story = { + render: () => ( + + + + ), +}; + +export const AggregatedBlockLoaded: Story = { + render: () => ( + + + + ), +}; + +export const AggregatedBlockMissing: Story = { + render: () => ( + + + + ), +}; + +export const BYOFrameBlockLoaded: Story = { + decorators: [ + withForkyProviders({ + focus: { + byo: true, + byoData: getProcessedStoryFrame(storyFrameIds[0]), + }, + }), + ], + render: () => ( + + + + ), +}; + +export const BYOFrameBlockMissingData: Story = { + decorators: [ + withForkyProviders({ + focus: { + byo: true, + }, + }), + ], + render: () => ( + + + + ), +}; diff --git a/web/src/components/Summary.stories.tsx b/web/src/components/Summary.stories.tsx new file mode 100644 index 0000000..e17ff61 --- /dev/null +++ b/web/src/components/Summary.stories.tsx @@ -0,0 +1,58 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; + +import { + SummaryCard, + SummaryLink, + SummaryRow, + SummarySection, + ValidityBadge, +} from '@components/Summary'; +import { PanelSurface, withForkyProviders } from '@app/stories/storybook'; +import { storyBlockRoots } from '@app/stories/fixtures'; + +const meta = { + title: 'Components/Summary', + parameters: { + layout: 'fullscreen', + }, + decorators: [withForkyProviders()], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const CardWithRowsSectionsAndLinks: Story = { + render: () => ( + + + + frame-alpha + + 2024-01-01T00:21:25.000Z + + ams3-teku-001 + + + {storyBlockRoots.slot107} + + + ams3 + v24.12.0 + + + ), +}; + +export const ValidityBadges: Story = { + render: () => ( + +
+ + + + +
+
+ ), +}; diff --git a/web/src/components/Timeline.stories.tsx b/web/src/components/Timeline.stories.tsx new file mode 100644 index 0000000..ebd1c8b --- /dev/null +++ b/web/src/components/Timeline.stories.tsx @@ -0,0 +1,176 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; +import { expect, userEvent, within } from 'storybook/test'; + +import Control from '@components/Control'; +import EpochDial from '@components/EpochDial'; +import Ruler from '@components/Ruler'; +import Slot from '@components/Slot'; +import SlotDial from '@components/SlotDial'; +import SnapshotMarker from '@components/SnapshotMarker'; +import Timeline from '@parts/Timeline'; +import { storyAllMetadata, storyApiHandlers, storyEventMetadata } from '@app/stories/fixtures'; +import { withForkyProviders } from '@app/stories/storybook'; + +const meta = { + title: 'Components/Timeline', + parameters: { + layout: 'fullscreen', + msw: { + handlers: storyApiHandlers(), + }, + }, + decorators: [withForkyProviders()], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const RulerVariants: Story = { + render: () => ( +
+ + + +
+ ), +}; + +export const SnapshotMarkers: Story = { + render: () => ( +
+
+ + + +
+
+ ), +}; + +export const SnapshotMarkerPopoverOpen: Story = { + render: () => ( +
+
+ +
+
+ ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + await userEvent.click(canvas.getByTitle(/syd1-lighthouse-001/)); + await expect(canvas.getByText('event-after-reorg-1')).toBeVisible(); + }, +}; + +export const SlotPopulated: Story = { + render: () => ( +
+
+ +
+
+ ), +}; + +export const SlotLoading: Story = { + tags: ['test-exclude'], + parameters: { + msw: { + handlers: storyApiHandlers({ metadataDelay: 10_000 }), + }, + }, + render: () => ( +
+
+ +
+
+ ), +}; + +export const SlotError: Story = { + parameters: { + msw: { + handlers: storyApiHandlers({ metadataError: true }), + }, + }, + render: () => ( +
+
+ +
+
+ ), +}; + +export const ControlPaused: Story = { + render: () => ( +
+ +
+ ), +}; + +export const ControlPlayingNearLive: Story = { + decorators: [ + withForkyProviders({ + focus: { + initialTime: Date.now() - 2 * 12_000, + playing: true, + }, + }), + ], + render: () => ( +
+ +
+ ), +}; + +export const SlotAndEpochDials: Story = { + render: () => ( +
+ + +
+ ), +}; + +export const FullTimeline: Story = { + render: () => ( +
+ +
+ ), +}; diff --git a/web/src/hooks/useAppNavigation.ts b/web/src/hooks/useAppNavigation.ts index 5f53bec..b5ca6ea 100644 --- a/web/src/hooks/useAppNavigation.ts +++ b/web/src/hooks/useAppNavigation.ts @@ -2,13 +2,13 @@ import { useCallback } from 'react'; import { useLocation, useNavigate } from '@tanstack/react-router'; +import { parseAppRoute } from '@utils/routes'; + export type NavigateFn = (to: string, options?: { replace?: boolean }) => void; /** - * Forky composes paths (`/byo`, `/node/`, `/snapshot/`, optional - * `/events` suffix) on a single catch-all splat route, so navigation targets - * are plain path strings rather than typed route literals. These hooks are - * the app's routing primitives over that scheme. + * Forky's components pass plain app path strings around. These hooks are the + * boundary that turns those paths into TanStack Router's typed route targets. */ /** The current pathname. */ @@ -16,23 +16,58 @@ export function usePathname(): string { return useLocation({ select: location => location.pathname }); } -/** Navigate to an app path string via the catch-all splat route. */ +/** Navigate to an app path string via the matching typed route. */ export function useAppNavigate(): NavigateFn { const routerNavigate = useNavigate(); return useCallback( (to, options) => { - if (to === '/') { - routerNavigate({ to: '/', replace: options?.replace }); + const route = parseAppRoute(to); - return; + switch (route?.kind) { + case 'home': + routerNavigate({ to: '/', replace: options?.replace }); + return; + case 'events': + routerNavigate({ to: '/events', replace: options?.replace }); + return; + case 'byo': + routerNavigate({ to: '/byo', replace: options?.replace }); + return; + case 'byoEvents': + routerNavigate({ to: '/byo/events', replace: options?.replace }); + return; + case 'node': + routerNavigate({ + to: '/node/$nodeId', + params: { nodeId: route.nodeId }, + replace: options?.replace, + }); + return; + case 'nodeEvents': + routerNavigate({ + to: '/node/$nodeId/events', + params: { nodeId: route.nodeId }, + replace: options?.replace, + }); + return; + case 'snapshot': + routerNavigate({ + to: '/snapshot/$frameId', + params: { frameId: route.frameId }, + replace: options?.replace, + }); + return; + case 'snapshotEvents': + routerNavigate({ + to: '/snapshot/$frameId/events', + params: { frameId: route.frameId }, + replace: options?.replace, + }); + return; + default: + window.location.assign(to); } - - routerNavigate({ - to: '/$', - params: { _splat: to.replace(/^\//, '') }, - replace: options?.replace, - }); }, [routerNavigate], ); diff --git a/web/src/parts/BYOFooter.stories.tsx b/web/src/parts/BYOFooter.stories.tsx new file mode 100644 index 0000000..51e0a05 --- /dev/null +++ b/web/src/parts/BYOFooter.stories.tsx @@ -0,0 +1,94 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; +import { expect, userEvent, within } from 'storybook/test'; + +import useFocus from '@contexts/focus'; +import BYOFooter from '@parts/BYOFooter'; +import { storyFrames } from '@app/stories/fixtures'; +import { withForkyProviders } from '@app/stories/storybook'; + +const meta = { + title: 'Parts/BYO Footer', + component: BYOFooter, + parameters: { + layout: 'fullscreen', + tanstack: { + router: { + path: '/byo', + }, + }, + }, + decorators: [ + withForkyProviders({ + focus: { + byo: true, + }, + }), + ], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +const alphaNodeCount = storyFrames.alpha.data.fork_choice_nodes.length; + +function BYOFooterHarness() { + const { byoData } = useFocus(); + + return ( +
+
+ + {byoData + ? `Loaded ${byoData.frame.data.fork_choice_nodes.length} nodes` + : 'No BYO data loaded'} + +
+ +
+ ); +} + +export const Idle: Story = { + render: () => , +}; + +export const Dragging: Story = { + render: () => , + play: async ({ canvasElement }) => { + canvasElement.ownerDocument.dispatchEvent( + new DragEvent('dragover', { bubbles: true, cancelable: true }), + ); + const canvas = within(canvasElement); + await expect(await canvas.findByText('Drop to view')).toBeVisible(); + }, +}; + +export const InvalidJsonUpload: Story = { + render: () => , + play: async ({ canvasElement }) => { + const input = canvasElement.querySelector('input[type="file"]'); + if (!(input instanceof HTMLInputElement)) throw new Error('File input not found'); + await userEvent.upload(input, new File(['not json'], 'fork-choice.json')); + const canvas = within(canvasElement); + await expect(await canvas.findByText('The file is not valid JSON.')).toBeVisible(); + }, +}; + +export const ValidJsonUpload: Story = { + render: () => , + play: async ({ canvasElement }) => { + const input = canvasElement.querySelector('input[type="file"]'); + if (!(input instanceof HTMLInputElement)) throw new Error('File input not found'); + await userEvent.upload( + input, + new File([JSON.stringify(storyFrames.alpha.data)], 'fork-choice.json', { + type: 'application/json', + }), + ); + const canvas = within(canvasElement); + await expect( + await canvas.findByText(new RegExp(`loaded ${alphaNodeCount} nodes`, 'i')), + ).toBeVisible(); + }, +}; diff --git a/web/src/parts/Events.stories.tsx b/web/src/parts/Events.stories.tsx new file mode 100644 index 0000000..2a550c6 --- /dev/null +++ b/web/src/parts/Events.stories.tsx @@ -0,0 +1,154 @@ +import type { Meta, StoryObj } from '@storybook/tanstack-react'; +import { expect, userEvent, within } from 'storybook/test'; + +import Events from '@parts/Events'; +import { storyApiHandlers } from '@app/stories/fixtures'; +import { withForkyProviders } from '@app/stories/storybook'; + +const meta = { + title: 'Parts/Events', + component: Events, + parameters: { + layout: 'fullscreen', + msw: { + handlers: storyApiHandlers(), + }, + }, + decorators: [withForkyProviders()], +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Closed: Story = { + parameters: { + tanstack: { + router: { + path: '/', + }, + }, + }, + render: () => ( +
+ +
+ ), +}; + +export const Populated: Story = { + parameters: { + tanstack: { + router: { + path: '/events', + }, + }, + }, + render: () => ( +
+ +
+ ), +}; + +export const NodeScoped: Story = { + parameters: { + tanstack: { + router: { + path: '/node/$nodeId/events', + params: { nodeId: 'ams3-teku-001' }, + }, + }, + }, + decorators: [ + withForkyProviders({ + focus: { + node: 'ams3-teku-001', + }, + }), + ], + render: () => ( +
+ +
+ ), +}; + +export const Empty: Story = { + parameters: { + tanstack: { + router: { + path: '/events', + }, + }, + msw: { + handlers: storyApiHandlers({ metadata: [] }), + }, + }, + render: () => ( +
+ +
+ ), +}; + +export const Loading: Story = { + tags: ['test-exclude'], + parameters: { + tanstack: { + router: { + path: '/events', + }, + }, + msw: { + handlers: storyApiHandlers({ metadataDelay: 10_000 }), + }, + }, + render: () => ( +
+ +
+ ), +}; + +export const Error: Story = { + parameters: { + tanstack: { + router: { + path: '/events', + }, + }, + msw: { + handlers: storyApiHandlers({ metadataError: true }), + }, + }, + render: () => ( +
+ +
+ ), +}; + +export const SlotFilterInteraction: Story = { + parameters: { + tanstack: { + router: { + path: '/events', + }, + }, + }, + render: () => ( +
+ +
+ ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement.ownerDocument.body); + const [slotOption] = await canvas.findAllByText('Slot'); + await userEvent.click(slotOption); + const textbox = canvas.getByRole('textbox'); + await userEvent.click(textbox); + await userEvent.type(textbox, '106{enter}'); + await expect(await canvas.findByText('event-before-reorg-1')).toBeVisible(); + }, +}; diff --git a/web/src/parts/Events.tsx b/web/src/parts/Events.tsx index 5b44d39..679d164 100644 --- a/web/src/parts/Events.tsx +++ b/web/src/parts/Events.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef, useState, useMemo } from 'react'; +import { useCallback, useState, useMemo } from 'react'; import { Dialog, @@ -18,7 +18,7 @@ import { XMarkIcon } from '@heroicons/react/24/outline'; import classNames from 'clsx'; import ReactTimeAgo from 'react-time-ago'; import Link from '@components/Link'; -import { useAppNavigate, usePathname } from '@hooks/useAppNavigation'; +import { useAppNavigate } from '@hooks/useAppNavigation'; import EditableInput from '@components/EditableInput'; import Loading from '@components/Loading'; @@ -82,7 +82,7 @@ const queryRelativeOptions = [ { id: 1000 * 60 * 60 * 7, name: 'Last 7 days' }, ]; -export default function Selection() { +export default function Events({ open, closeTo }: { open: boolean; closeTo: string }) { const [queryType, setQueryType] = useState(queryOptions[0]); const [queryRelative, setQueryRelative] = useState(queryRelativeOptions[3]); const [querySlot, setQuerySlot] = useState(''); @@ -94,13 +94,7 @@ export default function Selection() { ); const { node, stop, setTime } = useFocus(); const { slotsPerEpoch, secondsPerSlot, genesisTime } = useEthereum(); - const location = usePathname(); const setLocation = useAppNavigate(); - const isEventRoute = location.endsWith('/events'); - const previousLocation = useRef(isEventRoute ? '/' : location); - useEffect(() => { - if (!isEventRoute) previousLocation.current = location; - }, [location, isEventRoute]); // Recompute the filter at event time (in the input handlers below) rather // than reacting to state changes in an effect. @@ -136,7 +130,7 @@ export default function Selection() { node, event_source: 'xatu_reorg_event', }, - isEventRoute, + open, ); const events = useMemo< @@ -149,7 +143,7 @@ export default function Selection() { id: string; }[] >(() => { - if (!isEventRoute || !data) return []; + if (!open || !data) return []; const groupedEvents = data.reduce< Record< string, @@ -208,12 +202,12 @@ export default function Selection() { } return b.time - a.time; }); - }, [isEventRoute, data]); + }, [open, data]); return (
- setLocation(previousLocation.current)}> + setLocation(closeTo)}> : {node} - { - previousLocation.current = '/'; - }} - > + @@ -248,7 +237,7 @@ export default function Selection() {
Bring your own fork choice

w``-K9oA+toB2^TQo4Sw&5EBS! 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 +